一个比较细的非专题性的东西——随机数

在用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

结论:两实例产生相同的不一样的随机序列!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值