【发布时间】:2010-10-07 09:34:57
【问题描述】:
我正在学习算法和数据结构课程中的linear congruential generator。在考虑了我们一直在使用的 RNG 实现(a=429493445,c=907633385,mod=4294967296,X 是 _uint32)之后,我想到了一件事:程序有设置种子的功能。
该函数在 C 和 C++ 中的重要性如何?
这是我的思路:一旦程序启动,操作系统就会为所有使用的变量分配地址。给种子的内存位置中的数据可以解释为一个数字。
我了解在小型计算机中,操作系统(如果有的话)可能会为种子分配多次相同的地址,但该地址中包含的数据不会每次都不同吗?除非系统在每次启动后将所有空闲 RAM 设置为某个值,否则 RAM 中包含的数据本身几乎是随机的,并且提供了足够好的种子。
即使给种子的空间中包含的数据被另一个程序使用,我看不出这会对生成器本身产生什么影响。
【问题讨论】:
-
“随机数的生成太重要了,不能靠运气”——Robert R. Coveyou
-
@pmg 对不起,我不明白你的意思。
-
@pmg:“任何考虑产生随机数字的算术方法的人当然都处于罪恶状态。” ——约翰·冯·诺依曼
-
Robert R. Coveyou 的意思是,我认为,生成好个随机数是困难的,而且机会可能仅限于计算机算法,并不是一种有效的方法。跨度>
-
@AndrejaKo:Coveyou 的俏皮话(适用于本示例)是您正在使用一些您不知道如何预测的数据,但您也不知道它到底有多随机。也许在某些系统上它实际上是非常可预测的。即使在不小的计算机上,通过虚拟寻址,您也会发现程序中的几乎所有内容每次都出现在相同的(虚拟)位置。所以,不要依靠你不完善的知识来“听天由命”——仅仅因为你个人目前无法找到预测它的方法并不意味着它是可靠的随机的。