Frage

Ich habe auf der Klasse Random einige Tests getan, und ich habe den folgenden Code verwendet:

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;
    }
}

hielt ich die RND max Grenze zu ändern (das heißt 5.000.000) und ich änderte die Anzahl der Iterationen und ich habe folgendes 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 erhalte ich diese Mittelwerte bekommen, das heißt von 10 mal ich für jeden Wert überprüft, 80% der Zeit bekomme ich innerhalb dieser durchschnittlichen Bereich. Ich glaube nicht, dass wir es in der Nähe ist Zufall nennen können.

Was kann ich tun, um eine ziemlich Zufallszahl zu erhalten.

War es hilfreich?

Lösung

Sie testen nicht für Zyklen. Sie testen, wie lange es eine Zufallszahl zu erhalten nimmt man vor hatte. Das ist ganz andere . Ihre Zahlen sind vor Ort auf den Zweck zu testen, wie lange es eine Zahl, die Sie zuvor bekommen dauert. Suchen in Wikipedia unter „Geburtstagsparadoxon“ für ein Diagramm der Wahrscheinlichkeit eine Kollision nach einer bestimmten Anzahl von Iterationen zu bekommen.

Zufälligerweise letzte Woche schrieb ich einen Blog-Artikel über genau dieses Thema. Es wird live gehen am 22. März; siehe mein Blog dann für weitere Einzelheiten.

Wenn das, was Sie testen mögen, für die Zykluslänge eines Pseudo-Zufallszahlengenerators, dann müssen Sie suchen nicht ein Zahl Sie haben zuvor, sondern ein lange exakte Sequenz von Zahlen, die Sie schon vorher hatte. Es gibt eine Reihe von interessanten Möglichkeiten, das zu tun, aber es ist wahrscheinlich einfacher für mich nur zu sagen: die Zykluslänge von Random ist ein paar Milliarden, so werden Sie kaum in der Lage sein, ein Programm, entdeckt diese Tatsache zu schreiben. Sie würden ein speichern haben Los von Zahlen.

Allerdings Zykluslänge ist nicht das einzige Maß für die Qualität eines Pseudo-Zufallszahlengenerators. Denken Sie daran, PRNGs sind nicht zufällig , sie sind berechenbar , und daher muss man sehr genau überlegen, was Ihre Metrik für „Zufälligkeit“ ist.

Geben Sie uns mehr Informationen: Warum interessieren Sie sich, wie „random“ Random ist? Was Anwendung verwenden Sie es für das Sie sich interessieren? Welche Aspekte des Zufalls sind wichtig für Sie?

Andere Tipps

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

Echt Zufälligkeit hat kein Gedächtnis. Wenn Sie die nächste Nummer wählen, um die Chance, wieder die gleiche Anzahl zu bekommen, ist genauso hoch wie jede andere Zahl im Bereich.

Wenn Sie einen Würfel rollen und ein sechs bekommen, dann die Würfel rollen wieder, gibt es nicht weniger Chance auf ein sechs wieder zu bekommen. Wenn Sie bekommen zwei Sechsen in Folge passieren, das bedeutet nicht, dass die Würfel gebrochen wird.

Die Zufälligkeit in der Klasse Random es natürlich nicht perfekt, aber das ist nicht das, was Ihr Test zeigt. Es zeigt einfach eine penomenon, dass Sie mit jedem ranom Zahlengenerator, auch wenn tatsächlich echte Zufallszahlen erzeugt und nicht nur Pseudozufallszahlen.

Sie urteilen Zufälligkeit durch Wiederholung Paare, die nicht der beste Test für die Zufälligkeit ist. Die Wiederholungen sehen Sie sind verwandt mit dem Geburtstagsparadoxon: http://en.wikipedia.org/wiki/Birthday_problem , wo ein Wiederholungsereignis mit einer kleinen Probengröße auftreten, wenn Sie nicht für ein bestimmtes Ereignis suchen.

Per Dokumentation unter http://msdn.microsoft.com /en-us/library/system.random.aspx

  

Zur Erzeugung eines kryptografisch sicheren   Zufallszahl geeignet für eine Schaffung   zufällige Passwort, zum Beispiel der Verwendung eines   Klasse abgeleitet von    System.Security.Cryptography .. ::. RandomNumberGenerator   sowie    System.Security.Cryptography .. ::. RNGCryptoServiceProvider.

Ein Computer kann nicht eine echte Zufallszahl erzeugen. wenn Sie eine echte Zufallszahl benötigen (David gab Ihnen die beste Wahl von dot net framework) Sie benötigen eine externe Zufallsquelle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top