ActionScript 3
Losowe generowanie wartości
Szukaj…
Liczba losowa od 0 do 1
Math.random();
tworzy równomiernie rozłożoną liczbę losową od 0 (włącznie) do 1 (wyłącznie)
Przykładowe dane wyjściowe:
- 0,22282187035307288
- 0,3948539895936847
- 0,9987191134132445
Losowa liczba między wartościami minimalną i maksymalną
function randomMinMax(min:Number, max:Number):Number {
return (min + (Math.random() * Math.abs(max - min)));
}
Ta funkcja jest wywoływana przez przekazanie zakresu wartości minimalnych i maksymalnych.
Przykład:
randomMinMax(1, 10);
Przykładowe wyniki:
- 1,661770915146917
- 2.5521070677787066
- 9,436270965728909
Kąt losowy, w stopniach
function randomAngle():Number {
return (Math.random() * 360);
}
Przykładowe wyniki:
- 31,554428357630968
- 230.4078639484942
- 312.7964010089636
Losowa wartość z tablicy
Zakładając, że mamy tablicę myArray
:
var value:* = myArray[int(Math.random() * myArray.length)];
Zauważ, że używamy int
aby rzutować wynik Math.random()
na int, ponieważ wartości takie jak 2.4539543
nie byłyby poprawnym indeksem tablicy.
Losowy punkt wewnątrz koła
Najpierw określ promień okręgu i jego środek:
var radius:Number = 100;
var center:Point = new Point(35, 70);
Następnie wygeneruj losowy kąt w radianach od środka:
var angle:Number = Math.random() * Math.PI * 2;
Następnie wygeneruj efektywny promień zwróconego punktu, aby znalazł się w danym radius
. Prosty Math.random()*radius
nie zadziała, ponieważ przy takim rozkładzie punkty Math.random()*radius
w wewnętrznym okręgu w połowie promienia przez połowę czasu, ale kwadrat tego koła jest ćwiartką oryginału. Aby utworzyć prawidłowy rozkład, funkcja powinna wyglądać następująco:
var rad:Number=(Math.random()+Math.random())*radius; // yes, two separate calls to random
if (rad>radius) { rad=2*radius-rad; }
Ta funkcja generuje wartość, której funkcja prawdopodobieństwa rośnie liniowo od 0 przy zera do maksimum przy radius
. Dzieje się tak, ponieważ suma wartości losowych ma funkcję gęstości prawdopodobieństwa równą splotowi wszystkich indywidualnych funkcji gęstości wartości losowych. Jest to kilka rozszerzonych obliczeń matematycznych dla przeciętnej osoby, ale przedstawiono miły GIF, aby narysować wykres funkcji splotu dwóch ujednoliconych funkcji gęstości rozkładu wyjaśnionych jako „ sygnały ramkowe ”. Operator if
składa wynikową funkcję ponad maksimum, pozostawiając jedynie wykres w kształcie piły.
Ta funkcja jest wybrana, ponieważ kwadrat paska koła znajdującego się między radius=r
radius=r+dr
rośnie liniowo wraz ze wzrostem r
i bardzo małą stałą dr
tak że dr*dr<<r
. Dlatego liczba punktów generowanych blisko środka jest mniejsza niż liczba punktów generowanych na krawędzi koła o ten sam margines, ponieważ promień obszaru środkowego jest mniejszy niż promień całego koła. Ogólnie rzecz biorąc, punkty są równomiernie rozmieszczone w całym okręgu.
Teraz zdobądź swoją losową pozycję:
var result:Point = new Point(
center.x + Math.cos(angle) * rad,
center.y + Math.sin(angle) * rad
);
Aby uzyskać losowy punkt NA kole (na krawędzi koła o danym promieniu), użyj radius
zamiast rad
.
PS: Przykład został przeciążony wyjaśnieniem matematyki.
Kąt losowy w radianach
function randomAngleRadians():Number
{
return Math.random() * Math.PI * 2;
}
Przykładowe wyniki:
- 5.490068569213088
- 3.1984284719180205
- 4.581117863808207
Określenie powodzenia operacji „procent szans”
Jeśli musisz rzucić na true
lub false
w sytuacji „x% szansy”, użyj:
function roll(chance:Number):Boolean {
return Math.random() >= chance;
}
Używany jak:
var success:Boolean = roll(0.5); // True 50% of the time.
var again:Boolean = roll(0.25); // True 25% of the time.
Utwórz losowy kolor
Aby uzyskać dowolny losowy kolor:
function randomColor():uint
{
return Math.random() * 0xFFFFFF;
}
Jeśli potrzebujesz większej kontroli nad kanałami czerwonym, zielonym i niebieskim:
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;
Tutaj można określić własny zakres dla r
, g
i b
(w tym przykładzie wynosi od 0-255).
Losowo przeglądaj alfabet
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);
}
Przykładowe dane wyjściowe:
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);
Przykładowe dane wyjściowe
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, ZA
Ta metoda jest znana jako tasowanie tablic Fisher-Yates .