Jak wygenerować losowy punkt w okręgu o promieniu R :
r = R * sqrt(random())
theta = random() * 2 * PI
(Przyjmując random()
równomiernie podaje wartość od 0 do 1)
Jeśli chcesz przekonwertować to na współrzędne kartezjańskie, możesz to zrobić
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
Dlaczego sqrt(random())
?
Spójrzmy na matematykę, która prowadzi do sqrt(random())
. Załóżmy dla uproszczenia, że pracujemy z okręgiem jednostkowym, tj. R = 1.
Średnia odległość między punktami powinna być taka sama, niezależnie od tego, jak daleko od środka patrzymy. Oznacza to na przykład, że patrząc na obwód koła o obwodzie 2 powinniśmy znaleźć dwa razy więcej punktów niż liczba punktów na obwodzie koła o obwodzie 1.
Ponieważ obwód koła (2π r ) rośnie liniowo z r , wynika z tego, że liczba losowych punktów powinna rosnąć liniowo z r . Innymi słowy, pożądana funkcja gęstości prawdopodobieństwa (PDF) rośnie liniowo. Ponieważ plik PDF powinien mieć powierzchnię równą 1, a maksymalny promień to 1, mamy
Wiemy więc, jak powinna wyglądać pożądana gęstość naszych losowych wartości. Teraz: Jak wygenerować taką losową wartość, gdy mamy tylko jednolitą losową wartość między 0 a 1?
Używamy sztuczki zwanej próbkowaniem z transformacją odwrotną
- Z pliku PDF utwórz funkcję dystrybucji skumulowanej (CDF)
- Odzwierciedl to wzdłuż y = x
- Zastosuj wynikową funkcję do jednolitej wartości od 0 do 1.
Brzmi skomplikowanie? Pozwól mi wstawić cytat z małym bocznym śladem, który przekazuje intuicję:
Załóżmy, że chcemy wygenerować punkt losowy o następującym rozkładzie:
To jest
- 1/5 punktów równomiernie między 1 a 2, oraz
- 4/5 punktów równomiernie między 2 a 3.
CDF jest, jak sama nazwa wskazuje, skumulowaną wersją pliku PDF. Intuicyjnie: podczas gdy PDF ( x ) opisuje liczbę losowych wartości w x , CDF ( x ) opisuje liczbę losowych wartości mniejszych niż x .
W takim przypadku CDF wyglądałby następująco:
Aby zobaczyć, jak to jest przydatne, wyobraź sobie, że strzelamy pociskami od lewej do prawej na równomiernie rozmieszczonych wysokościach. Gdy kule trafią w linię, spadają na ziemię:
Zobacz, jak gęstość pocisków na ziemi odpowiada naszemu pożądanemu rozkładowi! Prawie jesteśmy na miejscu!
Problem polega na tym, że dla tej funkcji oś y jest wyjściem, a oś x jest wejściem . Możemy tylko „strzelać pociskami z ziemi prosto w górę”! Potrzebujemy funkcji odwrotnej!
Dlatego odzwierciedlamy całość; x staje się y, a y staje się x :
Nazywamy to CDF -1 . Aby uzyskać wartości zgodnie z pożądanym rozkładem, używamy CDF -1 (random ()).
… Wracając do generowania losowych wartości promienia, w których nasz plik PDF wynosi 2 x .
Krok 1: Utwórz CDF:
Ponieważ pracujemy z rzeczywistymi, CDF jest wyrażony jako całka pliku PDF.
CDF ( x ) = ∫ 2 x = x 2
Krok 2: Odzyskaj CDF wzdłuż y = x :
Matematycznie to sprowadza się do zamiany x i y i rozwiązywanie y :
CDF : y = x 2
Zamień: x = y 2
Rozwiąż: y = √ x
CDF -1 : y = √ x
Krok 3: Zastosuj wynikową funkcję do jednolitej wartości od 0 do 1
CDF -1 (losowo ()) = and losowo ()
Właśnie dlatego postanowiliśmy wyprowadzić :-)