Python中的Seed()和随机数

时间:2011-12-07 22:08:38

标签: python random

  

可能重复:
  Python's random: What happens if I don't use seed(someValue)?

今天,我刚刚被告知程序员的seed()功能比我更有经验。我通常只用一个列表作为参数调用choice(),因为我不再需要随机数功能。

我的程序员朋友告诉我调用种子是必要的,因为否则Python总是以零作为默认种子开始随机数操作。这意味着虽然数字看似随机,但我们每次都得到相同的序列。

这让我觉得很奇怪。例如,choice()函数在执行它之前是否真的没有调用种子?或者是它无法以编程方式更改其种子的原因,因为它本身会涉及选择一个随机数,显然如果我们的最终目标也是选择一个随机数,那就有点问题了!

我在这里咆哮,但我想知道是否有人清楚知道这一切是如何实施的。

1 个答案:

答案 0 :(得分:29)

你的朋友出了问题,如果他阅读了seed()函数的文档,就会知道:

  

初始化基本随机数生成器。可选参数x可以是任何可哈希对象。如果省略x或None,则使用当前系统时间; 当前系统时间也用于在首次导入模块时初始化生成器。如果操作系统提供随机源,则使用它们而不是系统时间(请参阅os.urandom()有关可用性的详细信息)。

(强调我的。)

他根据他对其他语言的工作原理的猜测而猜测。主要提供seed()函数,以便您可以获得可重现的伪随机数流(这对于某些特定应用程序是必需的)。

您直接从random模块调用的函数实际上是random.Random类的隐藏实例的方法的别名。每个实例(至少有效)在其seed()内调用__init__()

choice()函数显然不会在操作前调用seed(),因为这意味着在每次选择之前重新播种,这会影响播种的目的。