请问:
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)
换句话说:如果他们的随机种子相似,我是否有可能从随机生成器获得类似的一系列整数?
答案 0 :(得分:4)
不,类似的种子不会产生类似的随机数 只有相同的种子会产生相同的数字。
设置种子的代码是:
void setSeed(long seed) {
this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
..}
此公式避免this.seed
获取输入种子值的相似值(在构造函数中使用,或通过setSeed()。
然而,有一些弱点,als解释说 http://dontpanic.42.nl/2011/03/when-random-isn-as-random-as-expected.html
答案 1 :(得分:1)
用于生成伪随机数的状态更新是chaotic。因此,使用相邻的种子值会导致完全不同的状态轨迹。
答案 2 :(得分:0)
随机数永远不会随机。它们是完全预定义的,并且给定相同的种子将始终产生相同的数字,甚至超过一百万次不同的命令运行,这就是它们被称为"Pseudorandom"的原因。最好的方法是使用每次运行程序时不同的值进行种子处理,并且无法轻松预测,例如当前时间和日期和/或已经过的时钟周期数。