📄 random.java
字号:
package DataStructures;
// Random class
//
// CONSTRUCTION: with (a) no initializer or (b) an integer
// that specifies the initial state of the generator
//
// ******************PUBLIC OPERATIONS*********************
// Return a random number according to some distribution:
// int randomInt( ) --> Uniform, 1 to 2^31-1
// int random0_1( ) --> Uniform, 0 to 1
// int randomInt( int low, int high ) --> Uniform low..high
// long randomLong( long low, long high ) --> Uniform low..high
// void permute( Object [ ] a ) --> Randomly permutate
/**
* Random number class, using a 31-bit
* linear congruential generator.
* Note that java.util contains a class Random,
* so watch out for name conflicts.
* @author Mark Allen Weiss
*/
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;
/**
* Construct this Random object with
* initial state obtained from system clock.
*/
public Random( )
{
this( (int) ( System.currentTimeMillis( ) % Integer.MAX_VALUE ) );
}
/**
* Construct this Random object with
* specified initial state.
* @param initialValue the initial state.
*/
public Random( int initialValue )
{
if( initialValue < 0 )
initialValue += M;
state = initialValue;
if( state == 0 )
state = 1;
}
/**
* Return a pseudorandom int, and change the
* internal state.
* @return the pseudorandom int.
*/
public int randomInt( )
{
int tmpState = A * ( state % Q ) - R * ( state / Q );
if( tmpState >= 0 )
state = tmpState;
else
state = tmpState + M;
return state;
}
/**
* Return a pseudorandom int, and change the
* internal state. DOES NOT WORK.
* @return the pseudorandom int.
*/
public int randomIntWRONG( )
{
return state = ( A * state ) % M;
}
/**
* Return a pseudorandom double in the open range 0..1
* and change the internal state.
* @return the pseudorandom double.
*/
public double random0_1( )
{
return (double) randomInt( ) / M;
}
/**
* Return an int in the closed range [low,high], and
* change the internal state.
* @param low the minimum value returned.
* @param high the maximum value returned.
* @return the pseudorandom int.
*/
public int randomInt( int low, int high )
{
double partitionSize = (double) M / ( high - low + 1 );
return (int) ( randomInt( ) / partitionSize ) + low;
}
/**
* Return an long in the closed range [low,high], and
* change the internal state.
* @param low the minimum value returned.
* @param high the maximum value returned.
* @return the pseudorandom long.
*/
public long randomLong( long low, long high )
{
long longVal = ( (long) randomInt( ) << 31 ) + randomInt( );
long longM = ( (long) M << 31 ) + M;
double partitionSize = (double) longM / ( high - low + 1 );
return (long) ( longVal / partitionSize ) + low;
}
/**
* Randomly rearrange an array.
* The random numbers used depend on the time and day.
* @param a the array.
*/
public static final void permute( Object [ ] a )
{
Random r = new Random( );
for( int j = 1; j < a.length; j++ )
Sort.swapReferences( a, j, r.randomInt( 0, j ) );
}
private int state;
// Test program
public static void main( String [ ] args )
{
Random r = new Random( 1 );
for( int i = 0; i < 20; i++ )
System.out.println( r.randomInt( ) );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -