Dzielenie każdej liczby przez całość może nie dać pożądanego rozkładu. Na przykład przy dwóch liczbach para x, y = random.random (), random.random () wybiera punkt równomiernie na kwadracie 0 <= x <1, 0 <= y <1. Dzieląc przez sumę „rzutuje” ten punkt (x, y) na linię x + y = 1 wzdłuż linii od (x, y) do początku. Punkty w pobliżu (0,5,0,5) będą znacznie bardziej prawdopodobne niż punkty w pobliżu (0,1,0,9).
Zatem dla dwóch zmiennych x = random.random (), y = 1-x daje równomierny rozkład wzdłuż geometrycznego odcinka linii.
Mając 3 zmienne, wybierasz losowy punkt w sześcianie i rzutujesz (promieniowo, przez początek), ale punkty w pobliżu środka trójkąta będą bardziej prawdopodobne niż punkty w pobliżu wierzchołków. Wynikowe punkty znajdują się na trójkącie w płaszczyźnie x + y + z. Jeśli potrzebujesz obiektywnego wyboru punktów w tym trójkącie, skalowanie nie jest dobre.
Problem komplikuje się w n-wymiarach, ale można uzyskać niską precyzję (ale wysoką dokładność, dla wszystkich fanów nauk laboratoryjnych!), Wybierając jednolicie ze zbioru wszystkich n-krotek nieujemnych liczb całkowitych, które sumują się do N, a następnie podzielenie każdego z nich przez N.
Niedawno wymyśliłem algorytm, który robi to dla skromnych n, N. Powinien działać dla n = 100 i N = 1000000, aby dać ci 6-cyfrowe losy. Zobacz moją odpowiedź na:
Utworzyć ograniczone liczby losowe?