Frage

Nach dieser Antwort zu lesen: beste Weg, um eine zufällige Teilmenge aus einer Sammlung holen ?

Es hat mich gefragt, wie kann man einen zufälligen Samen in Java wählen?

Und nicht Gebrauch System.currentTimeMillis () oder System.nanoTime () sagen. Lesen Sie den Artikel zu sehen, warum nicht.

Das ist eine schwierige Frage, aber lassen Sie mich es schwieriger machen. Angenommen, Sie haben einen zufälligen Samen erzeugen, müssen ohne eine Verbindung zum Internet, ohne Benutzereingabe zu verwenden (IE, gibt es keine GUI), und es hat Cross-Plattform sein (also keine JNI-Hardware zuzugreifen).

Gibt es einige JVM Variablen, die wir als Quelle unserer Zufälligkeit überwachen kann?

Kann dies geschehen? Oder ist es unmöglich?

War es hilfreich?

Lösung

Hier finden Sie aktuelle Uncommons Maths (vollständige Offenlegung: Ich schrieb es). Es sollte die meisten Probleme lösen, die Sie jemals mit Zufallszahlen in Java haben werden.

Auch wenn Sie es nicht verwenden sollten Sie in der Lage sein, einige Ideen aus den verschiedenen SeedGenerator Implementierungen es bietet. Im Grunde ist es standardmäßig mit / dev / random . Wenn das nicht existiert (zB Windows) entweder versucht, Daten zum Download von random.org oder es verwendet SecureRandom.generateSeed .

Ich denke, SecureRandom.generateSeed ist das Beste, was Sie, ohne sich auf etwas plattformspezifische oder im Internet tun können.

Andere Tipps

Kombinieren System.currentTimeMillis() mit einem globalen Zähler, die Sie jedes Mal wenn Sie den Samen erzeugen erhöhen. Verwenden Sie Atomic für den Zähler, so können Sie mit Effizienz und Thread-Sicherheit erhöhen.

„Combine“ bedeutet nicht „add“ oder „xor“, weil es zu einfach ist, Duplikate zu erhalten. Stattdessen Hash. Man könnte kompliziert und stopft die langen und die Zähler in z.B. 16 Bytes und MD5, aber ich würde wahrscheinlich eine 64-Bit-Version des Adler CRC oder eines anderen 64-Bit-CRC .

Um, dass Artikel sagt, dass 32-Bit-Samen schlecht sind, aber 64-Bit-Samen sind gut. System.currentTimeMillis () ist ein 64-Bit-Samen.

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