这是一般性问题,并非特定于编程语言。
如果我使用随机数生成器(例如Java中的Math.Random()
),则数字不是真正随机的。通常的做法是使用本地系统时间对数字进行播种,以便在每次执行程序时获得随机数。
现在如果你使用一个非常随机的数字播种(例如来自random.org)。 你得到的数字也是真正的随机数吗?
答案 0 :(得分:1)
你得到的数字也是真正的随机数吗?
没有
每次运行都会得到不可重复的序列,就是它
任何播种都无法纠正伪随机RNG缺陷。假设您使用线性同余生成器。众所周知,LCG采样的较高尺寸点将在某些平面之间对齐。无论你如何播种这种LCG,它仍然会表现出这样的行为
参见https://en.wikipedia.org/wiki/Linear_congruential_generator,右边的第二张图片,用于说明LCG超平面效应
答案 1 :(得分:1)
答案是否定的,结果序列不会比生成器能够产生的任何其他序列更随机。
伪随机数生成器基于某种内部状态在算法上生成一系列值。最终(对于一个好的PRNG可能是一个很长的时间!),由于存在有限数量的状态,因此发生器将最终处于它之前访问过的状态。从那一点开始的所有事情都将重复相同,因为当通过确定性算法进行调整时,每个状态将不可避免地导致相同的后续状态。换句话说,PRNG都产生一系列最终循环的值。 Java的PRNG在大约2次 48 次迭代中循环。 Mersenne Twister的周期长度大约为2 19937 - 你终生不会在整个状态空间中循环,但它仍然会产生一个确定的值序列。
虽然细节从PRNG到PRNG不等,但播种用于确定初始状态。选择一个真正随机的种子值意味着你在一个随机选择的点上进入确定性循环,但从那一点起它仍然是一个确定性的序列。
答案 2 :(得分:1)
没有
将个别数字称为“随机”或无意义是没有意义的。 序列是随机的还是非随机的。无论你如何播种PRNG,序列都是确定性的,因此不是真正随机的。
然而,这是为不需要加密安全性(如模拟和蒙特卡罗集成)的用途播种PRNG的最佳方式,因此这是一种非常好的做法。理想情况下,您希望为PRNG提供与PRNG内部状态大小一样多的真正随机位。
答案 3 :(得分:0)
使用伪随机数生成器,根据定义,可以从先前的数字预测下一个数字。这就是伪随机意味着:数字是确定性序列的一部分,它们不真正随机。如果你用一个真正随机的数字为PRNG播种 - 这当然是个好主意 - 你每次都会获得PRNG序列的不同部分,但你得到的数字仍然是伪随机的,而不是真正随机的。
[P.S。当我说“下一个数字可以从以前的数字预测”时,这是一个简化;正如Lee Crocker所指出的那样,它实际上是发电机的内部状态,可以预测下一个输出。]