ActionScript 3
Slumpmässigt värde generering
Sök…
Slumpmässigt nummer mellan 0 och 1
Math.random();
producerar ett jämnt fördelat slumpmässigt antal mellan 0 (inklusive) och 1 (exklusivt)
Exempel på utgång:
- ,22282187035307288
- ,3948539895936847
- ,9987191134132445
Slumpmässigt antal mellan min- och maxvärden
function randomMinMax(min:Number, max:Number):Number {
return (min + (Math.random() * Math.abs(max - min)));
}
Denna funktion kallas genom att passera ett intervall med minimi- och maximivärden.
Exempel:
randomMinMax(1, 10);
Exempelutgångar:
- 1,661770915146917
- 2,5521070677787066
- 9,436270965728909
Slumpvis vinkel, i grader
function randomAngle():Number {
return (Math.random() * 360);
}
Exempelutgångar:
- 31,554428357630968
- 230,4078639484942
- 312,7964010089636
Slumpmässigt värde från en matris
Förutsatt att vi har ett array myArray
:
var value:* = myArray[int(Math.random() * myArray.length)];
Observera att vi använder int
att kasta resultatet av Math.random()
till ett int eftersom värden som 2.4539543
skulle vara ett giltigt arrayindex.
Slumpmässig punkt inuti en cirkel
Definiera först cirkelradie och dess centrum:
var radius:Number = 100;
var center:Point = new Point(35, 70);
Generera sedan en slumpmässig vinkel i radianer från mitten:
var angle:Number = Math.random() * Math.PI * 2;
Generera sedan en effektiv radie för den returnerade punkten, så att den kommer att vara inom en given radius
. En enkel Math.random()*radius
kommer inte att göra, för med denna fördelning kommer produktionspunkterna att hamna i den inre cirkeln av halva radien halva tiden, men kvadraten för cirkeln är en fjärdedel av originalet. För att skapa en rätt distribution bör funktionen vara så här:
var rad:Number=(Math.random()+Math.random())*radius; // yes, two separate calls to random
if (rad>radius) { rad=2*radius-rad; }
Denna funktion producerar ett värde som har sin sannolikhetsfunktion linjärt ökar från 0 vid noll till max vid radius
. Det händer eftersom en summa av slumpmässiga värden har en sannolikhetsdensitetsfunktion som är lika med sammandragningen av alla slumpmässiga värdenas individuella densitetsfunktioner. Detta är några utvidgade matematiker för en person i medelklass, men ett slags GIF presenteras för att rita en kurva för upplösningsfunktion för två uniformerade distributionstäthetsfunktioner som förklaras som " rutasignaler ". if
operatören viker den resulterande funktionen över sitt maximala, och lämnar endast en sågtandformad graf.
Denna funktion väljs eftersom kvadratet på en cirkelremsa belägen mellan radius=r
och radius=r+dr
ökar linjärt med ökande r
och mycket liten konstant dr
så att dr*dr<<r
. Därför är mängden punkter som genereras nära mitten mindre än mängden punkter som genereras vid kanten av cirkeln med samma marginal som radien för mittområdet är mindre än radien för hela cirkeln. Så totalt sett är punkter jämnt fördelade över hela cirkeln.
Nu får du din slumpmässiga position:
var result:Point = new Point(
center.x + Math.cos(angle) * rad,
center.y + Math.sin(angle) * rad
);
För att få en slumpmässig punkt PÅ cirkeln (på kanten av cirkeln för en given radie), använd radius
istället för rad
.
PS: Exemplet blev överbelastat genom förklaring av matematik.
Slumpvis vinkel, i radianer
function randomAngleRadians():Number
{
return Math.random() * Math.PI * 2;
}
Exempelutgångar:
- 5,490068569213088
- 3,1984284719180205
- 4,581117863808207
Bestämma framgången för en "procent chans" operation
Om du behöver rulla efter en true
eller false
i en "x% chans" -situation, använd:
function roll(chance:Number):Boolean {
return Math.random() >= chance;
}
Används som:
var success:Boolean = roll(0.5); // True 50% of the time.
var again:Boolean = roll(0.25); // True 25% of the time.
Skapa en slumpmässig färg
För att få någon slumpmässig färg:
function randomColor():uint
{
return Math.random() * 0xFFFFFF;
}
Om du behöver mer kontroll över de röda, gröna och blå kanalerna:
var r:uint = Math.random() * 0xFF;
var g:uint = Math.random() * 0xFF;
var b:uint = Math.random() * 0xFF;
var color:uint = r << 16 | g << 8 | b;
Här kan du ange ditt eget intervall för r
, g
och b
(detta exempel är från 0-255).
Slumpmässigt slinga genom alfabetet
var alphabet:Vector.<String> = new <String>[ "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z" ];
while (alphabet.length > 0)
{
var letter:String = alphabet.splice(int(Math.random() *
alphabet.length), 1)[0];
trace(letter);
}
Exempel på utgång:
V, M, F, E, D, U, S, L, X, K, Q, H, A, I, W, N, P, Y, J, C, T, O, R, G, B, Z
Slumpa fram ett array
var alphabet:Array = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ];
for (var i:int=alphabet.length-1;i>0;i--) {
var j:int=Math.floor(Math.random()*(i+1));
var swap=alphabet[j];
alphabet[j]=alphabet[i];
alphabet[i]=swap;
}
trace(alphabet);
Exempel på utgång
B, Z, D, R, U, N, O, M, I, L, C, J, P, H, W, S, Q, E, K, T, F, V, X, Y, G, EN
Denna metod är känd som Fisher-Yates array shuffle .