Crappy Zufallszahlengenerator

7

Das hört sich nach einer seltsamen Frage an, aber wo finde ich einen Zufallszahlengenerator, der in C oder C ++ funktioniert, der nicht sehr gut ist?

Kontext: Ich erstelle eine Baumdiagramm-Plotting-Software und teste sie mit mehrstelligen Zufallszahlen (so wird jede Ziffer zu einem Knoten in der Baumstruktur). Der Zufallszahlengenerator, den ich verwendet habe - der mit dem GNU C ++ Compiler geliefert wird - gibt mir eine schöne Verteilung der Werte. Das ist gut, aber ich möchte sehen, wie die Tabelle aussieht, wenn die Zahlen zusammenklumpen und weniger homogen sind.

Kann irgendjemand einen Zufallszahlengenerator vorschlagen, der sich als nicht so zufällig erwiesen hat?

(Oh, jeder, der auf xkcd verlinkt und / oder vorschlägt, dass ich nur 4 zurückgebe, bekommt als Antwort Sarkasmus).

    
thornate 08.10.2009, 04:38
quelle

12 Antworten

7

Ich habe immer an randu als Paten gedacht schlechte Zufallszahlengeneratoren.

    
mob 08.10.2009 04:50
quelle
3

Implementieren Sie ein ziemlich kurzes lineares Feedback-Schieberegister , indem Sie die Bit-Manipulation in C verwenden.

Das meiste Material, das auf LFSRs veröffentlicht wird, wird sich auf maximale Sequenzen konzentrieren, aber es klingt so, als könnte man eine dieser Sequenzen sabotieren, um mit etwas Experimentieren eine kürzere Sequenz zu erzeugen.

    
pavium 08.10.2009 04:52
quelle
3

Die Boost-Bibliothek bietet Funktionen zum Generieren von verteilten Zufallswerten verschiedene ungleichmäßige Verteilungen, einschließlich der Normalverteilung, die möglicherweise interessant geformte Bäume erzeugt.

    
Phillip Ngan 08.10.2009 05:23
quelle
2

Der C-Standard schlägt vor:

%Vor%

Als einfacher linearer Kongruenzgenerator (LCG) ist er nicht schlecht (es gibt viele schlechtere Konstantensätze, die Sie verwenden könnten), aber im Vergleich zu anderen Mitgliedern des Universums ist er sicherlich kein guter Pseudozufallszahlengenerator von kryptografischen und nahezu kryptografischen Pseudozufallszahlengeneratoren. Es könnte schlimm genug für dich sein, oder du kannst Knuth Volume 2 konsultieren, um nach anderen schlechten Zahlen zu suchen. (Meine (alte) Kopie von Sedgewick hat ein ziemlich kurzes Kapitel 35 über Zufallszahlen mit einigen Illustrationen von schlechten Konstanten.)

    
Jonathan Leffler 08.10.2009 05:44
quelle
1

Eine Möglichkeit, Clustering einzuführen, während weiterhin gcc verwendet wird, besteht darin, zufällig zwei der zurückgegebenen Zufallszahlen als untere & amp; obere Klammern für eine zufällige Anzahl von Iterationen. Tun Sie dies ein paar Mal und Sie sollten zufällige Clustering erhalten.

    
slashmais 08.10.2009 05:01
quelle
1

Eine C ++ Lösung:

%Vor%

Erzeugt Läufe mit zufälliger Länge von höchstens maxClumpSize-Instanzen desselben Zufallszahlenwerts. (Ich habe das nicht sehr deutlich gesagt ... hoffentlich bekommst du die Idee).

    
Drew Hall 08.10.2009 04:42
quelle
1

Sehen Sie sich diese Zufallsfunktion an:

Ссылка

    
Rick 08.10.2009 06:08
quelle
1

Kapitel 7 der Numerical Recipes in C behandelt eine Vielzahl von Zufallsgeneratoren. Abschnitt 7.7 behandelt Quasi- (dh Sub-) Zufallssequenzen.

    
Andrew 08.10.2009 06:55
quelle
1

Verwenden Sie einen Zufallszahlengenerator ( Wikipedia-PRNG-Seite ) mit Einschränkungen.

Einige andere Möglichkeiten: UChicago , UMich , FSU

    
monksy 08.10.2009 05:20
quelle
0

benutze srand, füge aber einen samen hinzu, der sich nicht viel ändert. Tatsächlich verhalten sich alle Pseudozufallszahlengeneratoren so.

im Grunde, einfach säen Sie es mit 1, dann 2 dann 3 .. ziemlich bald werden Sie sehen, dass die "zufälligen" Zahlen sind nicht so zufällig.

    
Andrew Keith 08.10.2009 04:39
quelle
0

Tatsächlich ist die Funktion rand () wirklich ziemlich schlecht. Ich benutze GameRand , was wirklich einfach ist, und produziert anständige Ergebnisse, aber es kann immer noch nicht beschissen genug für Sie sein.

    
Victor Liu 08.10.2009 04:42
quelle
0

Für crappy randomly-looking Zahlen, und ich brauche normalerweise deterministische Zahlen, berechne ich Sinus und Kosinus einfacher Ausdrücke mit großen ish Werten und Phasenmodulation. Normalerweise erzeuge ich Farben in zwei Dimensionen für Grafikzwecke ("prozedurale Texturen" und all das), also gebe ich ein Beispiel wie im generischen Pseudocode:

%Vor%

Garantiert, dass die meisten ernsthaften Tests der Zufälligkeit fehlschlagen. Die Ergebnisse sind so schlecht, dass sie für die Kunst nützlich sind.

Es macht Spaß, mit solchen Formeln in einer interaktiven Umgebung wie Matlab oder Python mit numpy und matplotlib zu spielen.

    
DarenW 22.01.2010 18:39
quelle