随机数生成器

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 );    
}
}

  

posted @ 2016-04-19 23:07  凡尔纳计划  阅读(640)  评论(0编辑  收藏  举报