Random.Next () gibt manchmal die gleiche Zahl in separaten Threads zurück

8

Ich habe die folgende Klasse

%Vor%

Der Code erstellt die angegebene Anzahl von Threads, startet sie und weist jedem Thread ein zufälliges device_id zu. Aus irgendeinem Grund haben die ersten beiden erstellten Threads oft den gleichen device_id . Ich kann nicht herausfinden, warum das passiert.

    
dandan78 06.01.2011, 09:59
quelle

3 Antworten

23

Random ist nicht Thread-sicher - Sie sollten nicht dieselbe Instanz aus mehreren Threads verwenden. Es kann viel schlimmer werden, als nur die gleichen Daten zurückzugeben - indem Sie es aus mehreren Threads verwenden, können Sie es in einem Zustand "feststecken", in dem es immer 0, IIRC zurückgibt.

Offensichtlich möchtest du nicht nur eine neue Instanz für jeden Thread ungefähr zur selben Zeit erstellen, da sie mit den gleichen Seeds enden werden ...

Ich habe einen Artikel , der in die Details davon eingeht und eine Implementierung bietet, die eine Instanz von Random pro Thread mit einem inkrementierenden Seed.

    
Jon Skeet 06.01.2011, 10:02
quelle
4

Random ist ein Pseudozufallszahlengenerator und es gibt nichts, was verhindert, dass dasselbe Ergebnis für mehrere Aufrufe zurückgegeben wird. Immerhin besteht eine Wahrscheinlichkeit dafür. Ganz zu schweigen von der Dokumentation :

  

Für alle Instanzmitglieder ist nicht garantiert, dass sie threadsicher sind.

Sie sollten also nicht die Next -Methode von mehreren Threads aufrufen.

    
Darin Dimitrov 06.01.2011 10:02
quelle
1

Ihr Beispielcode zeigt nur eine Verwendung von _Random pro Thread. Angenommen, dies ist der Fall, können Sie auch die Zufallszahl in der Hauptschleife for generieren und die Zufallszahl als Parameter an jeden Thread übergeben.

%Vor%

und ändern Sie dann Ihre Thread-Funktion, um den Parameter zu akzeptieren:

%Vor%     
Grhm 06.01.2011 10:25
quelle

Tags und Links