2013-03-07 11 views
5

Mam problemy z generowaniem normalnie rozłożonych liczb losowych (mu = 0 sigma = 1) przy użyciu JavaScript.Odchylenie w randomizowanych liczbach normalnie rozproszonych (javascript)

Próbowałem metody Box-Mullera i zigguratu, ale średnia z wygenerowanej serii liczb wychodzi jako 0,0015 lub -0,0018 - bardzo daleko od zera !! Ponad 500 000 liczb losowo generowanych to duży problem. Powinno być bliskie zeru, coś jak 0,000000000001.

Nie mogę określić, czy jest to problem związany z metodą, czy też wbudowany JavaScript JavaScript Math.random() generuje niepoprawnie równomiernie rozłożone liczby.

Czy ktoś ma podobne problemy?

Tutaj można znaleźć funkcję zigguratu:

http://www.filosophy.org/post/35/normaldistributed_random_values_in_javascript_using_the_ziggurat_algorithm/

A poniżej jest kod na Box-Muller:

function rnd_bmt() { 
    var x = 0, y = 0, rds, c; 

    // Get two random numbers from -1 to 1. 
    // If the radius is zero or greater than 1, throw them out and pick two 
    // new ones. Rejection sampling throws away about 20% of the pairs. 
    do { 
     x = Math.random()*2-1; 
     y = Math.random()*2-1; 
     rds = x*x + y*y; 
    } 
    while (rds === 0 || rds > 1) 

    // This magic is the Box-Muller Transform 
    c = Math.sqrt(-2*Math.log(rds)/rds); 

    // It always creates a pair of numbers. I'll return them in an array. 
    // This function is quite efficient so don't be afraid to throw one away 
    // if you don't need both. 
    return [x*c, y*c]; 
} 
+2

Byłoby łatwiej pomóc jeśli pisać kod. –

Odpowiedz

5

Jeśli generować n niezależne normalne zmienne losowej, standard deviation of the mean będzie sigma/sqrt(n).

W twoim przypadku n = 500000 i sigma = 1, więc standardowy błąd średniej wynosi około 1/707 = 0.0014. 95% przedział ufności, przy średniej 0, byłby około dwa razy większy niż ten lub (-0.0028, 0.0028). Twoje próbne środki mieszczą się w tym zakresie.

Twoje oczekiwanie na uzyskanie 0.000000000001 (1e-12) nie jest matematycznie uziemione. Aby uzyskać w tym zakresie dokładność, trzeba wygenerować około 10^24 próbek. Przy 10 000 próbkach na sekundę, które wciąż trwają trzy kwadrylony lat ... właśnie dlatego dobrze jest unikać obliczania rzeczy przez symulację, jeśli to możliwe.

Z drugiej strony, Twój algorytm wydaje się być realizowane prawidłowo :)

+0

wielkie dzięki! nie pamiętałem o standardowym błędzie. – user1658162

+0

jedno ostatnie pytanie: jeśli muszę wygenerować lognormalnie rozprowadzoną serię 500000 liczb podając średnią i wariancję próbki czy muszę dostosować jakiś parametr, aby uzyskać dokładnie tę samą średnią z oryginalnej próbki? – user1658162

+0

Zobacz, jak obliczyć średnią i wariancję parametrów lognormalnych: http://pl.wikipedia.org/wiki/Lognormal_distribution –