Python中的Seed()和随机数
今天,我听一个比我更有经验的程序员讲到了 seed()
这个函数。我通常只用 choice()
函数,给它传一个列表作为参数,因为我不需要更复杂的随机数功能。
我的程序员朋友告诉我,调用 seed()
是必要的,因为如果不这样做,Python 在进行随机数操作时总是默认从零开始。这意味着虽然这些数字看起来是随机的,但实际上每次得到的序列都是一样的。
这让我觉得有点奇怪。比如说,choice()
函数真的不在执行之前调用 seed()
吗?还是说它不能自己改变种子,因为这本身就涉及到选择一个随机数,而如果我们的目标也是选择一个随机数,那就有点问题了!
我在这里有点发牢骚,但我想知道有没有人能清楚地解释一下这一切是怎么实现的。
1 个回答
29
你的朋友完全错了,如果他看一下seed()
函数的说明文档就知道了:
这个函数用来初始化基本的随机数生成器。可选的参数x可以是任何可哈希的对象。如果不提供x或者x是None,就会使用当前的系统时间;在第一次导入这个模块时,也会使用当前的系统时间来初始化生成器。如果操作系统提供了随机性来源,它们会被用来代替系统时间(具体可以查看os.urandom()函数的可用性)。
(强调是我加的。)
他是根据自己对其他语言的理解在猜测。seed()
函数主要是为了让你能得到一串可重复的伪随机数(这在某些特定应用中是必要的)。
你直接从random
模块调用的函数其实是一个隐藏的random.Random
类实例的方法的别名。每个实例在初始化时,实际上都会调用seed()
。
显然,choice()
函数在执行之前并不会调用seed()
,因为那样的话每次选择之前都要重新设置种子,这样就失去了设置种子的意义。