Haftpflicht Blogger
Virtual Server von Host Europe

Java – Zufallszahlen erzeugen

| 31. Dezember 2014 | Keine Kommentare
[vc_row][vc_column][vc_column_text]ZufallszahlenUm Zufallszahlen zu erzeugen, muss man das Rad nicht neu erfinden, sondern kann sich in Java verschiedener Methoden bedienen.

In diesem Blogartikel möchte ich verschiedene Aspekte der Zufallszahlenerzeugung betrachten, Begriffserklärungen und Anwendungshinweise geben.
[/vc_column_text][vc_empty_space height=“6px“][vc_column_text]

Pseudo-Zufallszahlen

In vielen Büchern liest man immer, dass eine Pseudo-Zufallszahl erzeugt wird.

Ist das nicht ein Widerspruch in sich?

Pseudo heißt ja soviel wie „gar nicht wirklich“. Bei der Zufallszahlengenerierung kommt ein Berechnungsalgorithmus zum Einsatz, der beginnend mit einer Startzahl immer eine Folgezahl berechnet. Da die Berechnungsvorschrift somit feststeht, folgt daraus, dass bei gleicher Startzahl immer die gleichen Folgezahlen erzeugt werden.

Die „Zufallszahlen“ sind in dem gewählten Zahlenbereich gleichverteilt, aber bei Kenntnis der Startzahl eben nicht zufällig, sondern starr berechnet. Das kann zum einen ein Nachteil sein, zum anderen jedoch auch als Vorteil genutzt werden.

Beispiel 1: 

Eine Anforderung an einen Test ist, dass dieser beliebig oft wiederholbar ist und immer mit dem gleichem Ergebnis abschließt. Kommt bei einem Test also eine Zufallszahlengenerierung zum Einsatz, so kann es Sinn machen, dass immer wieder die gleichen Zufallszahlen zum Einsatz kommen und der Test damit – trotz Zufallszahlen – reproduzierbar ist.

Beispiel 2: 

Bei Spielen kann es durchaus erwünscht sein, dass gewisse Spielabläufe vorhersehbar sind. Ich kann mich an das Spiel „U-Boot versenken“ erinnern, bei dem immer wieder zu festgelegten Zeiten ein Schnellboot von rechts nach links über den Bildschirm fuhr. Ein „erfahrener“ Spieler konnte sich darauf einstellen, entsprechend agieren, damit einen höheren Punktestand erzielen.

D.h. die „Vorhersehbarkeit“ der Zufälligkeit hat zwar das Spiel einfacher gemacht, aber gleichzeitig auch die Spielfreude erhöht (höherer Punktestand erzielbar) und zum wiederholtem Spielen eingeladen.

Steuerung der Zufälligkeit

Szenario 1:  Zufälligkeit gewünscht

a) „Der parameterlose Standard-Konstruktor von Random initialisiert den Startwert mit der Summe aus einem magischen Startwert und System.nanoTime().“ [1][2]

D.h. ein Random  rand = new Random(); liefert ein Random-Objekt zurück, welches recht zuverlässig unvorhersehbare Zufallszahlen zur Verfügung stellt.  Die Wahrscheinlichkeit, dass ein Random-Objekt zum gleichen Zeitpunkt (nanoTime() ) erzeugt wird, erscheint mir nur theoretischer Natur zu sein.

b) „Kryptografisch bessere Zufallszahlen liefert die Klasse java.security.SecureRandom, die eine Unterklasse von Random ist.“ [1]

Das ist gut zu wissen, dass es noch eine sichere Klasse zur Erzeugung von Zufallszahlen gibt, aber in Anbetracht der reinen theoretischen Natur des Problems von a), erscheint es mir über das Ziel hinausgeschossen und es wäre denkbar, dass dies zu Lasten der Performance geht.

 

Szenario 2:  Reproduzierbare Zufälligkeit gewünscht

Wie kann man nun Einfluß auf die Zufälligkeit nehmen? Das ist ganz einfach. Die Abfolge der Zahlen hängt von der Startzahl ab. Entweder man gibt die Startzahl schon im Konstruktor der Klasse Random mit

oder man setzt die Startzahl danach

[/vc_column_text][vc_column_text]

Random()  oder Math.random()

Man hat in Java drei Möglichkeiten, um an Zufallszahlen zu kommen.

  • Über die Klasse java.util.Random

PRO: Hat viele Stellschrauben zur Erzeugung von Zufallszahlen.

CONTRA: Ein Random Objekt muss erzeugt werden.

  • den Methodenaufruf  Math.random()

PRO: Math.random() ist eine statische Funktion, es muss hierfür kein Math-Objekt erzeugt werden.

CONTRA: Math.random() verwendet intern ein Random-Objekt.

  • und dem Methodenaufruf java.security.secureRandom

PRO: ein höchstmaß an (Standard) Zufälligkeit

CONTRA: überzogen zufällig

 [/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]Siehe auch:

[1]  Galileo openbook: Java ist auch eine Insel, Kapitel 12.5 Random-Klasse

[2]  Oracle Java SE7 API Definition: Class Random[/vc_column_text][vc_column_text]
Bild:  Wikipedia Commons: White dices
[/vc_column_text][/vc_column][/vc_row]

Stichworte: , , ,

Kategorie: Java

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.