python的random.Random.seed是如何工作的?

9 投票
2 回答
9817 浏览
提问于 2025-04-17 11:05

我习惯用 random.randrange 这个方法。从现在开始,我会用 from random import Random 来找出错误。

在一个涉及程序生成的游戏中(不是Minecraft的克隆版哦 :p),我想保持几个不同的伪随机数生成器:

  • 一个用来生成世界(比如地形、任务等),
  • 一个用来处理世界中可能发生的随机事件(比如战斗中的伤害)。

这样做的原因是我想要能够重现第一个生成的结果,所以我不希望第二个生成器干扰到它。

我以为 random.Random 是为这个目的而设计的。不过有些事情让我感到困惑:

import random
rnd = random.Random()
rnd.seed(0)
print [random.randrange(5) for i in range(10)]
rnd.seed(0)
print [random.randrange(5) for i in range(10)]

这段代码产生了两个不同的序列。当我用 rnd = random 时,一切都按预期工作,但我确实需要多个生成器。

我漏掉了什么呢?

2 个回答

4

把种子传给Random的构造函数:

>>> import random
>>> rnd = random.Random(0)
>>> [rnd.randint(0, 10) for i in range(10)]
[9, 8, 4, 2, 5, 4, 8, 3, 5, 6]
>>> rnd = random.Random(0)
>>> [rnd.randint(0, 10) for i in range(10)]
[9, 8, 4, 2, 5, 4, 8, 3, 5, 6]
>>> rnd = random.Random(1)
>>> [rnd.randint(0, 10) for i in range(10)]
[1, 9, 8, 2, 5, 4, 7, 8, 1, 0]
13

它的工作方式和你尝试的几乎一模一样,不过这里的 rnd.seed() 是作用在 rnd 对象 上的。

你只需要使用:

rnd = random.Random(0) # <<-- or set it here 
rnd.seed(7)
print [rnd.randrange(5) for i in range(10)]

或者通过设置全局种子,像这样:

random.seed(7)
print [random.randrange(5) for i in range(10)]

撰写回答