Seed a random number generator with a real random number to get real random numbers?
这是一个一般性问题,并不是特定于编程语言。
如果我使用随机数生成器(例如,在Java中使用EDCOX1,0),这些数字不是真的随机的。一种常见的做法是用本地系统时间对数字进行种子设定,以便在每次执行程序时获得随机数。
现在,如果你用一个真正的随机数(例如从random.org)来种子,该怎么办?你得到的数字也是真随机数吗?
不。
把单个数字称为"随机"或"非随机"是没有意义的。它是一个随机序列,或者不是随机序列。无论您如何设定一个prng,序列都是确定的,因此不是真正随机的。
然而,这是为不需要密码安全(如模拟和蒙特卡洛集成)的应用而设定PRNG的最佳方法,因此这是一个非常好的实践。理想情况下,您希望在prng中植入与prng内部状态大小相同的真正随机位。
答案是否定的,产生的序列不会比生成器能够产生的任何其他序列更随机。
伪随机数生成器根据某种内部状态在算法上生成一个值序列。最终(这对于一个好的prng来说可能是很长的时间!)生成器将以它以前访问过的状态结束,因为状态的数量是有限的。从那一点开始的每件事情都将以相同的方式重复,因为当通过确定性算法进行拖动时,每个状态都不可避免地会导致相同的后续状态。换言之,prng都会产生一系列最终循环的值。Java的PRNG循环大约248次迭代。Mersenne Twister的循环长度约为219937—在您的有生之年,您将永远不会循环使用它的整个状态空间,但它仍在生成确定的值序列。
虽然从prng到prng的细节各不相同,但播种用于确定初始状态。选择一个真正的随机种子值意味着你在一个随机选择的点上进入了确定性循环,但是从那一点向前它仍然是一个确定性序列。
Will the numbers you get be real random numbers too?
号
不
每次运行都会得到不可重复的序列,就是这样。
没有种子可以纠正伪随机RNG缺陷。假设您使用线性同余生成器。众所周知,由LCG采样的高维点将在某些平面之间对齐。不管你如何播种这种lcg,它仍然会表现出这种行为。
参见https://en.wikipedia.org/wiki/linear_concurrential_generator,右侧第二张图片了解LCG超平面效果
通过伪随机数生成器,根据定义,下一个数字可以从前一个数字预测出来。这就是伪随机的含义:数字是确定性序列的一部分,它们不是真正随机的。如果你用一个真正的随机数来输入prng——这当然是个好主意——你每次都会得到prng序列的不同部分,但是你得到的数字仍然是伪随机的,而不是真正随机的。
[另一方面,当我说"下一个数字可以从前一个数字中预测"时,这是一个简化;正如Lee Crocker指出的,实际上是发电机的内部状态预测下一个输出。]