Wie erzeugt Java Zufallszahlen?
Hallo :) Ich schreibe gerade meine Seminarfacharbeit zur Monte-Carlo-Methode und schreibe gerade ein Artikel über Zufallszahlen. Ich finde im Internet zwar die verschiedene Umsetzung im Computer, aber nicht, welche Java benutzt und was so überhaupt am häufigsten angewendet wird. Außerdem würde ich gern wissen, was bei der Monte-Carlo-Methode am häufigsten zur Generation von Zufallszahlen angewendet wird. Bitte helft mir ! Liebe Grüße
6 Antworten
https://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextDouble%28%29
Das ist sehr breit dokumentiert. Schau Dir die Funktion next() an.
Es wird gesagt "This is a linear congruential pseudorandom number generator, as
defined by D. H. Lehmer and described by Donald E. Knuth in
The Art of Computer Programming, Volume 3:
Seminumerical Algorithms, section 3.2.1."
Eine Anmerkung dazu am Rande: Echte Zufallszahlen können nicht durch einen Algorithmus erzeugt werden, nur durch einen Prozess, der dem Zufall folgt. Das können z.B. voneinander unabhängige Vorgänge sein, die miteinander verknüpft nicht vorhersagbare Ergebnisse liefern. Deshalb ist es sehr schwierig, solche mittels Computer zu generieren. Nur einzeln per Tastendruck geht das unproblematisch im begrenzten Zahlenbereich. Für den praktischen Gebrauch kann man aber Pseudozufallszahlen nehmen, da es meistens ausreicht, wenn diese der Normalverteilung unterliegen. Solche kann man durch geeignete Algorithmen erzeugen. Das wird etwa bei einschlägigen Taschenrechnern gemacht.
In den 70ger Jahren hat man sich in den IBM-Labors mal mit einem Verfahren beschäftigt, echte Zufallszahlen aus dem atmosphärischen Rauschen zu gewinnen (habe das damals irgendwo gelesen). Ob das jemals zu praktischen Anwendungen geführt hat, weiß ich leider nicht.
Also es gibt in Java erst mal 2 Mir bekannte Standard Möglichkeiten Zufallszahlen zu erzeugen.
1. Über die Math.random() Methode
2. Mithilfe der Random Klasse
Ich weiß nicht genau welcher Algorithmus da genutzt wird, aber das sind erstmal die mir bekannten, in der JDK mitgelieferten Methoden.
Dann gibt es sicherlich auch noch eine ganze Reihe Libraries mit denen man Zufallszahlen auf verschiedenste Weise erzeugen kann. Ich will damit nur sagen es gibt in Java nicht "die" Umsetzung für Zufallszahlen sondern meherere
Ein Blick in die API hilft:
http://docs.oracle.com/javase/7/docs/api/java/util/Random.html
Dort:
The method next
is
implemented by class Random
by atomically updating the seed to
(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
and returning
(int)(seed >>> (48 - bits))
.
Meistens werden so genannte "Pseudozufallszahlen" erzeugt. Dies kann zum Beispiel durch bestimmt Algorithmen geschehen, wie Restklassenrechnung. Meistens wird irgendein nicht zufälliger Startwert, wie zum Beispiel die Sytemzeit genommen. Um wirklich zufällige Zahlen zu erhalten, muss auch ein zufälliges Ereignis, wie etwa der Zerfall eines Isotops vorliegen.
Ich weiß nicht, wie die Random-Methode in Java implementiert ist, das kann man aber sicher nachschauen. Nun, das einzige, was es bei Zufallszahlen wirkich zu beachten gibt, ist die Normalverteilung. Diese werden durch bestimmte Algorithmen sicher gestellt. Jedoch brauchen diese auch einen zufälligen Startwert, um zu arbeiten. Dies kann zum Beispiel die Systemzeit sein. Wie genau diese Algrithmen im Detail arbeiten, ist unterschiedlich und kann in Wikipedia nachgelesen werden, bzw. in Fachliteratur zitiert.
Ich hatte im Netz schon geschaut, aber es wird einem nie gesagt, wie die Algorithmen in Java funktionieren, sondern nur, wie man sie anwendet. Aber vielen Dank, jetzt habe ich zumindest schonmal einen weiteren Anhaltspunkt zum Suchen
Danke :) Also gibt es keinen Algorithmus, der bei Java immer genommen wird? Und weißt du, wie das mit der Systemzeit genau funktioniert?
Da steht, wie die Java-Methode random() funktioniert