optimale Java Random seed
In Bezug auf die Bereitstellung der long
zu Samen java.util.Random
, wenn ich instanziieren Sie das Objekt einmal, es scheint, dass, wenn ich nur die Zeit nehmen, so wie ein samenkorn, das wird zufriedenstellend für die Lebensdauer des Programms, die für meinen Zweck bedeutet, dass das Ergebnis einer Reihe von anrufen, die an nextDouble()
sieht random.
Nehme an aus Gründen der Einfachheit des Codes, instanziiere ich Random
verwenden Sie es mehrmals, dann re-instanziieren, und wiederholen Sie. Wenn das Saatgut wird bereitgestellt, ebenso die Samen werden ähnlich sein und steigt, weil es basiert auf der Zeit. Das steigert sich, wird klein sein im Vergleich zu dem Wert, wenn es die Anzahl der Sekunden seit dem 1. Januar 1970. (Edit: Diese Frage wurde in dem Jahr 2011.)
Wenn ich die Kette Ausgabe von nextDouble()
hat die re-Instanziierung Random
mit einer nicht-zufälligen Zeit-basiert Saatgut verursachen eine subtile Muster erscheinen in der zusammengesetzten Kette der Ausgabe von nextDouble()
. Ein weiterer Weg, um die phrase auf diese Frage ist: brauche ich einen Samen gezogen, einheitlich aus der Gruppe der long
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie wahrscheinlich Wahrscheinlichkeit in einer situation wie dieser, wo Sie tatsächlich erhalten erhalten den gleichen Samen, besonders, wenn Sie entstanden sind, in der gleichen Millisekunde. Einige Maschinen haben eine Auflösung so niedrig wie 15 Millisekunden oder mehr, so wird es ein noch größeres problem.
Einen Weg ein, um dieses zu verwenden
Math.random()
. Er verwendet einen systemweiten random-Instanz, die immer nur instanziiert das erste mal es verwendet wird. Ich glaube nicht, dass Sie Zugriff auf die zugrunde liegende Instanz, so dass Sie nicht verwenden können, es zu bekommennextInt()
aber Sie könnenMath.random()
für Doppel -, oder wenn Sie wirklich wollen, Ihr eigenes Random-Objekt, erhalten Sie einedouble
ausMath.random()
konvertieren Sie Ihre bits in einemlong
und verwenden, dielong
wie Sie Ihr Saatgut für die neueRandom
.Oracle docs für zufällig gefunden werden kann hier.
System.currentTimeMillis()
und ich wurde ganz bewusst die inneren Samen, die es hält. Ich nehme an, ich konnte sehen, einige nutzen für die Umgestaltung dieses in der Weise, dass für Testzwecke, die Sie konsequent bekam die gleichen Samen, aber das ist eine Strecke. Ich auf jeden Fall zugeben, dass diese Antwort beruhte auf einer fehlerhaften Annahme. Aber wir sind alle hier um zu lernen, richtig? 🙂nanoTime
und der Zähler für genau diesen Zweck? Also, die Leute nicht zu tun, dumme stunts wie diese, um gut random Generatoren?Den automatisch generierten random seed verwendet wird.nanoTime und einen Zähler, um sicherzustellen, es ist immer anders. IMHO, gibt Es keine Notwendigkeit zu spielen, mit der Saat zu verbessern Zufälligkeit
Random nutzt einen 48 bit seed und das wiederholt sich alle 2^48 fordert, was bedeutet, es kann nicht jede mögliche
long
oderdouble
Wert.Über Unordnung mit den Samen klingt ein bisschen wie triple zufällige Strategien, die nicht wirklich helfen. http://thedailywtf.com/Articles/Random-Char-and-TriplyRandom-Double.aspx
Wenn Sie wollen mehr Zufälligkeit, verwenden Sie SecureRandom, die nicht geben Sie die gleiche zufällige Abfolge, auch wenn Sie es einem Ausgangswert von 1, wie jedes mal. Dies kann produzieren alle möglichen
long
unddouble
Wert.Kommt es auf den generator, aber natürlich, in meiner Erfahrung, eine kleine änderung an den Samen hat einen großen Einfluss auf die Werte, die generiert werden.
Es kann gut sein, nachweisbar mit ein bisschen Arbeit, aber, es sei denn, du machst das high-end-statistische Arbeit oder Kryptographie, die es nicht machen ein wenig Unterschied.
In jedem Fall, wenn Sie wurden, in dieser Art von Domäne, die Sie hätten hardware-basierten random number generation, wahrscheinlich mit so etwas wie der 3 kelvin hintergrund Strahlung für eine Quelle 🙂
Nine. Nine. Nine. Nine. Nine.
das ist das Problem mit zufällig, das kann man nie wissen!Random random = new Random(441287210); for(int i=0;i<10;i++) System.out.print(random.nextInt(10)+" "); }
Drucke1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
hat die gleiche Wahrscheinlichkeit wie3 1 4 1 5 9 2 6 5 3
oder2 7 1 8 2 8 1 8 2 8
.