随机数生成器
public class Random { private static final int A=48271; private static final int M=2147483647; private static final int Q=M/A; private static final int R=M%A; public Random() { this((int)(System.currentTimeMillis()%Integer.MAX_VALUE)); } /*CONSTRUCT this b Random object with specified inital state * */ public Random(int initialValue) { if(initialValue<0) initialValue+=M; state=initialValue; if(state==0) state=1; } public int nextInt() { int tmpState=A*(state%Q)-R*(state/Q); if(tmpState>=0) state=tmpState; else state=tmpState+M; return state; } public int nextIntWRONG( ) { return state = ( A * state ) % M; } public double nextDouble() { return (double)nextInt( )/ M; } public long nextLong( ) { return ( (long) nextInt( ) << 31 ) + nextInt( ); } public int nextInt(int low,int high) { double partitionSize = (double) M / ( high - low + 1 ); return (int) ( nextInt( ) / partitionSize ) + low; } public int nextPoissson(double excepctedValue) //服从泊松分布的随机数的产生 { double limit=-excepctedValue; double product =Math.log(nextDouble()); int count; for(count=0;product>limit;count++) product+=Math.log(nextDouble()); return count; } public double nextNegExp(double exceptedValue) //服从负指数分布的随机数的产生,负指数=分布具有相同的均值和方差,用于刻画随机事件发生的时间间隔 { return -exceptedValue*Math.log(nextDouble()); } public static final <AnyType> void permute( AnyType [ ] a ) { Random r = new Random( ); for( int j = 1; j < a.length; j++ ) swapReferences( a, j, r.nextInt( 0, j ) ); } private static final <AnyType> void swapReferences( AnyType [ ] a, int index1, int index2 ) { AnyType tmp = a[ index1 ]; a[ index1 ] = a[ index2 ]; a[ index2 ] = tmp; } private int state; // Test program public static void main( String [ ] args ) { Random r = new Random( ); for( int i = 0; i < 20; i++ ) System.out.println( r.nextInt( ) ); int [ ] dist = new int[ 10000 ]; final int SAMPLES = 1000000; for( int i = 0; i < SAMPLES; i++ ) dist[ r.nextPoissson( 2 ) ]++; for( int i = 0; i < 10; i++ ) System.out.println( i + ": " + dist[ i ] / (double) SAMPLES ); } }