WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 03.03.2002, 16:07   #1
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard java - dummiefrage über Math.random()

nur rein interessehalber möchte ich folgendes wissen:

wenn ich eine zufallszahl (int) ausgeben möchte, die zwischen 0 und 15 sein soll, dann mache ich das so:

int zahl = (int) Math.random() * 15;
System.out.println(zahl);


eine andere möglichkeit wäre:

double zahl = Math.random() * 15;
System.out.println((int) zahl);


nur komischerweise, obwohl beides eigentlich dasselbe bewirken sollte, bringt mir ersteres eine ausgabe von 0 und nur zweiteres wirklich eine entsprechende zufallszahl.
kann mir jemand erklären, warum?
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 03.03.2002, 16:20   #2
harakiri
Veteran
 
Registriert seit: 19.04.2000
Beiträge: 444


harakiri eine Nachricht über ICQ schicken
Standard

weil die funktion random() einen wert >= 0 und < 1 liefert und beim casting (typenumwandlung) auf (int) einfach die nachkommastelle abgeschnitten wird, und daher immer 0 rauskommen muss.
harakiri ist offline   Mit Zitat antworten
Alt 03.03.2002, 16:24   #3
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard

also wenn ichs so machen würde

int zahl = (int) (Math.random() * 15);

müßts dann wohl gehen, oder?
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 03.03.2002, 16:24   #4
JosefS
Veteran
 
Registriert seit: 07.01.2002
Alter: 44
Beiträge: 268


Standard

ganz einfach:
da Math.random() eine zahl zwischen 0 und 0.9999999 liefert und du mit

Code:
int zahl = (int) Math.random() * 15; 
             ^ Zahl zwischen 0 und 0.99999 in int ist immer 0!
gleich das ergebnis von Math.rand() in int umwandelst, was natürlich immer 0 ist!

probier mal:
Code:
int zahl = (int) (Math.random() * 15);
dann gehts auch ;-)

achja: die zahl ist aber zwischen 0 und 14! ( "rand() * 16" liefert eine zahl zw 0 und 15)
JosefS ist offline   Mit Zitat antworten
Alt 03.03.2002, 16:31   #5
Tarjan
Quantensingularität
 
Registriert seit: 28.09.2000
Alter: 55
Beiträge: 8.336


Tarjan eine Nachricht über ICQ schicken
Standard

Zitat:
Original geschrieben von RaistlinMajere
also wenn ichs so machen würde

int zahl = (int) (Math.random() * 15);

müßts dann wohl gehen, oder?
Ja, hier wird zuerst multipliziert und dann erst gecastet. Ansonsten zuerst gecastet und dann erst multipliziert.
____________________________________
Was ist klein, grün und dreieckig?
Ein kleines grünes Dreieck!


Bahnübergänge sind die härtesten Drogen der Welt! Ein Zug und du bist weg!
Tarjan ist offline   Mit Zitat antworten
Alt 03.03.2002, 16:38   #6
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard

Zitat:
Original geschrieben von JosefS
achja: die zahl ist aber zwischen 0 und 14! ( "rand() * 16" liefert eine zahl zw 0 und 15)
mah, *bledbin* natürlich hast recht, vielen dank auch (an alle übrigens).
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 03.03.2002, 18:30   #7
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard diese frage ist mir geradezu peinlich

aber ich hock jetzt schon viel zu lange an dem und soviel zeit hab ich heute einfach nicht, d.h. poste ichs trotzdem:
im darunterliegenden java-qt wird die whileschleife endlos ausgeführt, aber ich verstehe beim besten willen nicht, warum.
wäre super, wenn mir das jemand sagen könnte, fürs geübte auge isses sicher nur ein kurzer blick. das ganze dient dazu, um ein array mit 16 unterschiedlichen zufallszahlen von 0-15 zu füllen.


int[] array = new int[16];
int zz, vorhanden = 0;
boolean schonda = false;

while(vorhanden < 16) {
zz = (int) (Math.random() * 15);

for(int i=0; i<array.length; i++) {
if(array[i] == zz) {
schonda = true;
break;
}
}

if(schonda) {
schonda = false;
System.out.println(zz + " -> ist schon vorhanden");
}
else {
System.out.println(zz + " -> noch nicht vorhanden");
array[vorhanden] = zz;
vorhanden++;
}
}
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 03.03.2002, 18:43   #8
JosefS
Veteran
 
Registriert seit: 07.01.2002
Alter: 44
Beiträge: 268


Standard

probiers mal mit:

Code:
int[] array = new int[16];
int zz, vorhanden = 0;
boolean schonda = false;

while(vorhanden < array.length-1)
{ 
	zz = (int) (Math.random() * 15); 

	for(int i=0; i<=vorhanden; i++)
	{ 
		if(array[i] == zz)
		{ 
			schonda = true; 
			break; 
		} 
	} 

	if(schonda)
	{ 
		System.out.println(zz + " -> ist schon vorhanden"); 
	} 
	else
	{ 
		System.out.println(zz + " -> noch nicht vorhanden"); 
		array[vorhanden] = zz; 
		vorhanden++; 
	}

	schonda = false; 
}
JosefS ist offline   Mit Zitat antworten
Alt 03.03.2002, 18:43   #9
harakiri
Veteran
 
Registriert seit: 19.04.2000
Beiträge: 444


harakiri eine Nachricht über ICQ schicken
Standard Re: diese frage ist mir geradezu peinlich

Zitat:
Original geschrieben von RaistlinMajere

while(vorhanden < 16) {
zz = (int) (Math.random() * 15);

for(int i=0; i<array.length; i++) {
if(array[i] == zz) {
schonda = true;
break;
}
}

imho hast du vergessen in der while-schleife den zähler "vorhanden" zu erhöhen, denn dein zu deinem statement "verhanden++" kommt das prog eben nie...
harakiri ist offline   Mit Zitat antworten
Alt 03.03.2002, 18:51   #10
JosefS
Veteran
 
Registriert seit: 07.01.2002
Alter: 44
Beiträge: 268


Standard Re: Re: diese frage ist mir geradezu peinlich

Zitat:
Original geschrieben von harakiri


imho hast du vergessen in der while-schleife den zähler "vorhanden" zu erhöhen, denn dein zu deinem statement "verhanden++" kommt das prog eben nie...
hm....
der fehler liegt in folgendem:

while(vorhanden < 16) {
zz = (int) (Math.random() * 15);

"Math.random() * 15"
liefert zahlen von 0 bis 14, dh. 15 verschiedene zahlen->vorhanden kann niemals 16 erreichen, sondern nur 15

die schleife kann trotzdem recht lange dauern, da man bei schon 14 gezogenen zahlen, die 15. "zufällige" genau die übriggelassene sein muss, dh. im schnitt 15 durchläufe für die letzte+14 für die vorletzte usw...
JosefS ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:12 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag