/* package whatever; // don't place package name! */
import java.util.Arrays ;
import java.util.Random ;
import java.util.function.IntFunction ;
import java.util.stream.IntStream ;
/* Name of the class has to be "Main" only if the class is public. */
class Randomize
{
public static int [ ] generateRandAndUniq( int desiredSize) {
int [ ] arrayResult = new int [ desiredSize] ;
arrayResult[ 0 ] = rand.nextInt ( desiredSize) ;
int counter = 0 ;
while ( counter < desiredSize) {
int randValue = rand.nextInt ( desiredSize* 3 ) ; /* a larger interval! */
int [ ] tempArray= new int [ counter+ 2 ] ;
System .
arraycopy ( arrayResult,
0 , tempArray,
0 , counter
) ; tempArray[ counter+ 1 ] = randValue;
if ( ! checkDuplicate( tempArray) ) {
arrayResult[ counter] = randValue;
counter++;
}
}
return arrayResult;
}
public static boolean checkDuplicate( int [ ] arr) {
boolean [ ] bitmap = new boolean [ maxValueInArray( arr) + 1 ] ; /* just put a big number to avoid looping to get the max value? */
for ( int v : arr) {
if ( ! bitmap[ v] ) {
bitmap[ v] = true ;
} else {
return true ;
}
}
return false ;
}
public static int maxValueInArray( int [ ] arr) {
int max=- 1 ;
for ( int v: arr) {
if ( v> max)
max= v;
}
return max;
}
public static final int [ ] generateRandAndUniqRGL( int desiredSize) {
int [ ] set = IntStream.range ( 0 , desiredSize * 3 ) .toArray ( ) ;
int index = set.length ;
// Fisher-Yates.
while ( index > 1 ) {
final int pos = rand.nextInt ( index-- ) ;
final int tmp = set[ pos] ;
set[ pos] = set[ index] ;
set[ index] = tmp;
}
return Arrays .
copyOf ( set, desiredSize
) ; }
private static final void trialFn
( String name, IntFunction
< int [ ] > fn,
int input
) { long nanos
= System .
nanoTime ( ) ; int [ ] data = fn.apply ( input) ;
long time
= System .
nanoTime ( ) - nanos
; System .
out .
printf ( "%s function for %d input took %6.3fms\n " , name, input, time
/ 1000000.0 ) ; }
public static void main
( String [ ] args
) { // warm up:
trialFn( "OPWarm" , Randomize:: generateRandAndUniq, 1000 ) ;
trialFn( "RLWarm" , Randomize:: generateRandAndUniqRGL, 1000 ) ;
for ( int input : new int [ ] { 10 , 100 , 1000 , 10000 } ) {
trialFn( "OP" , Randomize:: generateRandAndUniq, input) ;
trialFn( "RL" , Randomize:: generateRandAndUniqRGL, input) ;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkludEZ1bmN0aW9uOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgUmFuZG9taXplCnsKICAgIAogICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZW5lcmF0ZVJhbmRBbmRVbmlxKGludCBkZXNpcmVkU2l6ZSkgewogICAgICAgIGludFtdIGFycmF5UmVzdWx0ID0gbmV3IGludFtkZXNpcmVkU2l6ZV07CiAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgYXJyYXlSZXN1bHRbMF09IHJhbmQubmV4dEludChkZXNpcmVkU2l6ZSk7CiAgICAgICAgaW50IGNvdW50ZXIgPSAwOwogICAgICAgIHdoaWxlIChjb3VudGVyIDwgZGVzaXJlZFNpemUpIHsKICAgICAgICAgICAgaW50IHJhbmRWYWx1ZSA9IHJhbmQubmV4dEludChkZXNpcmVkU2l6ZSozKTsvKiBhIGxhcmdlciBpbnRlcnZhbCEgKi8KICAgICAgICAgICAgaW50W10gdGVtcEFycmF5PSBuZXcgaW50W2NvdW50ZXIrMl07CiAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXlSZXN1bHQsIDAsIHRlbXBBcnJheSwwLCBjb3VudGVyKTsKICAgICAgICAgICAgdGVtcEFycmF5W2NvdW50ZXIrMV09cmFuZFZhbHVlOwogICAgICAgICAgICBpZighY2hlY2tEdXBsaWNhdGUodGVtcEFycmF5KSl7CiAgICAgICAgICAgICAgICBhcnJheVJlc3VsdFtjb3VudGVyXT1yYW5kVmFsdWU7CiAgICAgICAgICAgICAgICBjb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5UmVzdWx0OwogICAgfSAgICAKCiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tEdXBsaWNhdGUoaW50W10gYXJyKSB7CiAgICAgICAgYm9vbGVhbltdIGJpdG1hcCA9IG5ldyBib29sZWFuW21heFZhbHVlSW5BcnJheShhcnIpKzFdOyAvKiBqdXN0IHB1dCBhIGJpZyBudW1iZXIgdG8gYXZvaWQgbG9vcGluZyB0byBnZXQgdGhlIG1heCB2YWx1ZT8gKi8KICAgICAgICBmb3IgKGludCB2IDogYXJyKSB7CiAgICAgICAgICAgIGlmICghYml0bWFwW3ZdKSB7CiAgICAgICAgICAgICAgICBiaXRtYXBbdl0gPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKCiAgICBwdWJsaWMgc3RhdGljIGludCBtYXhWYWx1ZUluQXJyYXkoaW50W10gYXJyKXsKICAgICAgICBpbnQgbWF4PS0xOwogICAgICAgIGZvcihpbnQgdjphcnIpewogICAgICAgICAgICBpZih2Pm1heCkKICAgICAgICAgICAgICAgIG1heD12OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF4OwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdlbmVyYXRlUmFuZEFuZFVuaXFSR0woaW50IGRlc2lyZWRTaXplKSB7CiAgICAgICAgaW50W10gc2V0ID0gSW50U3RyZWFtLnJhbmdlKDAsICBkZXNpcmVkU2l6ZSAqIDMpLnRvQXJyYXkoKTsKICAgICAgICBpbnQgaW5kZXggPSBzZXQubGVuZ3RoOwogICAgICAgIC8vIEZpc2hlci1ZYXRlcy4KICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKICAgICAgICB3aGlsZSAoaW5kZXggPiAxKSB7CiAgICAgICAgICAgIGZpbmFsIGludCBwb3MgPSByYW5kLm5leHRJbnQoaW5kZXgtLSk7CiAgICAgICAgICAgIGZpbmFsIGludCB0bXAgPSBzZXRbcG9zXTsKICAgICAgICAgICAgc2V0W3Bvc10gPSBzZXRbaW5kZXhdOwogICAgICAgICAgICBzZXRbaW5kZXhdID0gdG1wOwogICAgICAgIH0gICAgICAgIAogICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKHNldCwgZGVzaXJlZFNpemUpOwogICAgfQogICAgCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHRyaWFsRm4oU3RyaW5nIG5hbWUsIEludEZ1bmN0aW9uPGludFtdPiBmbiwgaW50IGlucHV0KSB7CiAgICAgICAgbG9uZyBuYW5vcyA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgIGludFtdIGRhdGEgPSBmbi5hcHBseShpbnB1dCk7CiAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBuYW5vczsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJXMgZnVuY3Rpb24gZm9yICVkIGlucHV0IHRvb2sgJTYuM2Ztc1xuIiwgbmFtZSwgaW5wdXQsIHRpbWUgLyAxMDAwMDAwLjApOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAJLy8gd2FybSB1cDoKICAgICAgICB0cmlhbEZuKCJPUFdhcm0iLCBSYW5kb21pemU6OmdlbmVyYXRlUmFuZEFuZFVuaXEsIDEwMDApOwogICAgICAgIHRyaWFsRm4oIlJMV2FybSIsIFJhbmRvbWl6ZTo6Z2VuZXJhdGVSYW5kQW5kVW5pcVJHTCwgMTAwMCk7CiAgICAJCiAgICAgICAgZm9yIChpbnQgaW5wdXQgOiBuZXcgaW50W117MTAsIDEwMCwgMTAwMCwgMTAwMDB9KSB7CiAgICAgICAgICAgIHRyaWFsRm4oIk9QIiwgUmFuZG9taXplOjpnZW5lcmF0ZVJhbmRBbmRVbmlxLCBpbnB1dCk7CiAgICAgICAgICAgIHRyaWFsRm4oIlJMIiwgUmFuZG9taXplOjpnZW5lcmF0ZVJhbmRBbmRVbmlxUkdMLCBpbnB1dCk7CiAgICAgICAgfQogICAgfQp9