在用Random时构造随机数时,实际上,它们都不是真正的随机数,称为“伪随机数”,即是,产生的数据虽然分布上是随机的,但每次产生的随机数都是同样的排列,如果起始计算点(下面的startPoint)是一样的,那么每次产生的数列就一模一样,这显然就不是什么随机了。
Java.util.Random的构造函数有:
Random(long startPoint)以startPoint为起点进行伪随机算法,若两个Random实例的startPoint一样则生产的数字序列是相同的。
Random()以当前时间为起点(startPoint),”startPoint”自然不一样,生产的随机序列也不一样。
实验:
1、 构造函数Random(long startPoint)
(1)一样的startPoint
例1:
import java.util.Random;
import java.lang.Math;
public class TestRandom2{
TestRandom2(){
Random r2=new Random(10);//startPoint都是10,产生的随机序列是一样的。
Random r4=new Random(10);
System.out.println("Test for two object construted by Random(long startPoint)");
for(int i=0;i<5;i++){
System.out.println("r4."+i+"-->"+r4.nextDouble());
System.out.println("r2."+i+"-->"+r2.nextDouble());
}
}
public static void main(String args[]){
new TestRandom2();
}
}
运行效果:
F:\>java TestRandom2
Test for two object construted by Random(long startPoint)
r4.0-->0.7304302967434272
r2.0-->0.7304302967434272
r4.1-->0.2578027905957804
r2.1-->0.2578027905957804
r4.2-->0.059201965811244595
r2.2-->0.059201965811244595
r4.3-->0.24411725056425315
r2.3-->0.24411725056425315
r4.4-->0.8188090228552316
r2.4-->0.8188090228552316
两实例产生相同的随机序列!
(2)不一样的startPoint
把例1源代码中的绿蓝色部分代码替换为
Random r2=new Random(10);
Random r4=new Random(5);
运行结果:
F:\>java TestRandom4
Test for two object construted by Random(long startPoint)
r4.0-->0.730519863614471
r2.0-->0.7304302967434272
r4.1-->0.08825840967622589
r2.1-->0.2578027905957804
r4.2-->0.4889045498516358
r2.2-->0.059201965811244595
r4.3-->0.461837214623537
r2.3-->0.24411725056425315
r4.4-->0.4485983912283127
r2.4-->0.8188090228552316
结论:两个不一样的startPoint产生不一样的随机序列
(3)相同的startPoint产生固定的随机序列
相同的的startPoint 总是产生固定的序列,例如,同样的Random(10)构造的实例,它们各自分别产生3个和2个数的随机序列,各自产生的随机序列中前两个数总是一样的。
import java.util.Random;
public class TestRandom5{
TestRandom5(){
//构造相同startPoint的实例r2和r4
Random r2=new Random(10);
Random r4=new Random(10);
System.out.println("Test for two object construted by Random(10)");
//对象r2产生一个带三个数字的随机序列
for(int i=0;i<3;i++){
System.out.println("r2."+i+"-->"+r2.nextDouble());
}
//对象r4产生一个带两个数字的随机序列
for(int i=0;i<2;i++){
System.out.println("r4."+i+"-->"+r4.nextDouble());
}
}
public static void main(String args[]){
new TestRandom5();
}
}
运行结果
F:\>java TestRandom5
Test for two object construted by Random(10)
r2.0-->0.7304302967434272
r2.1-->0.2578027905957804
r2.2-->0.059201965811244595
r4.0-->0.7304302967434272
r4.1-->0.2578027905957804
结论:相同startPoint的两个或多个实例产生的随机序列是固定的。
2 构造函数Random( )
把例1源代码中的绿蓝色部分代码替换为
Random r2=new Random();
Random r4=new Random();
运行实验:
F:\>java TestRandom3
Test for two object construted by Random()
r4.0-->0.9182372301609016
r2.0-->0.7108707135135897
r4.1-->0.4435432300143306
r2.1-->0.43520318434166494
r4.2-->0.7599526617301469
r2.2-->0.9189473019792145
r4.3-->0.1508594716036089
r2.3-->0.4974287648682032
r4.4-->0.2839425507078355
r2.4-->0.9662859140404803
结论:两实例产生相同的不一样的随机序列!