import java.util.Random ;
import java.lang.System ;
class ShuffleTest {
private static abstract class Generator {
public abstract String generate
( ) ; }
private static final class GeneratorRolfl extends Generator {
private final char [ ] digits = "0123456789" .toCharArray ( ) ;
public final String generate
( ) { int index = digits.length ;
// Fisher-Yates.
while ( index > 1 ) {
final int pos = rand.nextInt ( index-- ) ;
final char tmp = digits[ pos] ;
digits[ pos] = digits[ index] ;
digits[ index] = tmp;
}
}
}
private static final class GeneratorIlmari extends Generator {
private final char [ ] digits = new char [ 10 ] ;
public final String generate
( ) { digits[ 0 ] = '0' ;
for ( int index = 1 ; index < digits.length ; index++ ) {
final int pos = rand.nextInt ( index + 1 ) ;
digits[ index] = digits[ pos] ;
digits[ pos] = ( char ) ( '0' + index) ;
}
}
}
public static void main
( String args
[ ] ) { Generator generators[ ] = { new GeneratorRolfl( ) , new GeneratorIlmari( ) } ;
int iterations = 1000000 , burnin = 10000 ;
if ( args.length > 0 ) {
iterations
= Integer .
parseInt ( args
[ 0 ] ) ; }
if ( args.length > 1 ) {
burnin
= Integer .
parseInt ( args
[ 1 ] ) ; }
for ( Generator gen: generators) {
System .
out .
println ( "Burning in " + gen.
getClass ( ) .
getName ( ) + " for " + burnin
+ " iterations..." ) ; for ( int i = 0 ; i < burnin; i++ ) {
gen.generate ( ) ;
}
System .
out .
println ( "Benchmarking " + gen.
getClass ( ) .
getName ( ) + " for " + iterations
+ " iterations..." ) ; for ( int i = 0 ; i < iterations; i++ ) {
gen.generate ( ) ;
}
System .
out .
println ( "Elapsed time: " + ( t1
- t0
) * 1.0e
- 9
+ " seconds" ) ; }
}
}
aW1wb3J0IGphdmEudXRpbC5SYW5kb207CmltcG9ydCBqYXZhLmxhbmcuU3lzdGVtOwoKY2xhc3MgU2h1ZmZsZVRlc3QgewogICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yIHsKICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdlbmVyYXRlKCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhdG9yUm9sZmwgZXh0ZW5kcyBHZW5lcmF0b3IgewogICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gZGlnaXRzID0gIjAxMjM0NTY3ODkiLnRvQ2hhckFycmF5KCk7CiAgICAgICAgCiAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZW5lcmF0ZSgpIHsKICAgICAgICAgICAgaW50IGluZGV4ID0gZGlnaXRzLmxlbmd0aDsKICAgICAgICAgICAgLy8gRmlzaGVyLVlhdGVzLgogICAgICAgICAgICB3aGlsZSAoaW5kZXggPiAxKSB7CiAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zID0gcmFuZC5uZXh0SW50KGluZGV4LS0pOwogICAgICAgICAgICAgICAgZmluYWwgY2hhciB0bXAgPSBkaWdpdHNbcG9zXTsKICAgICAgICAgICAgICAgIGRpZ2l0c1twb3NdID0gZGlnaXRzW2luZGV4XTsKICAgICAgICAgICAgICAgIGRpZ2l0c1tpbmRleF0gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGlnaXRzKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhdG9ySWxtYXJpIGV4dGVuZHMgR2VuZXJhdG9yIHsKICAgICAgICBwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwogICAgICAgIHByaXZhdGUgZmluYWwgY2hhcltdIGRpZ2l0cyA9IG5ldyBjaGFyWzEwXTsKCiAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZW5lcmF0ZSgpIHsKICAgICAgICAgICAgZGlnaXRzWzBdID0gJzAnOwogICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDE7IGluZGV4IDwgZGlnaXRzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgZmluYWwgaW50IHBvcyA9IHJhbmQubmV4dEludChpbmRleCArIDEpOwogICAgICAgICAgICAgICAgZGlnaXRzW2luZGV4XSA9IGRpZ2l0c1twb3NdOwogICAgICAgICAgICAgICAgZGlnaXRzW3Bvc10gPSAoY2hhcikgKCcwJyArIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkaWdpdHMpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3NbXSkgewogICAgICAgIEdlbmVyYXRvciBnZW5lcmF0b3JzW10gPSB7IG5ldyBHZW5lcmF0b3JSb2xmbCgpLCBuZXcgR2VuZXJhdG9ySWxtYXJpKCkgfTsKICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IDEwMDAwMDAsIGJ1cm5pbiA9IDEwMDAwOwoKICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KCBhcmdzWzBdICk7CiAgICAgICAgfQogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgYnVybmluID0gSW50ZWdlci5wYXJzZUludCggYXJnc1sxXSApOwogICAgICAgIH0KCiAgICAgICAgZm9yIChHZW5lcmF0b3IgZ2VuOiBnZW5lcmF0b3JzKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVybmluZyBpbiAiICsgZ2VuLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3IgIiArIGJ1cm5pbiArICIgaXRlcmF0aW9ucy4uLiIpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1cm5pbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBnZW4uZ2VuZXJhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJlbmNobWFya2luZyAiICsgZ2VuLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3IgIiArIGl0ZXJhdGlvbnMgKyAiIGl0ZXJhdGlvbnMuLi4iKTsKICAgICAgICAgICAgbG9uZyB0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewogICAgICAgICAgICAgICAgZ2VuLmdlbmVyYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9uZyB0MSA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVsYXBzZWQgdGltZTogIiArICh0MSAtIHQwKSAqIDEuMGUtOSArICIgc2Vjb25kcyIpOwogICAgICAgIH0KICAgIH0KfQ==