Zufallszahlen mit Math.random() - java

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die zweite Frage zuerst: Die Logik hinter der Funktion verstehen zu wollen, ist ein ehrgeiziges Ziel, der Algorithmus dürfte nämlich ziemlich kompliziert sein. Auf Basis eines sich stetig verändernden Wertes, meistens der Systemzeit in Sekunden oder Milisekunden, wird über diesen komplizierten Algorithmus eine Zahl errechnet, die möglichst schwierig vorhersagbar ist. (Wer den genauen Algorithmus kennt, kann die Zahl natürlich theoretisch vorhersagen. Deshalb nennt man computergenerierte Zufallszahlen auch Pseudozufallszahlen.)

Es ist aber auch gar nicht nötig, die Logik genau zu kennen. Das ist ja (unter anderem) Sinn und Zweck der objektorientierten Programmierung. Du musst als Programmierer nur wissen, dass es die Funktion gibt, welche Eingangsdaten sie von dir erwartet, und welche Daten sie zurückgibt. Wie sie das macht, ist für dich unerheblich.

Damit kommen wir zur ersten Frage: Dir scheint die Nutzung nicht ganz klar zu sein. Math.random() gibt eine pseudozufällige Zahl zwischen 0 und nicht ganz 1 zurück. Da du in den meisten Anwendungsfällen keine 0-komma-irgendwas Zahl haben wollen wirst, sondern eine ganze Zahl, multiplizierst du diese Rückgabe mit der Zahl, die dein Maximum darstellt und castest das ganze nach int, damit der Nachkommaanteil abgeschnitten wird.

Da aber die zurückgegebene Zahl immer kleiner als 1 ist, wäre die multiplizierte und gecastete Zahl auch immer um 1 kleiner, als dein gewünschtes Maximum. Deshalb addierst du die 1.

Damit ist auch klar, warum dein "x 68 + 18" nicht wie gewünscht funktioniert. Das Verhalten, das du erreichen möchtest, dürfte nicht ganz so einfach zu realisieren sein. Eine Idee, die ich spontan hätte, wäre, dein Math.random() in eine Schleife zu stecken und so lange zu wiederholen, bis dein gewünschtes Minimum überschritten ist. Also ungefähr sowas:

meineZufallszahl = 0;
while (meineZufallszahl < 18) {
    meineZufallszahl = (int)(Math.random() * 68 + 1);
}

Nicht besonders sauber und wahrscheinlich gibt es auch viel effizientere und elegantere Möglichkeiten, würde aber funktionieren.

lucsyder95 
Fragesteller
 25.04.2013, 15:00

WOW vielen Dank für die tolle Erklärung. Ich habe die Funktion in eine Schleife gepackt, in der der User die Schleifenlänge eingeben kann. Dann habe ich 2 Variablen erstellt, die den höchsten und den niedrigsten Wert speichern. mit (int)(Math.random()*50+18 hat es dann funktioniert) :)

1
dergutekoenig  25.04.2013, 15:08
@dergutekoenig

...obwohl... Moment! Wenn Math.random() in 0,1-er Schritten arbeitet (dazu habe ich in der API-Doc nichts gefunden), würdest du mit deiner Methode nicht alle Zahlen zwischen 18 und 68 erreichen können. Ganz so simpel ist es also wohl nicht. Ein paar Zahlen in dem Bereich würden dann wohl außen vorbleiben. Ob das für dein Programm eine Rolle spielt, musst du selbst entscheiden. Streng genommen aber wäre das ein Bug.

0
dergutekoenig  25.04.2013, 15:12
@dergutekoenig

...und nochmal 'Moment!'. Das wäre ja bei Math.random() * 68 + 1 genauso. Und so schlampig werden die Entwickler bei Sun / Oracle kaum arbeiten. :-D Die Schrittweise von Math.random() ist mit Sicherheit kleiner als 0,1. Vergiss den letzten Kommentar also einfach. ;-)

0

Das ist eine gute Methode für eine Zufallszahl zwischen zwei Zahlen:

int zufallszahl(int min, int max) {
		return (int) (Math.random() * (max - min + 1) + min);
	}

Wenn du nun also eine Zufallszahl zwischen zwischen 18 und 68 ausgeben lassen möchtest:

System.out.println(zufallszahl(18,68));

Math.random() gibt eine Zahl zwischen 0, inklusiv und 1, exklusiv zurück.

(int)(Math.random()*68+18); liefert zwischen 18 und 84, weil zu 18 eine zufällige Zahl zwischen 0 und 68 dazugezählt wird.

Wenn du willst, dass die Ergebnisse zwischen 18 und 68 sind, musst du also zu 18 (68-18), also 50 hinzuzählen.

(int)(Math.random()*50+18)

lucsyder95 
Fragesteller
 25.04.2013, 14:31

Danke für die ausführliche Erklärung :) DH

0

Hast du es schon mal mit (int)(Math.random()*50+18); versucht???

lucsyder95 
Fragesteller
 25.04.2013, 13:56

danke es funktioniert jetzt :)

0
appletman  25.04.2013, 14:10
@lucsyder95

...und du bist auch sicher, dass er nie über die 68 hinauskommt und niemals kleiner als 18 wird?

0