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).
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.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.
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.)
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.
Kapitel 7 der Numerical Recipes in C behandelt eine Vielzahl von Zufallsgeneratoren. Abschnitt 7.7 behandelt Quasi- (dh Sub-) Zufallssequenzen.
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.
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.
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.
Tags und Links algorithm language-agnostic random