Verstehe ZufallInt = (int) (Math.random() * 5 + 1); nicht

Berg

Mitglied
Liebe Forenmitglieder,
...wieder eine Verständnisfrage eines Anfängers, mit der Bitte um Hilfe...

Mein eigentliches Ziel war es einen Zufallszahl zwischen 0 und 6 zu generieren - einen Würfelersatz eben.
Zuerst habe ich die Randomzahl mit double deklariert und dann gemerkt, dass das mit dem Runden und dem Abschneiden auf eine Stelle gar nicht so einfach ist(für einen Anfänger).
bin ich

Java:
package paket1;
import java.lang.Math;

public class Berg 
{
	public static void main(String[] args) 
	{
		double Zufallszahl_nackt, Zufallszahl, a, b, c;
		
			Zufallszahl_nackt = Math.random();
			Zufallszahl = (Zufallszahl_nackt * 5+1);
			
			a = Math.round(Zufallszahl);
			b = Math.floor(Zufallszahl);
			c = Math.ceil(Zufallszahl);
			
			System.out.println("Zufallszahl_nackt=  "+ Zufallszahl_nackt + " liefert eine zufällige Kommazahl zwischen 0 und 1");
			System.out.println("Zufallszahl=             "+ Zufallszahl + " mit ....*5+1 wird eine Kommazahl zwischen 1 und 6 daraus"); 
			System.out.println("Zahl mit round =      "+ a +" rundet ab dem Wert x,5 auf, sonst ab - 'schönes' mathematisches Runden - aber es bleibt eine Kommazahl mit x,0");
			System.out.println("Zahl mit floor =        "+ b +" liefert die nächst kleinere ganze Zahl, die kleiner oder gleich der Zahl ist");
			System.out.println("Zahl mit ceil =         "+ c + " liefert die nächst größere ganze Zahl\n");

//Ausagebbeispiel:
//Zufallszahl_nackt=  0.4657391783913212 liefert eine zufällige Kommazahl zwischen 0 und 1
//Zufallszahl=             3.328695891956606 mit ....*5+1 wird eine Kommazahl zwischen 1 und 6 daraus
//Zahl mit round =      3.0 rundet ab dem Wert x,5 auf, sonst ab - 'schönes' mathematisches Runden - aber es bleibt eine Kommazahl mit x,0
//Zahl mit floor =        3.0 liefert die nächst kleinere ganze Zahl, die kleiner oder gleich der Zahl ist
//Zahl mit ceil =         4.0 liefert die nächst größere ganze Zahl


Dann bin ich über folgende Lösung in einem Buch gestolpert.
Die funktioniert zwar hervorragend und macht genau das was ich will...
...ich verstehe aber leider die Syntax gar nicht...


Java:
// Will man eine ganze Zahl (z.B. wie von einem Würfel) dann empfiehlt sich folgende Vorgehensweise	
			
int ZufallInt;
ZufallInt = (int) (Math.random() * 5 + 1);
System.out.println("ZufallInt=                 "+ ZufallInt);
	}
}

>>> Könnt ihr mir bitte diese ersten zwei Zeilen erklären?
>>> Warum kann man denn den Code nicht wie folgt in zwei Zeilen aufteilen?

Java:
z = (int) (Math.random() * 5 + 1);
ZufallInt = (z);

>>> Wo in der Java API Docu findet man denn die Definition des Befehls (int) (...was immer das an der Stelle auch ist)?

Vielen Dank & viele Grüße
Berg
 

DrZoidberg

Top Contributor
Das hier
(int)...
nennt sich "cast"
Typumwandlung ? Wikipedia
JAVA-Doku Casting
Die Zahl wird nach int gecastet. Dabei wird immer abgerundet.
Also
Java:
double a = 1.99;
int b = (int)a;
Ergibt 1 und nicht 2.

Math.random erzeugt einen double Wert zwischen 0 und 1, wobei aber niemals genau 1 rauskommt. Der Wert ist immer kleiner als 1. Also genau genommen erzeugt Math.random einen Wert zwischen 0 und 0.9999999999999999
Wenn du das jetzt mit 6 (nicht 5) multiplizierst und 1 addierst, erhältst du einen double Wert zwischen 1 und 6.999999999999999. Castest du das dann nach int wird abgerundet und du hast dann einen Wert zwischen 1 und 6.
Java:
int z = (int)(Math.random() * 6 + 1);
 
Zuletzt bearbeitet:

Phash

Top Contributor
Java:
z = (int) (Math.random() * 5 + 1);

z = -> Zuweisung
(int) -> ein cast auf Int. Math.random() liefert ein double - der Cast auf einen Integerwert, schneidet in Java einfach alles nach dem Komma ab. Die Kommazahl wird durch abrunden auf eine Ganzzahl gebracht.

Math.random() -> ausfuehren der statischen Methode "random()" der Kasse Math.

*5 -> ergibt Zahlen, die zwischen 0 und 6 liegen

+1 -> ein Wuerfel hat ja keine 0, sondern eine 1 und er hoert bei 6 auf und nicht bei 5.
Da der Wertebereich der vorherigen Rechnung 0<x<6 ist, musst du ihn um eins erhoehen um Zahlen von 1-6 zu erhalten (durch Abrundung! das heisst auch 6.99 wird 6 und alles mit einer 0 vorne dran wuerde zur 0)
 

Pentalon

Bekanntes Mitglied
Hi Berg

Der Datentyp INT speichert nur den Wert VOR dem Komma.
Das ist bei 0.12345 exakt 0 :)
Wenn Du jetzt eine Zahl zwischen 1 und 5 haben möchtest multiplizierst Du die Zahl die Math.random dir zurückgibt mit 5.
Dann hast Du eine Fliesskommazahl zwischen 0 und 4.9999999. Du möchtest aber eine Zahl zwischen 1 und 5, also addierst Du noch eine 1 hinzu. Damit hast Du eine Fliesskommazahl zwischen 1 und 5.99999999, dass speicherst Du mit dem cast in Deine int Variable:

Java:
ZufallInt = (int) (Math.random() * 5 + 1);

und Du hast eine Zahl zwischen 1 und 5.

Das (int) ist, wie oben schon gesagt wurde ein Cast (Umwandlung des Datentyps) die notwendig ist, da die Zahl von Math.random() eine Fliesskommazahl ist und Du sie in einem Int speichern möchtest.

Pentalon
 
H

hüteüberhüte

Gast
Boah Leute, das kann man ja nicht mit ansehen:

Java:
int z = (int) (Math.random() * 6.0) + 1;

Wisst ihr, dass double Addition eine sehr sehr ungenau Angelegenheit ist?
 

Berg

Mitglied
...danke an alle für die flotten und detaillierten Erklärungen !!!
...jetzt kann ich nicht nur casten...sondern weiß auch was es ist ;-)

...jetzt kam eben noch der Kommentar von hüteüberhüte rein...
...ist in diesem Beispiel (Zufallszahl) eine Rechenungenauigkeit relevant?
...gibt es hier einen Vorschlag der offensichtlich besser ist...und allen von euch, ausser mir, bekannt ist?

Vielen Dank & viele Grüße
Berg
 

DrZoidberg

Top Contributor
...ist in diesem Beispiel (Zufallszahl) eine Rechenungenauigkeit relevant?
Eine Rechenungenauigkeit könnte dazu führen, dass manchmal eine 7 rauskommt obwohl es nie mehr als 6
sein sollten.
...gibt es hier einen Vorschlag der offensichtlich besser ist...und allen von euch, ausser mir, bekannt ist?
Nun - wir wollten es ja eigentlich geheim halten aber ich verrats dir trotzdem.
Du kannst auch schreiben
Java:
import java.util.Random;
...
Random rand = new Random();
int z = rand.nextInt(6)+1;
 
H

hüteüberhüte

Gast
... und dann daran denken, am besten während der gesamten Laufzeit nur eine Instanz von Random zu benutzen. ;) (Ich möchte auch ein Danke, mein Hinweis war nicht falsch, und hin und wieder Danke-Bettelei. :D ) Grüße!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
nbergmann x /= n : Verstehe ich nicht. Java Basics - Anfänger-Themen 24
S Schulaufgabe - verstehe leider die Aufgabe nicht Java Basics - Anfänger-Themen 4
ZH1896ZH Verstehe verschieden Scanner und hasNext() nicht ganz Java Basics - Anfänger-Themen 2
ZH1896ZH OOP Verstehe nicht was der Hinweis bedeutet, bitte um Hilfe! Java Basics - Anfänger-Themen 2
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
A Shopping Cart Programm. Verstehe einige Zusammenhänge nicht Java Basics - Anfänger-Themen 1
T Brauche Hilfe um ein Programm zu verstehe Java Basics - Anfänger-Themen 4
K Erste Schritte Ich verstehe das Summenprogramm nicht Java Basics - Anfänger-Themen 10
S Ich verstehe die RegEx Tabelle von Javadoc nicht so ganz Java Basics - Anfänger-Themen 3
V Erste Schritte Array.length[x] in einer Schleife - ich verstehe das nicht Java Basics - Anfänger-Themen 1
Y Erste Schritte Ich verstehe this. nicht so richtig Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Methoden Verstehe Feheler nicht! Java Basics - Anfänger-Themen 7
Henri ich verstehe gerade nicht die Methode Java Basics - Anfänger-Themen 6
dave253 Ich verstehe folgenden Code nicht.. Java Basics - Anfänger-Themen 12
V Verstehe die Lösung einer Aufgabe von Grunkurs-Java nicht. Java Basics - Anfänger-Themen 11
J Verstehe die NullPointerException nicht Java Basics - Anfänger-Themen 1
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
P Verstehe Lösung einer Aufgabe von "Grundkurs-Java" nicht Java Basics - Anfänger-Themen 5
O Ich verstehe nicht, was Eclipse von mir will Java Basics - Anfänger-Themen 10
G Methoden Verstehe nicht was in der Methode gemacht wird? Java Basics - Anfänger-Themen 5
M Verstehe das Programm(Quellcode) nicht!! Java Basics - Anfänger-Themen 12
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
F verstehe diese Variable nicht... Java Basics - Anfänger-Themen 4
A Codezeile die ich nicht verstehe Java Basics - Anfänger-Themen 7
Pentalon Ein Aufruf den ich nicht verstehe Java Basics - Anfänger-Themen 11
V Verstehe die Logik nicht ... Java Basics - Anfänger-Themen 30
C rekursive Methode verstehe nicht! Java Basics - Anfänger-Themen 3
B verstehe methode nicht methode Java Basics - Anfänger-Themen 2
B Erste Schritte Verstehe das nicht Java Basics - Anfänger-Themen 3
C verstehe get und set nicht Java Basics - Anfänger-Themen 3
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
T ich verstehe array nicht! Java Basics - Anfänger-Themen 11
P for Schleife mit break, verstehe die Ausgabe nicht Java Basics - Anfänger-Themen 6
A Verstehe readLine()-Funktion nicht Java Basics - Anfänger-Themen 3
A Verstehe das GUI nicht! Java Basics - Anfänger-Themen 7
D Verstehe Zusammenhang nicht- Und ihr? Java Basics - Anfänger-Themen 4
M THREADS - Ich verstehe es nicht Java Basics - Anfänger-Themen 10
T Verstehe Bufferreader prinzip nicht Java Basics - Anfänger-Themen 3
E I-JVM verstehe ich das richtig (bytecode aufgabe) Java Basics - Anfänger-Themen 2
M Verstehe Aufgabe nicht, wie kann man schleifen einbauen? Java Basics - Anfänger-Themen 5
N Verstehe Step10 bei jME Eclipsetutorial nicht Java Basics - Anfänger-Themen 4
L Verstehe den Wert nicht! If-Anweisung Java Basics - Anfänger-Themen 5
N Verstehe diese Aufgabe nicht! Java Basics - Anfänger-Themen 16
Rudolf Verstehe das Ergebnis nicht - bitte erklären Java Basics - Anfänger-Themen 7
S Finde den Fehler nicht/ verstehe Anweisung nicht Java Basics - Anfänger-Themen 12
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
C Verstehe Code-Teil nicht. Java Basics - Anfänger-Themen 2
S Ich verstehe diese Methode nicht! Java Basics - Anfänger-Themen 6
G Verstehe das nicht. bitte um hilfe Java Basics - Anfänger-Themen 13
R Thread startet nicht, verstehe nicht warum Java Basics - Anfänger-Themen 2
R Verstehe die Ausgabe von folgendem Code nicht Java Basics - Anfänger-Themen 4
A verstehe aufgabenstellung nicht! Java Basics - Anfänger-Themen 47
S verstehe den fehler nicht Java Basics - Anfänger-Themen 14
C Verstehe die Syntax nicht! Java Basics - Anfänger-Themen 2
M Verstehe den Quellcode nicht ganz Java Basics - Anfänger-Themen 3
7 Verstehe Programm nicht Java Basics - Anfänger-Themen 6
G verstehe das problem nicht :( Java Basics - Anfänger-Themen 4
S RegEx Syntax - ich verstehe sie einfach nicht! Java Basics - Anfänger-Themen 3
G verstehe den unterschied zwischen equals und == nicht Java Basics - Anfänger-Themen 3
E Verstehe eine Schleife nicht Java Basics - Anfänger-Themen 5
B Eine Linie zeichnenmit Java, ich verstehe das einfach nicht Java Basics - Anfänger-Themen 4
G Verstehe einen Aufruf absolut nicht Java Basics - Anfänger-Themen 2
P 2n Potenzieren ohne Math.pow oder pow Java Basics - Anfänger-Themen 8
J Math.Random Java Basics - Anfänger-Themen 9
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
W Bestimmte Zahlen bei Math.random ausschließen? Java Basics - Anfänger-Themen 31
S Math.random funktioniert nicht Java Basics - Anfänger-Themen 5
alialhajhossein math.random Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
D Wahrscheinlichkeiten mit Math.random() Methode Java Basics - Anfänger-Themen 1
A Random Double mit Math.round() runden? Java Basics - Anfänger-Themen 1
B Math.random mit Boolean array? Java Basics - Anfänger-Themen 17
B Potenzrechnung mit WindowBuilder ohne math.pow() Java Basics - Anfänger-Themen 1
I math.random Grenzwerte Java Basics - Anfänger-Themen 2
E Methoden Math.Random() kürzen ? Java Basics - Anfänger-Themen 2
B Potenzen ohne Math.pow Java Basics - Anfänger-Themen 4
N Datentypen Math.floor rundet nicht ab Java Basics - Anfänger-Themen 4
J Klassen Math && Random: wie zufällig sind Zufallszahlen? Java Basics - Anfänger-Themen 19
S Math.ceil für float Java Basics - Anfänger-Themen 1
J Methoden Math.random unklar Java Basics - Anfänger-Themen 4
Thorwine Erste Schritte Wuerfelspiel mit Math.random() Java Basics - Anfänger-Themen 10
S Math.random() Zufall ? Java Basics - Anfänger-Themen 2
H Ist Math.Random() eine Methode oder ein Methodenaufruf (Klausurfrage) Java Basics - Anfänger-Themen 4
M Warum ist dieses Feld der Klasse Math immutable? Java Basics - Anfänger-Themen 7
X Problem mit Math.random() Java Basics - Anfänger-Themen 2
S math Methoden in Java (quadrat) Java Basics - Anfänger-Themen 7
T Random vs. Math.random() Java Basics - Anfänger-Themen 2
C Erste Schritte Math.sin und Co. funktionieren nicht Java Basics - Anfänger-Themen 5
A Potenzen ohne math.pow Java Basics - Anfänger-Themen 1
L Klassen Point- und Math-Klasse Java Basics - Anfänger-Themen 3
J Musterlösung Verständnis Frage zu Math.abs() Java Basics - Anfänger-Themen 5
J java.lang.math asin() Java Basics - Anfänger-Themen 18
T Zufallserzeugung mit math.random und speichern in array Java Basics - Anfänger-Themen 29
L Math.floor und double Array Java Basics - Anfänger-Themen 13
J Woher kommt das Objekt "Math" bei Math.random(); ? Java Basics - Anfänger-Themen 3
P Typecasting für Ganzzahlige Zufallszahl (Math.random) Java Basics - Anfänger-Themen 2
B Math.acos() Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben