Normalerweise verwende ich den Aufruf, wenn ich einen sequentiellen Zufallszahlengenerator in C setze
srand(time(NULL))
dann benutze
rand() mod N
um eine zufällige ganze Zahl zwischen 0 und N-1 zu erhalten. Wenn ich dies jedoch parallel mache, sind die Aufrufe zur Zeit (NULL) so nahe beieinander, dass sie genau dieselbe Nummer haben.
Ich habe versucht, einen linearen kongruenten Zufallszahlengenerator zu verwenden:
für einige ganze Zahlen und .
Ich weiß, dass die Wahl von für eine große ganze Zahl schnellen Ergebnissen führt, da der Moduloperator durch Abschneiden von Ziffern berechnet werden kann. Es fällt mir jedoch schwer, Samen zu etablieren, die zufällige Sequenzen mit einer großen parallelen Periode produzieren. Ich weiß, dass eine Periodenlänge maximal ist, wenn
- c und m sind Primzahlen zueinander
- a-1 ist durch alle Primfaktoren von m teilbar
- Wenn m ein Vielfaches von 4 ist, muss a-1 auch ein Vielfaches von 4 sein.
(Quelle: Wikipedia )
Aber wie stelle ich sicher, dass alle Zufallszahlenströme diese maximale Eigenschaft haben? Wie kann ich in Bezug auf den MPI die maximalen Perioden mit der linearen Kongruenzmethode einbeziehen rank
und size
erzeugen? Wäre es einfacher, einen Lagged Fibonacci oder Mersenne Twister zu verwenden, um längere parallele Zufallsströme zu erzeugen?
mod
die niederwertigen Bits zu greifen - wie Jonathan Dursi vorgeschlagen, sie sind viel weniger zufällig. Teilen Sie stattdessen Ihre (int) Zufallszahl durch maxint / range, um den gewünschten Bereich zu erhalten. Es kostet Sie eine Kluft, aber es ist wahrscheinlich eine billigere Option, um die Qualität Ihres Zufallszahlenstroms zu verbessern, als zu einem anderen PRNG zu wechseln.