WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   java - dummiefrage über Math.random() (http://www.wcm.at/forum/showthread.php?t=48364)

RaistlinMajere 03.03.2002 16:07

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? :confused:

harakiri 03.03.2002 16:20

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.

RaistlinMajere 03.03.2002 16:24

also wenn ichs so machen würde

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

müßts dann wohl gehen, oder?

JosefS 03.03.2002 16:24

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)

Tarjan 03.03.2002 16:31

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.

RaistlinMajere 03.03.2002 16:38

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

RaistlinMajere 03.03.2002 18:30

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++;
}
}

JosefS 03.03.2002 18:43

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;
}


harakiri 03.03.2002 18:43

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

JosefS 03.03.2002 18:51

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:50 Uhr.

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