Warum ist Random () nicht zufällig? [Duplikat]

7

Ich habe dieses Testprogramm:

%Vor%



Wenn ich System.Threading.Thread.Sleep(1); auskommentiere, bekomme ich

%Vor%

Aber wenn ich diese Zeile auskommentiere, bekomme ich Zufallszahlen.

%Vor%

Warum ist die Codezeile wichtig? Danke!

    
bla 27.01.2011, 15:05
quelle

6 Antworten

10

Wie andere bereits gesagt haben, sät new Random() den Zufallsgenerator aus der aktuellen Systemzeit.

Ich habe einen Artikel , der das genauer beschreibt, einschließlich Lösungen für das Problem, die Sie vielleicht nützlich finden . Grundsätzlich möchten Sie die gleiche Instanz von Random mehrmals verwenden - aber beachten Sie, dass es nicht threadsicher ist.

    
Jon Skeet 27.01.2011, 15:11
quelle
11

Der Typ Random wird standardmäßig entsprechend der aktuellen Systemzeit mit endlicher Granularität gesetzt.

Wenn Sie new Random().Next(1, 6) mehrmals in schneller Folge aufrufen, werden viele Random -Objekte mit demselben Seed-Wert erstellt, was das gleiche Ergebnis ergibt. Der Thread.Sleep(1) -Ruf "löst" dieses Problem, indem er einfach die Konstrukte zeitlich weiter auseinander hält, was die Wahrscheinlichkeit für unterschiedliche Startwerte erhöht.

Sie müssen ein bestimmtes Random -Objekt von einem Aufruf zum nächsten beibehalten:

%Vor%     
Dan Tao 27.01.2011 15:10
quelle
3

Weil es die Uhr als Startwert für das Generieren von Zahlen verwendet und wenn Sie auf diese Weise Zufallszahlen generieren, erhalten Sie die gleichen Zahlen

    
Jahan Zinedine 27.01.2011 15:09
quelle
2

Der Zufallszahlengenerator basiert teilweise auf der Systemuhr, und C # ist zu schnell, um sie zu verwirren ...

    
Sparky 27.01.2011 15:10
quelle
1

Wenn Sie das Zufallsmuster nicht erzeugen, erhalten Sie die gleiche Anzahl wie Random ist ein Pseudozufallsgenerator

Indem Sie Thread.Sleep (1) verwenden, erlauben Sie dem Timer, fortzuschreiten und einen neuen automatisch generierten Seed zu erzeugen.

Eine Möglichkeit zum "Reparieren" besteht darin, ein zufälliges Objekt zu erstellen und es wiederzuverwenden (wie einige andere auch beantwortet haben) oder einen anderen Zufallsgenerator zu verwenden.

Weitere Informationen finden Sie auf Ссылка

    
Tom Vervoort 27.01.2011 15:17
quelle
0

Jeder Zufallszahlengenerator, den Sie verwenden, ist eine Pseudozufallszahl. Dies hat immer einen vordefinierten Startwert und eignet sich gut zum Testen, aber nicht zum Implementieren von Features mit echter Zufälligkeit.

Sie sollten eine Quasi-Zufallszahlenfolge verwenden, um Zufallszahlen zu erzeugen, oder noch besser, Markovs-Kette, um die besten Zufallszahlen zu erzeugen. Wenn Sie vorhaben, eine dieser Random-Funktionen zu verwenden, werden Sie der echten Zufälligkeit nicht nahe kommen.

    
r3st0r3 27.01.2011 16:22
quelle

Tags und Links