RSS Feed

Zufallszahlen in Javascript mit Math.random()

01.09.2006 by naden

Auch bei der Programmierung mit braucht man ab und an Zufallszahlen aus einem definierten Raum. Die Methode Math.(); 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.

Teile diesen Beitrag

Folge mir

TwitterGoogle+XingFacebookRSS-Feed

Ähnliche Beiträge


18 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?

  11. Delta sagt:

    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ß

  12. murph.vienna sagt:

    Math.random().toString().split(‘.’)[1]

    mfG

  13. naden sagt:

    Das funktioniert so nicht. Das Script oben soll eine Zufallszahl N >= min, N <= max liefern. Dein Schnipsel liefert aber irgend eine undefinierte ganzzahlige Zahl.

  14. MHN sagt:

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

  15. MHN sagt:

    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

  16. jo sagt:

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

  17. jo sagt:

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

  18. naden sagt:

    @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

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>