python的random.Random.seed是如何工作的?
我习惯用 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)]