Zufallsgenerator Mersenne-Twister und jumpahead()
Verfasst: Donnerstag 14. Februar 2008, 09:51
Habe ein Problem mit dem Zufallsgenerator von numpy.random.
Der von Python eingebaute Zufallsgenerator random kennt die Funktion jumpahead(n). Mit Hilfer dieser Funktion ist es sehr einfach mit Multi-Processing Zufallszahlen zu erzeugen.
Beispiel:
Dies funktioniert, braucht aber lange um 100000 oder mehr Zahlen zu würfeln, da jeder Prozess einen For Loop hat.
Mit NumPy kann ich Bereiche würfeln (numpy.random.rand(1000)), viel schneller als der eingebaute Python Zufallsgenerator. Ich vermisse aber die jumpahead Funktion bei numpy.random.
Ein möglicher Workaround wäre:
Dieser ist aber langsam sobald n >> 100000
Gibt es einen besseren Workaround, irgendwelche Alternativen?
Bin für jeden Hinweis dankbar.
Der von Python eingebaute Zufallsgenerator random kennt die Funktion jumpahead(n). Mit Hilfer dieser Funktion ist es sehr einfach mit Multi-Processing Zufallszahlen zu erzeugen.
Beispiel:
Code: Alles auswählen
# Prozess 0
import random
random.seed()
random_state = random.getstate()
# Nun random_state an Prozesse verteilen und je 100000 Zahlen generieren
# Prozess 1
random.setstate(random_state)
random.jumpahead(0)
return [random.random() for i in xrange(100000)]
# Prozess 2
random.setstate(random_state)
random.jumpahead(100000)
return [random.random() for i in xrange(100000)]
# Prozess 3
random.setstate(random_state)
random.jumpahead(200000)
return [random.random() for i in xrange(100000)]
# und so weiter
Mit NumPy kann ich Bereiche würfeln (numpy.random.rand(1000)), viel schneller als der eingebaute Python Zufallsgenerator. Ich vermisse aber die jumpahead Funktion bei numpy.random.
Ein möglicher Workaround wäre:
Code: Alles auswählen
def jumpahead(n):
x = 100000
# For Loop über Ganzahldivision von n/x wegen Speicherverbrauch
for i in xrange(n/x):
numpy.random.rand(x)
# Nun noch der Rest
numpy.random.rand(n%x)
Gibt es einen besseren Workaround, irgendwelche Alternativen?
Bin für jeden Hinweis dankbar.