Parallel mit mehreren Zufallsgeneratoren zu arbeiten ist echt nicht einfach. Die Details verstecken sich im Verständnis.
Mit welchen Seed werden sie erstellt? Einfach die Zeit in Sekunden plus 1, 2 3, 4? Wir können das ja einfach mal ausprobieren.
Die ersten drei Zahlen von vier Generatoren:
int main() { for(int j=1; j < 5; ++j) { cout << "\nseed " << j << "\n"; std::minstd_rand gen(j); for(int i=0; i < 3; i++) { cout << gen() << "\n"; } } }
seed 1
48271
182605794
1291394886seed 2
96542
365211588
435306125seed 3
144813
547817382
1726701011seed 4
193084
730423176
870612250
Setzt man die Zahlen ins Verhältnis zueinander und plottet sie, kommt der AHA Effekt:
Ach was. Zumindest die zuerst gezogenen Zahlen stehen ja in einem festen Verhältnis. Das Verhältnis der dritten gezogene Zufallszahl ist zwar nicht mehr gleich, aber immer noch bei allen eine kleine Zahl. Na, wenn diese vier Generatoren nicht "parallel" laufen ;)
Der C++ Standard antwortet uns mit std::seed_seq
std::seed_seq consumes a sequence of integer-valued data and produces a requested number of unsigned integer values i, 0 ? i < 232 , based on the consumed data. The produced values are distributed over the entire 32-bit range even if the consumed values are close.
...
The following algorithm is used (adapted from the initialization sequence of the Mersenne Twister generator by Makoto Matsumoto and Takuji Nishimura, incorporating the improvements made by Mutsuo Saito in 2007)
Weiterführende Quellen
Sehr interessant: Finding the Best 64-bit Simulation PRNG
Multiple independent random number streams
Dynamic Creation (DC) of Mersenne Twister generators.
Scalable Parallel Random Number Generators Library
Tina’s Random Number Generator Library