Frage

Ich verwende eine C# -implementierung von Mersenne Twister, von denen ich heruntergeladen habe Zentrenspace. Ich habe zwei Probleme damit:

  1. Egal wie ich den Algorithmus säen, es geht nicht vor Eingefleischte Tests, Und damit meine ich, ich bekomme ziemlich viele 1s und 0s für den p-Wert. Auch mein Kstest auf 269 p-Werten ist 0. Nun, ich kann den p-Wert nicht ganz interpretieren, aber ich denke, ein paar 1s und 0s im Ergebnis sind schlechte Nachrichten.
  2. Ich wurde gebeten, die Zufälligkeit der Zahlen visuell zu zeigen. Also zeichne ich die Zahlen so, wie sie generiert werden, und das scheint überhaupt nicht zufällig zu sein. Hier sind zwei Screenshots des Ergebnisses Nach ein paar Sekunden und ein paar Sekunden später. Wie Sie im zweiten Screenshot sehen können, fallen die Zahlen auf einige parallele Linien. Ich habe verschiedene Algorithmen ausprobiert, um Zahlen auf Punkte zu kartieren. Sie alle führen zu parallele Linien, aber mit unterschiedlichen Blickwinkeln! So habe ich Zahlen auf Punkte für diese Screenshots abgebildet: new Point(number % _canvasWidth, number % _canvasHeight). Wie Sie vielleicht erraten, hängt das visuelle Ergebnis von der Breite und Höhe des Formulars ab und hängt das ist ein katastrophales Ergebnis.

Hier sind einige Möglichkeiten, wie ich versucht habe, den Algorithmus zu säen:

  1. Benutzereintrag. Ich tritt einige Zahlen ein, um den Algorithmus als INT -Array zu säen.
  2. Zufällige Zahlen, die vom Algorithmus selbst generiert werden !!
  3. Eine Reihe von new Guid().GetHashCode()

Was vermisse ich hier? Wie soll ich den Algorithmus säen? Wie kann ich es durch den eingefleischten Vergleich dazu bringen?

War es hilfreich?

Lösung

Obwohl ich nicht mit Ihrem ersten Punkt sprechen kann, hat das zweite Problem damit zu tun, wie Sie die Punkte berechnen. Speziell,

x = number % _canvasWidth;
y = number % _canvasHeight;

Sie geben Ihnen ein "Muster", das dem Seitenverhältnis des Fensters entspricht, zu dem Sie zeichnen. Zum Beispiel wenn _canvasWidth und _canvasHeight waren gleich, Sie zeichneten immer auf eine einzelne diagonale Linie als x und y wäre immer gleich. Diese grafische Darstellung wäre in diesem Fall also nicht angemessen.

Was ist mit der Einnahme der N -Bits der RNG -Ausgabe und der Hälfte der X -Koordinate und der anderen Hälfte für die Y -Koordinate? Für diese Teile, die aus den Grenzen Ihres Fensters fallen, möchten Sie möglicherweise zwei Optionen in Betracht ziehen:

  1. Zeichne sie nicht (oder zeichne sie außerhalb des Bildschirms)
  2. Führen Sie eine lineare Interpolation durch, um den Bereich der Bits auf die Breite/Höhe Ihres Fensters abzubilden

Jede Option sollte Ihnen ein repräsentativeres Bild der Bits geben, die Sie Ihres Zufallszahlengenerators erhalten. Viel Glück!

Andere Tipps

Ihr stripy Point-Ploting-Problem sollte leicht behoben werden, indem für jede der X- und Y-Koordinaten eine neue Zufallszahl generiert wird. Der Versuch, eine einzelne generierte Zahl für x und y wiederzuverwenden, ist im Grunde genommen eine vorzeitige Optimierung. Wenn Sie diese Route jedoch unterwegs, stellen Sie sicher, dass Sie für jede Anzahl unterschiedliche Bits aus der Zahl extrahieren. wie es ist, x=n%width;y=n%height Gibt Ihnen eine enorme Korrelation zwischen X und Y, wie in Ihren Bildern zu sehen ist.

Ich benutze seit Jahren verschiedene C ++ Mersenne Twister -Implementierungen (zuletzt Schub's) generieren zufällig Punkte und hatte keine Schwierigkeiten damit (Samen verwandt oder auf andere Weise). Es ist wirklich ein hervorragender Generator.

Wahre zufällig Die Zahlengenerierung kann nicht mit einer mathematischen Funktion erfolgen. Wenn es wichtig ist, wirklich zufällige Zahlen zu haben, holen Sie sich eine Hardware -Zufallszahlengenerator. Ich habe echte Online -Pokerspiele entwickelt - Hardware ist der einzige Weg, um sicher zu sein, dass es keine Muster in den Zahlen gibt.

Wenn Sie auf eine Linux -Umgebung abzielen, die /Dev/Random und/Dev/Urandom Pseudo -Geräte Machen Sie viel besser als ein mathematischer Generator, da sie Zufallszahlen enthalten, die Hardwareaktivitäten darstellen.

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