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

时间:2013-10-03 18:42:36

标签: python python-3.x

From the docs:

  

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

     

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

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

  

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

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

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

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

如果您将随机数用于与安全无关的事物,则基于时间的种子通常很好。如果您使用if进行安全性/加密,请注意文档所说的内容:“并且完全不适合加密目的”

答案 2 :(得分:4)

当你导入模块时,模块实际上为发生器播种(使用操作系统提供的来自urandom的随机数据,否则使用当前日期和时间),因此无需手动调用{{1} }。

(这在Python 2.7文档中提到,但由于某些原因,不是3.x文档。但是,我在3.x源代码中确认它仍然完成。)

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

答案 3 :(得分:3)

如果要重现结果,可以使用已知值为生成器设定种子,以便每次都获得相同的序列。

答案 4 :(得分:1)

Python使用的Mersenne twister是随机数生成器,默认情况下,在可能的平台上由操作系统提供服务随机数(Unixen,Windows);但是在其他平台上,种子默认为系统时间,这意味着如果系统时间精度不高,则可以重复使用非常可重复的值。在这样的系统上,利用已知的更好的随机值进行播种是有益的。请注意,在Python 3上,如果使用版本2,您可以传入任何strbytesbytearray来为种子生成种子;因此更好地利用了梅森捻线机的大状态。

使用种子值的另一个原因确实是保证您一次又一次地获得相同的随机数序列 - 通过重用已知种子。引用docs

  

有时能够重现给定的序列是有用的   伪随机数发生器。通过重新使用种子值,相同   序列应该在运行之间可以重复,只要多次   线程没有运行。

     

大多数随机模块的算法和种子功能都是   可能会在Python版本中发生变化,但有两个方面   保证不会改变:

     
      
  • 如果添加了新的播种方法,则会提供向后兼容的播种机。
  •   
  • 当兼容的播种机被赋予相同的种子时,生成器的random()方法将继续产生相同的序列。
  •   

然而,对于这一点,您通常希望使用random.Random实例而不是使用模块全局方法(多线程问题等)。

最后还要注意,Mersenne twister生成的随机数不适合密码学使用;虽然它们看起来非常随机,但可以通过观察发电机中的几百个值来完全恢复随机发电机的内部状态。对于加密算法,您希望使用SystemRandom class

答案 5 :(得分:0)

在大多数情况下,我会说没有必要关心。但是,如果有人真的愿意做一些有线的事情,他可以大致计算出代码运行时的系统时间,他们可能会强行重播你的随机数,看看哪个系列适合。但我想说在大多数情况下这是不太可能的。