RSS Feed

Zufallszahlen in Javascript mit Math.random()

01.09.2006 by naden

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.


10 Kommentare »

  1. batzee sagt:

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

  2. naden sagt:

    Habe dein Beipiel mal freigeschaltet. Erklär doch mal kurz, warum die Verteilung in deinem Beispiel besser funktioniert.

  3. Ralf Engels sagt:

    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.

  4. admin sagt:

    @ralf, macht Sinn, ich habe den Code mal geändert.

  5. Sirion sagt:

    da fehlt ne klammer am ende… letzte zeile entweder die von parseInt oder von return

  6. naden sagt:

    @sirion, diese Flüchtigkeitsfehler …

  7. Jan sagt:

    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
    }

  8. Jonas sagt:

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

  9. chris sagt:

    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

  10. naden sagt:

    @chris, guter Hinweis. Die Wahrscheinlichkeit ist zwar sehr gering, dennoch habe ich den Code entsprechend angepasst. Was meinst zu der neuen Version?

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>