ActionScript 3
Generazione di valore casuale
Ricerca…
Numero casuale compreso tra 0 e 1
Math.random();
produce un numero casuale uniformemente distribuito tra 0 (incluso) e 1 (esclusivo)
Esempio di output:
- ,22282187035307288
- ,3948539895936847
- ,9987191134132445
Numero casuale tra valori minimi e massimi
function randomMinMax(min:Number, max:Number):Number {
return (min + (Math.random() * Math.abs(max - min)));
}
Questa funzione viene chiamata passando un intervallo di valori minimi e massimi.
Esempio:
randomMinMax(1, 10);
Risultati di esempio:
- 1,661770915146917
- 2,5521070677787066
- 9,436270965728909
Angolo casuale, in gradi
function randomAngle():Number {
return (Math.random() * 360);
}
Risultati di esempio:
- 31,554428357630968
- 230,4078639484942
- 312,7964010089636
Valore casuale da una matrice
Supponendo che abbiamo un array myArray
:
var value:* = myArray[int(Math.random() * myArray.length)];
Nota che usiamo int
per 2.4539543
il risultato di Math.random()
a un int perché valori come 2.4539543
non sarebbero un indice di array valido.
Punto casuale all'interno di un cerchio
Prima definisci il raggio del cerchio e il suo centro:
var radius:Number = 100;
var center:Point = new Point(35, 70);
Quindi genera un angolo casuale in radianti dal centro:
var angle:Number = Math.random() * Math.PI * 2;
Quindi genera un raggio efficace del punto restituito, quindi sarà all'interno del radius
dato. Un semplice Math.random()*radius
non funzionerà, perché con questa distribuzione i punti prodotti finiranno nel cerchio interno di mezzo raggio metà del tempo, ma il quadrato di quel cerchio è un quarto dell'originale. Per creare una corretta distribuzione, la funzione dovrebbe essere così:
var rad:Number=(Math.random()+Math.random())*radius; // yes, two separate calls to random
if (rad>radius) { rad=2*radius-rad; }
Questa funzione produce un valore che ha la sua funzione di probabilità che aumenta linearmente da 0 a zero al massimo al radius
. Succede perché una somma di valori casuali ha una funzione di densità di probabilità uguale alla convoluzione di tutte le funzioni di densità individuale dei valori casuali. Questa è una matematica estesa per una persona di grado medio, ma una GIF gentile viene presentata per tracciare un grafico della funzione di convoluzione di due funzioni di densità di distribuzione uniformi spiegate come " segnali di casella ". L'operatore if
ripiega la funzione risultante sul suo massimo, lasciando solo un grafico a forma di dente di sega.
Questa funzione è selezionata perché il quadrato di una striscia circolare situata tra radius=r
e radius=r+dr
aumenta linearmente con r
crescente e costante dr
molto piccolo in modo che dr*dr<<r
. Pertanto, la quantità di punti generati vicino al centro è minore della quantità di punti generati sul bordo del cerchio dello stesso margine in cui il raggio dell'area centrale è inferiore al raggio dell'intero cerchio. Quindi, in generale, i punti sono equamente distribuiti in tutto il cerchio.
Ora, prendi la tua posizione casuale:
var result:Point = new Point(
center.x + Math.cos(angle) * rad,
center.y + Math.sin(angle) * rad
);
Per ottenere un punto casuale sul cerchio (sul bordo del cerchio di un dato raggio), utilizzare il radius
anziché il rad
.
PS: l'esempio è stato sovraccaricato dalla spiegazione della matematica.
Angolo casuale, in radianti
function randomAngleRadians():Number
{
return Math.random() * Math.PI * 2;
}
Risultati di esempio:
- 5,490068569213088
- 3,1984284719180205
- 4,581117863808207
Determinazione del successo di un'operazione "percentuale di possibilità"
Se è necessario eseguire il roll su true
o false
in una situazione di "x% chance", utilizzare:
function roll(chance:Number):Boolean {
return Math.random() >= chance;
}
Usato come:
var success:Boolean = roll(0.5); // True 50% of the time.
var again:Boolean = roll(0.25); // True 25% of the time.
Crea un colore casuale
Per ottenere un colore casuale:
function randomColor():uint
{
return Math.random() * 0xFFFFFF;
}
Se hai bisogno di più controllo sui canali rosso, verde e blu:
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;
Qui è possibile specificare un intervallo per r
, g
e b
(questo esempio è 0-255).
Passa in modo casuale attraverso l'alfabeto
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);
}
Esempio di output:
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
Randomize An 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);
Esempio di output
B, Z, D, R, U, N, O, M, I, L, C, J, P, H, W, S, D, E, K, T, F, V, X, Y, G, UN
Questo metodo è noto come array shauffle Fisher-Yates .