我应该播种随机数发生器吗?

tem*_*ame 2 python python-3.x

来自文档:

random.seed(a = None,version = 2)初始化随机数生成器.

如果省略a或None,则使用当前系统时间.如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参阅os.urandom()函数).

但是......如果它真的是随机的......(而且我以为我读过它使用了梅森,所以它非常随机)......播种它的重点是什么?无论哪种方式,结果都是不可预测的......对吗?

Woo*_*ble 7

当您导入模块时,该模块实际上为生成器提供了种子(如果可能的话,使用操作系统提供的随机数据urandom,否则使用当前日期和时间),因此无需手动调用seed().

(Python 2.7 文档中提到了这一点,但由于某种原因,3.x 文档中没有提到。不过,我在 3.x 源代码中确认它仍然完成。)

如果未完成自动播种,则每次启动程序时都会得到相同的数字序列,就像每次手动使用相同的种子一样。


Mar*_*som 5

如果每次运行需要不同的随机数,则默认值可能最佳.如果出于某种原因需要可重复的随机数,例如在测试中使用种子.


nos*_*nos 5

但是...如果它真的是随机的

不,它是伪随机的。如果它使用 Mersenne Twister,那也是PRNG

它基本上是一种从给定种子生成完全相同的伪随机数序列的算法。生成真正的随机数需要特殊的硬件支持,这不是纯粹的算法可以做到的。

您可能不需要播种它,因为它会在第一次使用时自行播种,除非您有其他或更好的方式来提供种子而不是基于时间的方式。

如果您将随机数用于与安全无关的事情,那么基于时间的种子通常就可以了。如果您将 if 用于安全/加密,请注意文档所说的:“并且完全不适合加密目的”