In einer kürzlichen Antwort wurde die Verwendung von Fortuna- oder Mersenne-Twister- Zufallszahlengeneratoren ( RNGs ) zur Erstellung einer Monte-Carlo-Simulation erwähnt . Ich hatte vorher noch nie von Fortuna gehört, also habe ich es nachgeschlagen - es scheint hauptsächlich für kryptografische Zwecke gedacht zu sein.
Ich verwende derzeit einen Mersenne Twister im Produktionscode, um einen K-Means-Algorithmus zu erstellen.
Welches (Fortuna oder Mersenne Twister) eignet sich am besten für "algorithmische Seeding" -Anwendungen (z. B. Seeding von Monte Carlo und K-Means)? Oder ist es ein "toss up" - dh am bequemsten zu benutzen.
Von meinem Platz aus sollte "best" Zufallszahlen von höchster Qualität liefern, schnell arbeiten und (möglicherweise) einen geringen Speicherbedarf haben. Qualität ist für die meisten von uns wahrscheinlich das Wichtigste.
quelle
RAND_MAX=32768
mögliche Werte. Ich benutze derzeit MT für Monte Carlo Raytracing Sim. Ich sehe MT jedoch nicht als Leistungsengpass in meinem Profiler, wahrscheinlich, weil ich Dinge wie Strahlrichtungen als Vorprozess "zufällig" generiere . Zum Beispiel könnte ich beim Start ein Array mit 100.000 Strahlen erzeugen, diese in einem Array speichern und zur Laufzeit zufällig die Startposition des Arrays auswählen (etwa 10.000 Strahlen der Sammlung). Dies hat einen relativ hohen Speicheraufwand im Austausch für gute Zufallszahlenverteilungen.Antworten:
Nun, alles ist ein Kompromiss. Für Zufallsgeneratoren gruppiere ich sie in drei grundlegende Kategorien:
Lineare kongruente PRNGs (die Methode, die in den meisten Bibliotheken allgemein angewendet wird) gehören eindeutig zur Kategorie 1. Sowohl Fortuna als auch Mersenne Twister gehören eindeutig zur Kategorie 2.
Für einen interessanten Artikel darüber, wie durcheinander ein Mischalgorithmus Sie Ihre Firma / Ihr Casino kosten kann, empfehle ich diesen Artikel aus dem Jahr 1999 . Aufgrund von Link Rot sind die Bilder verschwunden, aber Abbildung 4, in der Sie die nächste Nummer aus dem PRNG gegen die zuvor erzeugte Nummer plotten, besteht aus einer Reihe paralleler Linien.
Wie JM betont, ist Fortuna langsam. Wie Sie bereits betont haben, ist Mersenne Twister recht schnell.
quelle
Die Standardeinstellung in der Kategorie "kryptografisch" ist meiner Meinung nach Blum-Blum-Shub . Wie die Wikipedia-Seite bereits sagt, ist dies nicht für Simulationen geeignet, da es einfach zu langsam ist.
Wenn Sie auf einem Unix-ähnlichen System arbeiten, können Sie auch erwägen, Ihre Zufallszahlen direkt von / dev / urandom abzurufen , dem Betriebssystemdienst, der Zufallszahlen in guter (wenn auch nicht unbedingt in Krypto) Qualität bereitstellt. Je nach verwendetem Betriebssystem wird möglicherweise der Yarrow-Algorithmus verwendet, von dem Fortuna eine Variante ist. Der interessanteste Aspekt ist jedoch, dass das Betriebssystem Zugriff auf einige echte Zufallszahlen hat: z. B. thermisches Rauschen von internen Temperatursensoren. In der Regel werden diese Daten immer dann in den Zufallspool gemischt, wenn sie verfügbar sind, damit die Daten nicht vorhersehbar sind.
Dieses Konzept der Zufallsmischung legt nahe, dass es möglich sein könnte, das Beste aus beiden Welten wie folgt zu erzielen. Verwenden Sie einen schnelleren Zufallszahlengenerator guter Qualität wie Mersenne als Basis-RNG. Pflegen Sie auch einen zweiten Zufallszahlengenerator mit besserer Qualität - z. B. Fortuna. Alle so vielen Zahlen, sagen wir 25, führen eine Iteration des besseren RNG durch und addieren das Ergebnis in den Zustand Ihres Basis-RNG. Auf diese Weise erhalten Sie eine relativ hohe Leistung und Ergebnisse von relativ hoher Qualität. (Ich würde vermuten, dass es für Krypto nutzlos wäre, da die Stärke dieses zusammengesetzten Generators durchaus die Stärke des schwächsten Glieds sein könnte. In Simulationen, in denen Sie normalerweise keinen böswilligen Gegner haben, funktioniert es jedoch möglicherweise.)
quelle
Ich wollte mich einschalten, um zu sagen, dass ich diesen Prozess kürzlich mit einer Simulation durchlaufen habe, und ich sollte beachten, dass die Verwendung von Fortuna nicht ausgeschlossen ist, wenn es wirklich notwendig ist. In unserem Fall befürchteten wir, dass die MT-Entropie nicht hoch genug ist, was sich in unserer Simulation in einer Verzerrung niederschlägt. Für unsere Simulation haben wir also Fortuna verwendet, um ungefähr 65 Milliarden Zufallszahlen aus diesem Algo zu ziehen. Computer sind schnell, wenn Sie es wirklich brauchen, können Sie sie verwenden, wenn Sie einen Grund haben. Wenn Sie nur so etwas wie eine Integration mit Monte Carlo machen, bleiben Sie bei MT.
quelle
Ich denke, die Antwort hängt stark von der Anwendung ab, für die Sie das RNG verwenden möchten. Ich würde eine vierte Kategorie für Tangurenas grobe Klassifizierung vorschlagen: "Gut ohne wirklichen Gewinn".
Für viele Anwendungen spielt es möglicherweise keine Rolle, und ein ordnungsgemäß kryptografisch einwandfreies RNG kann Ihre Aufgaben verlangsamen, ohne dass dies zu einer entsprechenden Erhöhung der Gültigkeit führt. Zum Beispiel erfordert ein Großteil meiner Forschung nur viele, viele Millionen Zahlen, die ungefähr aus einer von mir angegebenen Verteilung stammen. Fast jedes RNG wird funktionieren, also brauche ich nur eines, das nicht so katastrophal arm ist, dass es als RNG wertlos ist . Alles andere verlangsamt die Arbeit nur unnötig. Ich benutze normalerweise Mersenne Twister, aber das liegt einfach daran, dass es gut genug funktioniert, ich habe den Code und es ist einigermaßen schnell.
quelle