2012-01-25 12 views
9

Jestem przyzwyczajony do pisania random.randrange. Zrobię from random import Random, aby od razu wykryć błąd.Jak działa skrypt random.Random.seed python?

W grze z udziałem generacji proceduralną (nope, nie klonem Minecraft: p) Chciałbym zachować kilka różnych generatorów liczb pseudolosowych:

  • jeden dla pokolenia świata (Pejzaż, questy itp.),
  • jeden z losowych zdarzeń, które mogą się zdarzyć w świecie (np. obrażenia podczas walki).

Powodem jest to, że chcę móc odtworzyć pierwszy, więc nie chcę, aby drugi przeszkadzał.

Myślałem, że random.Random został stworzony do tego. Jednak coś mnie zastanawia:

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

wytwarza dwie różne sekwencje. Kiedy robię rnd = random, to wszystko działa zgodnie z oczekiwaniami, ale potrzebuję kilku generatorów.

Czego mi brakuje?

+1

Zajęło mi to kilka minut, aby to zauważyć. Nie czuj się złym wydarzeniem dla nas wszystkich, cieszę się, że to rozwiązano :) –

Odpowiedz

13

To działa prawie dokładnie tak, jak próbowali ale rnd.seed() odnosi się do RND obiektu

wystarczy użyć

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

lub poprzez ustawienie globalne nasienie, tak:

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

Przełóż ziarno do konstruktora 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] 
Powiązane problemy