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