Zufallszahlen und Mehrfachrufe

Ich schreibe ein Programm, das zahlreiche Zufallszahlen in Schleifen erzeugt. Ich versuche, die Zahlen etwas weniger vorhersehbar zu machen (nicht nur aus Sicherheitsgründen, sondern um Kollisionen bei mehreren Threads zu vermeiden).

Ich habe festgestellt, dass viele Dokumente einen Anruf empfohlen habensrand nur einmal im programm. Zum Beispiel:Zufallszahlen in Clautet die ausgewählte Antwort "Rufen Sie srand () in Ihrem Programm in der Regel nur einmal auf".

Aber warum? Warum wäre es so schlimm, so etwas zu tun:

int THIS_THREAD_SEED;
int randomness() {
    ++THIS_THREAD_SEED;
    int i;
    for(i=0 i<1000; i++) {
        unsigned n = rand_r(&THIS_THREAD_SEED) / RAND_MAX;
        /* do something with n */
    }
    return 0;
}

int do_something() {
    int i;
    for(i=0; i<1000; i++) {
        randomness();
    }
}

Daher ändert sich der Startwert einmal pro Funktionsaufruf und nicht einmal pro Programm. Auf diese Weise haben keine zwei Threads, egal wie viele Threads ausgeführt werden, dieselbe Zufallszahlenliste ... Richtig?

AKTUALISIEREN Angenommen, ich habe entweder einen eindeutigen Startwert für jeden Thread oder einen Mutex für einen globalen Startwert, um Race-Bedingungen zu verhindern.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage