3

从文档:

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

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

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

4

6 回答 6

7

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

于 2013-10-03T18:46:39.250 回答
5

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

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

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

于 2013-10-03T18:52:13.963 回答
4

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

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

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

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

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

于 2013-10-03T18:46:40.390 回答
3

如果你想重现你的结果,你可以用一个已知的值给生成器播种,这样你每次都会得到相同的序列。

于 2013-10-03T18:46:31.500 回答
1

Python 使用的 Mersenne twister(随机数生成器)由操作系统在可能的平台(Unixen、Windows)上默认提供随机数提供种子;但是在其他平台上,种子默认为系统时间,这意味着如果系统时间的精度很差,则值非常可重复。因此,在这样的系统上,用已知的更好随机值播种是有益的。请注意,特别是在 Python 3 上,如果使用版本 2,您可以传入任何str, bytes, 或bytearray作为生成器的种子;从而更好地利用梅森捻线器的大状态。

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

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

大多数随机模块的算法和播种函数可能会在 Python 版本之间发生变化,但有两个方面保证不会发生变化:

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

但是,为此,您主要希望使用random.Random实例而不是使用模块全局方法(多线程问题等)。

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

于 2013-10-03T20:41:04.050 回答
0

在大多数情况下,我会说没有必要关心。但是,如果有人真的愿意做一些有线的事情并且(s)他可以粗略地计算出您的代码运行时的系统时间,他们可能能够暴力重播您的随机数并查看哪个系列适合。但我会说在大多数情况下这不太可能。

于 2013-10-03T18:48:02.757 回答