ActionScript 3
Willekeurige waarde genereren
Zoeken…
Willekeurig nummer tussen 0 en 1
Math.random();
produceert een gelijk verdeeld willekeurig getal tussen 0 (inclusief) en 1 (exclusief)
Voorbeelduitgang:
- ,22282187035307288
- ,3948539895936847
- ,9987191134132445
Willekeurig getal tussen min en max waarden
function randomMinMax(min:Number, max:Number):Number {
return (min + (Math.random() * Math.abs(max - min)));
}
Deze functie wordt opgeroepen door een bereik van minimum- en maximumwaarden door te geven.
Voorbeeld:
randomMinMax(1, 10);
Voorbeeld uitgangen:
- 1,661770915146917
- 2,5521070677787066
- 9,436270965728909
Willekeurige hoek, in graden
function randomAngle():Number {
return (Math.random() * 360);
}
Voorbeeld uitgangen:
- 31,554428357630968
- 230,4078639484942
- 312,7964010089636
Willekeurige waarde van een array
Ervan uitgaande dat we een array myArray
:
var value:* = myArray[int(Math.random() * myArray.length)];
Merk op dat we int
om het resultaat van Math.random()
naar een int
te casten omdat waarden zoals 2.4539543
geen geldige array-index zouden zijn.
Willekeurig punt binnen een cirkel
Definieer eerst de cirkelradius en het middelpunt:
var radius:Number = 100;
var center:Point = new Point(35, 70);
Genereer vervolgens een willekeurige hoek in radialen vanuit het midden:
var angle:Number = Math.random() * Math.PI * 2;
Genereer vervolgens een effectieve straal van het geretourneerde punt, zodat deze zich binnen de gegeven radius
. Een eenvoudige Math.random()*radius
is niet voldoende, omdat met deze verdeling de geproduceerde punten de helft van de tijd in de binnenste cirkel van een halve straal Math.random()*radius
, maar het vierkant van die cirkel is een kwart van het origineel. Om een juiste verdeling te maken, zou de functie er als volgt uit moeten zien:
var rad:Number=(Math.random()+Math.random())*radius; // yes, two separate calls to random
if (rad>radius) { rad=2*radius-rad; }
Deze functie produceert een waarde waarvan de waarschijnlijkheidsfunctie lineair toeneemt van 0 bij nul tot maximaal bij radius
. Het gebeurt omdat een som van willekeurige waarden een waarschijnlijkheidsdichtheidsfunctie heeft die gelijk is aan convolutie van alle individuele dichtheidsfuncties van de willekeurige waarden. Dit is wat uitgebreide wiskunde voor een persoon van gemiddelde kwaliteit, maar er wordt een soort GIF gepresenteerd om een grafiek van de convolutiefunctie te tekenen van twee geüniformeerde distributiedichtheidsfuncties uitgelegd als " boxsignalen ". De operator if
vouwt de resulterende functie over zijn maximum, waardoor alleen een zaagtandvormige grafiek overblijft.
Deze functie is geselecteerd omdat het vierkant van een cirkelstrook gelegen tussen radius=r
en radius=r+dr
lineair toeneemt met toenemende r
en zeer kleine constante dr
zodat dr*dr<<r
. Daarom is het aantal punten dat dichtbij het midden wordt gegenereerd kleiner dan het aantal punten dat aan de rand van de cirkel wordt gegenereerd met dezelfde marge als de straal van het middelste gebied kleiner is dan de straal van de hele cirkel. Dus over het algemeen zijn de punten gelijk verdeeld over de hele cirkel.
Krijg nu uw willekeurige positie:
var result:Point = new Point(
center.x + Math.cos(angle) * rad,
center.y + Math.sin(angle) * rad
);
Gebruik een radius
plaats van rad
om een willekeurig punt op de cirkel te krijgen (aan de rand van de cirkel met een bepaalde straal).
PS: Het voorbeeld werd uiteindelijk overbelast door een verklaring van wiskunde.
Willekeurige hoek, in radialen
function randomAngleRadians():Number
{
return Math.random() * Math.PI * 2;
}
Voorbeeld uitgangen:
- 5,490068569213088
- 3,1984284719180205
- 4,581117863808207
Bepaling van het succes van een "procentuele kans" operatie
Als je moet rollen voor een true
of false
in een "x% kans" situatie, gebruik dan:
function roll(chance:Number):Boolean {
return Math.random() >= chance;
}
Gebruikt als:
var success:Boolean = roll(0.5); // True 50% of the time.
var again:Boolean = roll(0.25); // True 25% of the time.
Maak een willekeurige kleur
Om een willekeurige kleur te krijgen:
function randomColor():uint
{
return Math.random() * 0xFFFFFF;
}
Als je meer controle nodig hebt over de rode, groene en blauwe kanalen:
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;
Hier kunt u uw eigen bereik opgeven voor r
, g
en b
(dit voorbeeld is van 0-255).
Willekeurig alfabet doorlopen
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);
}
Voorbeelduitgang:
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
Randomiseer een 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);
Voorbeelduitvoer
B, Z, D, R, U, N, O, M, I, L, C, J, P, H, W, S, Q, E, K, T, V, V, X, Y, G, EEN
Deze methode staat bekend als Fisher-Yates array-shuffle .