我知道时间对于随机数生成来说是一个不安全的种子,因为它有效地减小了种子空间的大小。
但是说我不关心安全。例如,假设我正在为纸牌游戏进行蒙特卡洛模拟。但是,我确实关心尽可能接近真正的随机性。时间作为种子会影响我输出的随机性吗?在这种情况下,我认为 PRNG 的选择比种子更重要。
我知道时间对于随机数生成来说是一个不安全的种子,因为它有效地减小了种子空间的大小。
但是说我不关心安全。例如,假设我正在为纸牌游戏进行蒙特卡洛模拟。但是,我确实关心尽可能接近真正的随机性。时间作为种子会影响我输出的随机性吗?在这种情况下,我认为 PRNG 的选择比种子更重要。
出于安全目的,您显然需要高熵种子。光靠时间是无法做到这一点的。
出于模拟目的,种子的质量并不重要,只要它是独一无二的。正如您所指出的,PRNG 的质量在这里更为重要。
即使是游戏中的 PRNG 也可能需要安全。例如,在多人游戏中,玩家可能会发现 PRNG 的内部状态,并使用它来预测未来的随机事件、猜测对手牌、获得更好的战利品……
使用时间播种 PRNG 的一个常见缺陷是时间不会经常变化。例如,在 Windows 上,大多数时间相关函数仅每隔几毫秒更改一次返回值。因此,在该间隔内创建的所有 PRNG 都将返回相同的序列。
只是为了完整起见, Matsumoto 等人的这篇论文。很好地说明了初始化方案(即选择种子的方式)对于模拟的重要性。结果表明,一个糟糕的初始化方案可能会严重影响结果,尽管 RNG 算法本身在原则上是相当好的。
如果您只是运行程序的单个实例,那么应该不会有太多问题。
但是,我见过有人同时启动多个程序,然后每个程序都随着时间的推移而播种。在这种情况下,所有程序都会获得相同的随机数序列——特别是我看到人们在每次调用时都在 apache 进程中播种以使用随机数作为 session-id,结果却发现不同的人同时访问网络服务器时间得到完全相同的ID。
因此,如果您希望同时运行多个版本的程序,那么使用时间是一个非常糟糕的主意。
认为您的程序运行得非常快,并要求系统的时间以很长的顺序用作种子,间隔很少。您可以获得与答案相同的时间,因此最终会生成相同的随机数。因此,即使在模拟中,低熵也可能是一个问题。
考虑到在您的系统中拥有一些其他熵源并不难,甚至您的操作系统也可以为您提供一些几乎随机的数字,您可以使用它们来增加基于时间的种子的熵。