Fuer eines meiner Programme benoetige ich einige Zufallszahlen. Bis jetzt habe ich dafuer die Befehlszeile:
int wurf= (int) (Math.random()*wuerfelart);
verwendet. Die Variable wuerfelart gibt in diesem Fall die Seitenzahl des Wuerfels an. Fuer den Fall, dass die Variable wuerfelart = 6 gilt, wuerde diese Befehlszeile das Verhalten eines sechseitigen Wuerfels simulieren.
Inzwischen wurde mir aber gesagt, dass das Zufallsverhalten nur eingeschraenkt gueltig ist! Zufallswerte, die um den Nullbereich oder den Maximalbereich (in diesem Fall 6.0 und um einen gewissen Bereich darunter) liegen, werden gerundet und wuerden damit das Ergebnis verfaelschen. Die Rundung wird durch den Teil (int) erreicht und soweit ist mir alles klar. Ich frage mich nur, in welchen Faellen dort das Durchschnittsergebnis verfaelscht wird.
Endfrage:
Wie bekomme ich ein wirklich zufaelliges, ganzzahliges Ergebnis zustande?
kein Grund, auch noch ein drittes Posting dranzuhängen
-------
wenn du Zahlen normal runden würdest (kleiner 0.5 wird 0, 0.5 bis 1.5 wird 1 usw.)
dann hättest du eine schlechte Verteilung, da für die 0 nur ein halb so großer Bereicht wie für die 1 vorhanden ist,
mit der (int)-Abrundung gibts aber keine Probleme, 0 bis 0.9999 wird 0, 1 bis 1.99999 wird 1 usw.,
5 bis 5.99999 wird 5,
eine 6.0 kann nicht zufällig entstehen,
du bekommst also gleichverteilt Werte von 0 bis 5,
falls du 1-6 haben möchtest, musst du ganz am Ende noch +1 addieren
Dass 0 und 1 bei (int)(2*Math.random()) wirklich recht gleich wahrscheinlich sind, sollte dieses Programm zeigen:
Code:
public class Wahrscheinlichkeit {
int i = 0, j = 0;
Wahrscheinlichkeit(int anz) {
while (i < Math.abs(anz)) {
if (rand() == 0)
i++;
else
j++;
}
System.out.println(i);
System.out.println(j);
System.out.println(Math.abs(i - j));
}
int rand() {
double d = Math.random();
d *= 2;
return (int) d;
}
public static void main(String[] args) {
new Wahrscheinlichkeit(1000000000);
}
}
Eine Zufallszahl zwischen x (inklusiv) und y (exklusiv) liefert Math.random() * (y - x) + x. Um ganzzahlige Zufallszahlen zwischen u und o (einschließlich) zu erhalten, berechnen wir u + Math.floor(Math.random() * (o-u+1))
Das ist die Lösung wie ich sie vor kurzem in der Java ist auch eine Insel durchgelesen habe