2016-01-20 71 views
4

请问这样:随机种子之间的差异很重要吗?

new java.util.Random(/* random seed */ 0) 
new java.util.Random(/* random seed */ 1) 

结果在某种程度上“随机的” /“更类似于”随机生成比这个?

new java.util.Random(/* random seed */ 0) 
new java.util.Random(/* random seed */ 1000) 

换句话说:如果他们的随机种子是相似的,我是否有从随机生成器中获得的类似系列的整数?

+5

这不是“更少”或“更多”随机。它只是不同的随机。 –

+4

你应该真的给[java.util.Random的好处](http://stackoverflow.com/questions/453479/how-good-is-java-util-random)读取。它讨论了Random类的优点(没有弱种子)和弱点(实际上并非全部是随机的)。 – azurefrog

回答

4

不,类似的种子不会产生相似的随机数。
只有相同的种子会产生相同的数字。

设置种子的代码是:

void setSeed(long seed) { 
    this.seed = (seed^0x5DEECE66DL) & ((1L << 48) - 1); 
..} 

此公式避免了this.seed得到simlar值对输入的种子值(在构造函数中使用,或通过过setSeed()

然而那里。是一些弱点,ALS在 http://dontpanic.42.nl/2011/03/when-random-isn-as-random-as-expected.html

1

用于产生伪随机数的状态更新解释是chaotic。因此,使用在完全二相邻的种子值的结果不同的状态轨迹。

0

随机数从来都不是随机的。它们是完全预定义的,并且给定相同的种子总是会产生相同的数字,即使是超过一百万次不同的命令运行,也就是它们被称为"Pseudorandom"的原因。最好的办法是在每次程序运行时使用不同的值,例如当前的时间和日期以及/或者已经过的时钟周期数等,这些值是不容易预测的。

+2

这不是问题。他想知道两个相邻的种子是否会产生相似的随机数。 – AlexWien

+0

我解释说他们从不产生随机数字。这确实是对这个问题的回答。 –

+2

不是不是。你需要解释输入种子对两个相邻种子的影响,以及它们对输出随机数的影响。 – AlexWien