2012-01-25 62 views
9

我習慣打字random.randrange。我會做一個from random import Random從現在開始發現錯誤。python的random.Random.seed是如何工作的?

對於涉及程序生成的遊戲(不,不是的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然後事情按預期工作,但我確實需要幾個發電機。

我錯過了什麼?

+1

它實際上花了我幾分鐘時間來發現。不要爲我們所有人感到難過,很高興它解決了:) –

回答

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)] 
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]