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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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?
Laut Java-Referenz gilt für Math.random() folgendes: “Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.”. Für Javascript gilt das Gleiche.
Die 0 kann durch Math.random also ausgegeben werden, die 1.0 wird aber niemals ausgegeben und somit kannst du dir die while-Schleife sparen ;).
Gruß
Math.random().toString().split(‘.’)[1]
mfG
Das funktioniert so nicht. Das Script oben soll eine Zufallszahl N >= min, N <= max liefern. Dein Schnipsel liefert aber irgend eine undefinierte ganzzahlige Zahl.
so braucht man nachfolgend nicht immer auf -1 zu prüfen:
function getRandom(min, max) {
if (min > max) {
return getRandom(max, min);
}
else if (min == max) {
return min;
}
else
return min + parseInt(Math.random() * (max – min + 1));
}
insbesondere, wenn negative Zufallszahlen gewünscht sind und die -1 zur Zielmenge gehören kann, ist eine Ausschlussprüfung auf -1 nicht sinnvoll
wenn einem dann der min-max-Zahlendreher beim Aufruf unterläuft [z.B. getRandom(-1, -5);] ist das Umkehren der Werte hilfreich
Die Funktion parseInt ist unpassend:
The parseInt() function parses a string and returns an integer. [http://www.w3schools.com/jsref/jsref_parseint.asp]
Hier mein Vorschlag:
function getRandom(min, max) {
var r;
var diff= max-min;
r = Math.random()*diff;
r = Math.round(r);
r = r+min;
return r;
}
Ich muss mich korrigieren. Die Zufallszahl muss abgerundet werden und nicht ab oder auf. Sonst hat man eine falsche Verteilung. Die Randzahlen kommen nicht so häufig vor.
Korrigierte Version:
function getRandom(min, max) {
var r;
var diff= max-min+1;
r = Math.random()*diff;
r = Math.floor(r);
r = r+min;
return r;
}
Kurzversion:
function getRandom(min, max) {
return(Math.floor(Math.random()*(max-min+1)))+1;
}
@jo ja, ich muss die Funktion mal dringen anpassen, nutze die selber seit Jahren nicht mehr. Bei deiner Kurzversion kannst du übrigens noch die äußersten Klammern weglassen.
Ich habe vor einigen Wochen noch eine “Luxusversion” geschrieben. Aber eher als “was ist machbar” http://www.naden.de/blog/javascript-zauber-in-140-bytes