使用时间作为随机数生成器的种子还有哪些问题?

9
我知道时间作为随机数生成的不安全种子,因为它有效地减少了种子空间的大小
但是假设我不关心安全性。例如,假设我正在为纸牌游戏进行蒙特卡罗模拟。然而,我确实关心尽可能接近真正的随机性。时间作为种子会影响输出的随机性吗?在这种情况下,我认为PRNG的选择比种子更重要。
4个回答

5

出于安全目的,您显然需要高熵种子。但是仅靠时间是无法提供这种种子的。

为了模拟目的,种子的质量并不太重要,只要它是唯一的即可。正如您所指出的,这里更重要的是PRNG的质量。
甚至在游戏中,PRNG可能也需要保密。例如,在多人游戏中,玩家可能会发现PRNG的内部状态并使用它来预测未来的随机事件、猜测对手的牌、获得更好的战利品等。

使用时间作为PRNG种子的一个常见陷阱是,时间不经常改变。例如,在Windows上,大多数与时间相关的函数每几毫秒才会更改其返回值。因此,在该时间段内创建的所有PRNG都将返回相同的序列。


关于在相同时间粒度内生成的数字的观点非常好。 - pepsi

4

为了完整起见,Matsumoto等人的这篇论文很好地说明了初始化方案(即选择种子的方式)对模拟的重要性。结果表明,一个糟糕的初始化方案可能会严重影响结果,尽管RNG算法本身原则上是相当不错的。


3

如果您只运行一个程序实例,那么应该不会有太多问题。

然而,我见过一些人同时启动多个程序,然后每个程序都使用时间作为种子。在这种情况下,所有程序都会得到相同的随机数序列--特别是我见过有人在每次调用时将apache进程种子化为一个随机数字作为会话ID,结果发现在同时访问web服务器的不同用户获得完全相同的ID。

因此,如果您希望运行多个程序的同时版本,则使用时间是一个非常糟糕的想法。


1

假设你的程序运行非常快,并要求使用系统时间作为种子来生成一系列随机数,间隔非常短。你可能会得到相同的时间作为答案,因此最终会生成相同的随机数。因此,即使在模拟中,低熵也可能成为问题。

考虑到在系统中有其他一些熵源并不难,或者您的操作系统甚至可以提供一些几乎随机的数字,您可以使用它们来增加基于时间的种子的熵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接