2010-02-25 5 views
9

Ich habe auf der Klasse Random einige Tests getan, und ich habe den folgenden Code verwendet:Wie zufällig ist Random.Next()?

while (x++ <= 5000000) 
     { 
      y = rnd.Next(1, 5000000); 
      if (!data.Contains(y)) 
       data.Add(y); 
      else 
      { 
       Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i); 
       break; 
      } 
     } 

ich die RND max Grenze (dh 5.000.000) gehalten zu ändern und ich die Anzahl der Iterationen geändert, und ich bekam die folgende Ergebnis:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations 
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations 
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations. 

Warum bin ich diese Mittelwerte bekommen, also von 10 mal ich für jeden Wert überprüft, 80% der Zeit bekomme ich innerhalb dieser durchschnittlichen Bereich. Ich denke, wir können es nicht annähernd Zufall nennen.

Was kann ich tun, um eine ziemlich zufällige Zahl zu erhalten?

+4

Es wird aus einem Grund Pseudozufalls genannt. –

+4

Zufall bedeutet nicht "einzigartig". – nos

+18

Herzlichen Glückwunsch zur Entdeckung des Geburtstagsparadoxons. (http://en.wikipedia.org/wiki/Birthday_problem) – kennytm

Antwort

30

Sie testen nicht auf Zyklen. Sie testen, wie lange es dauert, bis Sie eine Zufallszahl erhalten haben. Das ist völlig anders. Ihre Zahlen sind genau richtig, um zu testen, wie lange es dauert, bis Sie eine Zufallszahl erhalten. Schau in Wikipedia unter "Das Geburtstagsparadox" nach einem Diagramm der Wahrscheinlichkeit, nach einer bestimmten Anzahl von Iterationen eine Kollision zu bekommen.

Zufälligerweise schrieb ich letzte Woche einen Blogartikel über genau dieses Thema. Es wird am 22. März live gehen; see my blog dann für Details.

Wenn das, was Sie testen wollen Generator die Zykluslänge einer Pseudozufallszahl ist, dann müssen Sie nicht eine Nummer suchen nach Sie vor gehabt haben, sondern eine lange exakte Sequenz von Zahlen das hast du vorher gehabt. Es gibt eine Reihe von interessanten Möglichkeiten, dies zu tun, aber es ist wahrscheinlich einfacher für mich, Ihnen nur zu sagen: Die Zykluslänge von Random ist ein paar Milliarden, so dass Sie wahrscheinlich kein Programm schreiben können, das diese Tatsache entdeckt. Sie müssten ein Los von Zahlen speichern.

Die Zykluslänge ist jedoch nicht das einzige Maß für die Qualität eines Pseudozufallszahlengenerators. Denken Sie daran, PRNGs sind nicht zufällig, sie sind vorhersagbar, und deshalb müssen Sie sehr sorgfältig darüber nachdenken, was Ihre Metrik für "Zufälligkeit" ist.

Geben Sie uns weitere Details: Warum kümmert es dich, wie "zufällige" Random ist? Welche Anwendung verwenden Sie es für das Sie interessieren? Welche Aspekte der Zufälligkeit sind dir wichtig?

+0

+1 @Eric: Füllen Sie Ihren Blog vor der Veröffentlichung? Das ist lustig. – Zano

+6

@Zano: Ja, ich schreibe einen ganzen Stapel von Artikeln auf einmal und stelle sie dann auf, um zweimal pro Woche live zu gehen. Ich bin ungefähr zwei Monate im Voraus. Raymond Chen veröffentlicht fünf oder zehn Mal pro Woche und hat mehrere * Jahre * Wert in seiner Warteschlange; Ich weiß nicht, wie er es macht! –

+0

Hehe das ist lustig. Aber werden die Artikel nicht veraltet, wenn Sie es Jahre vor der Zeit machen? Zum Beispiel würde sich eine neuere Version von .NET oder C# anders verhalten usw. –

2

Ein Computer kann keine echte Zufallszahl generieren. Wenn Sie eine echte Zufallszahl benötigen (David gab Ihnen die beste Option von dot net framework) Sie benötigen eine externe zufällige Quelle.

+1

Ich mag, wie random.org die Geräusche in atmosphärischen Störungen verwendet. –

3

Sie bewerten die Zufälligkeit durch wiederholte Paare, was nicht der beste Test für Zufälligkeit ist. Die Wiederholungen, die Sie sehen, ähneln dem Geburtstagsparadox: http://en.wikipedia.org/wiki/Birthday_problem, in dem ein Wiederholungsereignis mit einer kleinen Beispielgröße auftreten kann, wenn Sie nicht nach einem bestimmten Ereignis suchen.

15

Sie gehen davon aus, dass die Zufälligkeit besser ist, wenn Zahlen nicht wiederholt werden. Das ist nicht wahr.

Echte Zufälligkeit hat keinen Speicher. Wenn Sie die nächste Nummer wählen, ist die Chance, dieselbe Nummer erneut zu erhalten, genauso hoch wie bei jeder anderen Zahl in der Reihe.

Wenn Sie einen Würfel werfen und eine Sechs bekommen, dann würfeln Sie erneut, es gibt keine geringere Chance, wieder eine Sechs zu bekommen. Wenn Sie zwei Sechser nacheinander bekommen, bedeutet das nicht, dass der Würfel gebrochen ist.

Die Zufälligkeit in der Random-Klasse ist natürlich nicht perfekt, aber das ist nicht das, was dein Test offenbart. Es zeigt einfach ein Phänomen, das Sie mit jedem Ranom-Zahlengenerator bekommen, auch wenn Sie tatsächlich echte Zufallszahlen und nicht nur Pseudozufallszahlen erzeugen.

+0

+1 für die gebrochenen Würfel –

+0

+1 sehr gut erklärt – Bhaskar

+0

Es könnte tatsächlich. Ich habe 10-seitige Würfel, die 8,9,0-mal häufiger auftauchen als andere Zahlen. Sie sind großartig für Marvel Super Heroes, aber schlecht für andere Spiele, die niedrigere Zahlen wollen. I.E. Würfel kann kaputt sein. – PRMan