Frage von clarapfel, 81

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

Antwort
von MrNaas, 71

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

Antwort
von amdphenomiix6, 60

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.

Kommentar von clarapfel ,

Danke :) Also gibt es keinen Algorithmus, der bei Java immer genommen wird? Und weißt du, wie das mit der Systemzeit genau funktioniert?

Kommentar von amdphenomiix6 ,

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.

Kommentar von clarapfel ,

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

Kommentar von amdphenomiix6 ,

Da steht, wie die Java-Methode random() funktioniert

Kommentar von clarapfel ,

Danke, das habe ich gesucht! :)

Antwort
von W00dp3ckr, 43

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."


Antwort
von wotan38, 28

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.

Antwort
von Schachpapa, 27

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)).
Antwort
von BiggerMama, 39

Math.random()

Keine passende Antwort gefunden?

Fragen Sie die Community