Auch bei der Programmierung mit Javascript braucht man ab und an Zufallszahlen aus einem definierten Raum. Die Methode Math.random(); liefert aber leider nur Zahlen im Bereich von 0 bis 1.
Abhilfe schafft das folgende kurze Script:
function getRandom(min, max) { if(min > max) { return -1; } if(min == max) { return min; } var r; do { r = Math.random(); } while(r == 1.0); return min + parseInt(r * (max-min+1)); } |
Der Aufruf erfolgt mit GetRandom( 0, 3 ); und liefert eine zufällig Zahl zwischen 0 und 3.
Update 23.05.2007:
Habe die Funktion überarbeitet, es hatte sich ein kleiner Fehler eingeschlichen. Danke für den Hinweis.
Update 01.09.2008:
Funktion überarbeitet um eine bessere Verteilung der Zufallszahlen zu erreichen. Danke an @batzee für den Hinweis und @ralf für die Ausführungen dazu.
So wie du es machst, ist die Verteilung der Zufallszahlen nicht gleichmäßig. Mein Vorschlag:
function GetRandom( min, max ) {
if( min > max ) {
return( -1 );
}
if( min == max ) {
return( min );
}
return min + parseInt( Math.random() * ( max-min+1 )
}
Habe dein Beipiel mal freigeschaltet. Erklär doch mal kurz, warum die Verteilung in deinem Beispiel besser funktioniert.
Mein Vorredner hat recht.
Folgendes Beispiel:
GetRandom(1,2)
Damit wir in Zeile 9 gleichverteilt entweder 0, 1 oder 2 erzeugt.
Zeile 11 erzeugt daraus
r=0: return 1;
r=1: return 2;
r=2: return 2;
Der Code von Batzee ist der normale Weg um so etwas zu programmieren.
@ralf, macht Sinn, ich habe den Code mal geändert.
da fehlt ne klammer am ende… letzte zeile entweder die von parseInt oder von return
@sirion, diese Flüchtigkeitsfehler …
wie wäre es mit
function get_random(max){
return Math.floor(Math.random() * max)
}
und mit min, max
function get_random(min, max){
return Math.floor(Math.random() * (max-min))+min
}
Hi
Ich hab mal eben die aktuelle Funktion zusammengefasst, damit sie in Dateien eingebunden werden kann, die möglichst klein sein sollen ;)
function rrandom(min,max){return (min>max)?-1:((min==max)?min:(min+parseInt(Math.random()*(max-min+1))));}
So wie das hier steht, gibt es aber auch die Möglichkeit einer zu großen Zahl:
Beispiel GetRandom(0,3), wenn mir Math.random zufälligerweise 1.0 ausgibt, dann erhalte ich 4 und das liegt nicht zwischen 0 und 3
@chris, guter Hinweis. Die Wahrscheinlichkeit ist zwar sehr gering, dennoch habe ich den Code entsprechend angepasst. Was meinst zu der neuen Version?