Zufallszahlen, die Funktionen Math.random() und Math.floor()

Die Funktion Math.random() liefert eine Pseudozufallszahl zwischen 0 und 1, wobei 1 ausgeschlossen ist.
D.h. jeder Aufruf der Funktion Math.random() liefert eine andere, zufällige Kommazahl n, wobei  0 <= n < 1 gilt. Man sagt auch, die Zahl liegt im halboffenen Intervall [0,1[

Wie die zurückgegebene Zahl berechnet wird, wird nicht bekannt gegeben. Man spricht von einer "Pseudo"-Zufallszahl, da es unvermeidlich ist, dass die Berechnung einige nicht-zufällige Elemente enthält, die aber den Anwendern nicht bekannt sind. Statistisch von "außen" betrachtet verhält sich eine Folge von Kommazahlen, die die Funktion Math.random() liefert, wie eine "echte, gewürfelte" Zufallszahlenfolge.
 

Ganzzahlige  Zufallszahlen zwischen 0 und einer ganzen Zahl a:

Gesucht ist ein Skript, das eine zufällige ganze Zahl im Intervall [0,a] (a eingeschlossen) liefert.

Math.random() liefert eine zufällige Kommazahl im Intervall [0,1[. Daher ist das Intervall [0,1[ immer Ausgangspunkt für die nachfolgenden Überlegungen.

Math.random() * (a+1) liefert eine zufällige Kommazahl im Intervall [0,a+1[
 

Wir verwenden nun die Funktion Math.floor():
Sei n eine beliebige Kommazahl. Dann liefert die Funktion Math.floor(n) die zu n nächstliegende Ganzzahl, die kleiner oder gleich der angegebenen Zahl n ist.
Beispiel: Math.floor(4.83) liefert 4, Math.floor(27) liefert 27.
 

Math.floor( Math.random() * (a+1) ) liefert somit das gewünschte Ergebnis, nämlich eine ganze Zahl im Intervall [0,a].


 
Ganzzahlige Zufallszahlen zwischen einer minimalen ganzen Zahl a und einer maximalen ganzen Zahl b:

Gesucht ist ein Skript, das eine zufällige ganze Zahl im Intervall [a,b] (a und b eingeschlossen) liefert.

Vorüberlegung: Man möchte z.B. eine ganze Zufallszahl zwischen 5 und 18. Wieviele Möglichkeiten gibt es?
Die Zufallszahl kann den Wert 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 und 18 haben. Das sind 14 oder 18 - 5 + 1 Möglichkeiten.
Allgemeine kann man sagen, in einem ganzzahligen Intervall [a,b] gibt es b-a+1 Möglichkeiten.

Nach dem obigen Skript und der Vorüberlegung liefert

Math.floor( Math.random() * (b-a + 1) ) eine ganzahlige Zufallzahl im Intervall [0, b-a].

 
Addiert man jetzt noch den Wert a dazu, erhält man das gewünschte Ergebnis:

a + Math.floor( Math.random() * (b-a + 1) )  liefert eine ganze Zahl im Intervall [a,b].

 

Dafür könnte man eine Funktion zufallszahl mit den Eingaben a und b für die untere und obere Grenze definieren, die man immer verwenden kann:

// Funktionsdeklaration
function zufallszahl(a:int,b:int):int {
return (a + Math.floor(Math.random() * (b - a + 1)));
}
// Beispiel für Funktionsaufruf
zufallszahl(5,18);
 

 
Komma-Zufallszahlen zwischen einer minimalen (Komma-)Zahl a und einer maximalen (Komma-)Zahl b:

Gesucht ist ein Skript, das eine zufällige Kommazahl im Intervall [a,b[ (a eingeschlossen und b ausgeschlossen) liefert.

Vorüberlegung: Wenn a und b Kommazahlen sind, wie lange ist das Intervall [a,b[ ? Das Intervall [a,b[ hat immer die Länge b-a.

Analog zu den obigen Überlegungen ohne die Funktion Math.floor() ergibt sich folgendes Skript:

a + Math.random() * (b-a)  liefert eine zufällige Kommazahl im Intervall [a,b[. Wichtig: Der Wert b ist nicht möglich.

 

Dafür könnte man wieder eine Funktion kommaZufallszahl mit den Eingaben a und b für die untere und obere Grenze definieren, die man immer verwenden kann:

// Funktionsdeklaration
function kommaZufallszahl(a:Number,b:Number):Number {
return (a + Math.random() * (b - a));
}
// Beispiel für Funktionsaufruf
kommaZufallszahl(-0.5,0.5);

 

 

Beispiel für die Verwendung von Zufallszahlen

Für das nachfolgende Skript ist in der Bibliothek ein Movieclipsymbol abgespeichert, das eine Kreisfläche enthält. Der Registrierungspunkt liegt im Kreismittelpunkt. Die Eigenschaft "Export für ActionScript" ist aktiviert und die Klasse hat den Namen Kreis.

Bei der Ausführung des Skripts werden 100 Kreis zufällig auf der Bühne verteilt, wobei die Deckkraft der Kreise einen zufälligen Wert zwischen 25% und 50% (d.h. zwischen 0.25 und 0.5) annehmen kann und die Skalierung der Kreise einen zufälligen Wert zwischen 50% und 200% (d.h. zwischen 0.5 und 2).

Ergebnis:

Skript ohne Funktionen:

var kreis_mc:MovieClip;
for (var i=0;i<100;i++) {
kreis_mc = new Kreis();
kreis_mc.x = Math.floor(stage.stageWidth * Math.random());
kreis_mc.y = Math.floor(stage.stageHeight * Math.random());
kreis_mc.alpha = 0.25 + (0.5 - 0.25) * Math.random();
kreis_mc.scaleX = kreis_mc.scaleY = 0.5 + (2 - 0.5) * Math.random();
this.addChild(kreis_mc);
}

 

Skript mit Funktionen:

function zufallszahl(a:int,b:int):int {
return (a + Math.floor((b - a + 1) * Math.random()));
}
function kommaZufallszahl(a:Number,b:Number):Number {
return (a + (b - a) * Math.random());
}
var kreis_mc:MovieClip;
for (var i=0;i<100;i++) {
kreis_mc = new Kreis();
kreis_mc.x = zufallszahl (0, stage.stageWidth-1);
kreis_mc.y = zufallszahl (0, stage.stageHeight-1);
kreis_mc.alpha = kommaZufallszahl (0.25,0.5);
kreis_mc.scaleX = kreis_mc.scaleY = kommaZufallszahl (0.5,2);
this.addChild(kreis_mc);
}