随记:真伪随机数

在Java中,可以通过 Random 构造一个对象,用于生成随机数。在构造方法中,可以传入一个 long 类型的 seed 参数作为“种子”,内部会基于这个“种子”来生成随机数,代码如下:

long seed = System.currentTimeMillis();
Random random = new Random(seed);
random.nextInt();  // 生成一个随机int值

但这个随机数,我们称为“伪随机数”。因为它并不是真正的随机,当使用相同的seed值作为“种子”时,生成的随机数是相同的。

long seed = System.currentTimeMillis();

Random random1 = new Random(seed);
for (int index = 0; index < 50; index++) {
  System.out.print(random1.nextInt());
}
System.out.println();

Random random2 = new Random(seed);
for (int index = 0; index < 50; index++) {
  System.out.print(random2.nextInt());
}
System.out.println();

/*
 * 输出结果:
 * 160381176-2130136661175733218645511071013445856-2649570262070834922197287605011495374181395992301742196957604888763-1664128525-4387463071575126788544281673-1978934197-17478414414992879504006634711347416992-6905444071757998683-40575115517377453721616711845-2121976042-1867765071-1663032591537229800-865497975-1935567649-10651754701778938534-90333922119652269659945343081536553509-19335073301408435080-600459083483683295306371735203382964-7872761161500755116174382462-927712109-451515262-475621856
 * 160381176-2130136661175733218645511071013445856-2649570262070834922197287605011495374181395992301742196957604888763-1664128525-4387463071575126788544281673-1978934197-17478414414992879504006634711347416992-6905444071757998683-40575115517377453721616711845-2121976042-1867765071-1663032591537229800-865497975-1935567649-10651754701778938534-90333922119652269659945343081536553509-19335073301408435080-600459083483683295306371735203382964-7872761161500755116174382462-927712109-451515262-475621856
 */

换句话说,就是随机数的生成是有规律可循的。显而易见,固定的算法、固定的种子值,当然会得到相同的结果,而这个“固定的算法”就是随机数的“生成规律”。

 

那么,存在真随机数吗?

 

记得曾经看过一种生成“真随机数”的算法,它不是使用一个值作为seed,而是采用一些硬件设备输入数据,例如键盘的输入或鼠标的点击数据,作为seed,来生成随机数。由于键盘输入和鼠标点击存在随机性,所以,生成的随机数则视为真随机数。但是,这只是将问题转化为“键盘输入和鼠标点击”是否真随机问题,并未从根本上证明生成的就是“真随机数”。

 

那么,“键盘输入和鼠标点击”是真随机吗?或者说,键盘输入和鼠标点击是否完全随机、完全无规律呢?包括一些其它的通过硬件生成随机数的办法,是否是“真随机数”呢?最终,可以发现,真伪随机数问题的等价命题就是:这个世界是否存在真随机

 

个人认为,不存在“真随机”。在特定背景、限定的时间、限定的空间下,我们可能会觉得存在真随机,但这只是因为我们还未发现其规律。也许,是我们的知识体系,还不能够解释某些现象;或者,是现有的时间和空间,还不足以让我们发现其规律。

 

再回到我们程序员的小世界里,当我们需要一个“真随机数”的时候,应该怎么办呢?个人认为,只要生成随机数的方法,对于要解决的问题而言,在限定的时间和空间内,不足以发现其规律性,或其规律性不足以影响最终效果,那么,就可以将其视为“真随机数”。毕竟,若追求真正的“真随机”,可能需要先解决更大的命题:这个世界是否存在真随机

 

个人随记,纯属瞎想,大佬轻怼~~

你可能感兴趣的:(Thinking)