Python中的Seed()和随机数

7 投票
1 回答
16538 浏览
提问于 2025-04-17 07:56

今天,我听一个比我更有经验的程序员讲到了 seed() 这个函数。我通常只用 choice() 函数,给它传一个列表作为参数,因为我不需要更复杂的随机数功能。

我的程序员朋友告诉我,调用 seed() 是必要的,因为如果不这样做,Python 在进行随机数操作时总是默认从零开始。这意味着虽然这些数字看起来是随机的,但实际上每次得到的序列都是一样的。

这让我觉得有点奇怪。比如说,choice() 函数真的不在执行之前调用 seed() 吗?还是说它不能自己改变种子,因为这本身就涉及到选择一个随机数,而如果我们的目标也是选择一个随机数,那就有点问题了!

我在这里有点发牢骚,但我想知道有没有人能清楚地解释一下这一切是怎么实现的。

1 个回答

29

你的朋友完全错了,如果他看一下seed()函数的说明文档就知道了:

这个函数用来初始化基本的随机数生成器。可选的参数x可以是任何可哈希的对象。如果不提供x或者x是None,就会使用当前的系统时间;在第一次导入这个模块时,也会使用当前的系统时间来初始化生成器。如果操作系统提供了随机性来源,它们会被用来代替系统时间(具体可以查看os.urandom()函数的可用性)。

(强调是我加的。)

他是根据自己对其他语言的理解在猜测。seed()函数主要是为了让你能得到一串可重复的伪随机数(这在某些特定应用中是必要的)。

你直接从random模块调用的函数其实是一个隐藏的random.Random类实例的方法的别名。每个实例在初始化时,实际上都会调用seed()

显然,choice()函数在执行之前并不会调用seed(),因为那样的话每次选择之前都要重新设置种子,这样就失去了设置种子的意义。

撰写回答