2012-01-25 14 views
9

私は入力に慣れていますrandom.randrange。これからエラーを見つけるためにfrom random import Randomを実行します。手続き世代(いや、ないのMinecraftクローン:p)を含むゲームのためにpythonのrandom.Random.seedはどのように機能しますか?

私はいくつかの明確な疑似乱数生成器を維持したいと思います:世界の世代のための

  • 1(風景を、クエストなど)、
  • 世界で起こり得るランダムイベント(戦闘中のダメージなど)の1つ。

私は最初のものを再現できるようにしたいので、2番目のものに干渉させたくありません。

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

は2つの異なるシーケンスを生成する。私がrnd = randomを実行すると、予想どおりに動作しますが、いくつかのジェネレータが必要になります。

私には何が欠けていますか?

+1

実際にはそれを見分けるのに数分かかりました。私たちのすべてに悪いことが起こると感じていない、それが解決されてうれしい:) –

答えて

13

それはあなたがしようとした、ほぼ正確に動作しますが、rnd.seed()だけ

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

またはこのようなグローバル種子、設定することにより、使用

RND オブジェクトに適用されます。

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] 
関連する問題