Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.programming > #31098 > unrolled thread
| Started by | "M.M." <mmarszik@gmail.com> |
|---|---|
| First post | 2017-12-17 20:33 -0800 |
| Last post | 2017-12-21 11:33 -0800 |
| Articles | 17 — 3 participants |
Back to article view | Back to pl.comp.programming
jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-17 20:33 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-18 08:37 -0800
Re: jeden generator liczb losowych do testowania drugiego? "AK" <nobody@nowhere.net> - 2017-12-20 00:46 +0100
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-19 16:52 -0800
Re: jeden generator liczb losowych do testowania drugiego? "AK" <nobody@nowhere.net> - 2017-12-21 22:53 +0100
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-21 15:05 -0800
Re: jeden generator liczb losowych do testowania drugiego? "AK" <nobody@nowhere.net> - 2017-12-22 09:55 +0100
Re: jeden generator liczb losowych do testowania drugiego? bartekltg <bartekltg@gmail.com> - 2017-12-18 15:48 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-18 17:24 -0800
Re: jeden generator liczb losowych do testowania drugiego? bartekltg <bartekltg@gmail.com> - 2017-12-18 20:11 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-18 21:39 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-18 22:22 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-19 23:30 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-20 10:40 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-20 15:46 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-21 00:25 -0800
Re: jeden generator liczb losowych do testowania drugiego? "M.M." <mmarszik@gmail.com> - 2017-12-21 11:33 -0800
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-17 20:33 -0800 |
| Subject | jeden generator liczb losowych do testowania drugiego? |
| Message-ID | <1d92e1fb-113f-4be9-96a7-6dcc1d439fc4@googlegroups.com> |
Co by było, gdyby rozkład wzorcowy wygenerować innym generatorem,
albo tym samym z innym zarodkiem?
Otóż są problemy z liczeniem chi-square, bo inny generator może
dać w jakimś kubełku zero i by trzeba dzielić przez zero. Założyłem więc, że
jeśli w kubełku wzorcowym jest zero, to tego nie liczę tego kubełka i
zmniejszam ilość stopni swobody. U mnie na komputerze, dla kilku
wypróbowanych zarodków, generator Fibonacciego przeszedł testy.
Kod źródłowy:
https://pastebin.com/KXuKNbws
Przykładowy wynik testu:
time ./frnd
rnd seed1: 1857908775
rnd seed2: 1964250306
--------------------------------------
loops: 100000000
// kubełek fibonacci ranlux48 chi-square
0 60806992 60810278 0.177565312232
1 30434294 30435295 0.032922335729
2 7431596 7428134 1.61352016536
3 1177391 1176480 0.705427206582
4 136542 136582 0.0117145743949
5 12269 12265 0.00130452507134
6 864 911 2.4248079034
7 51 54 0.166666666667
8 1 1 0
chi-square: 5.13392868943979798
chi-dist: 0.1082081103103416237
chi-dist-cum: 0.2568322098770508233
--------------------------------------
real 130m0.354s
user 129m55.568s
sys 0m3.164s
Generator Fibonacciego naprawdę jest bardzo szybki i dobrze
przechodzi testy.
Ciekawe jak się zachowa std::mt19937_64 w takim teście.
Pozdrawiam
[toc] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-18 08:37 -0800 |
| Message-ID | <a42c86df-1aea-462c-9024-f4daa49ebceb@googlegroups.com> |
| In reply to | #31098 |
On Monday, December 18, 2017 at 5:33:04 AM UTC+1, M.M. wrote:
> [...]
> Ciekawe jak się zachowa std::mt19937_64 w takim teście.
Wygląd na to, że std::mt19937_64 dwa testy przeszedł, jeden
co prawda z p-value równym 0.9984, ale przeszedł. Liczb w
obu testach było około 38mld.
Pozdrawiam
P.S.
Pierwszy test:
time ./frnd
rnd seed1: 1048344733
rnd seed2: 707250714
--------------------------------------
loops: 302514177
// kubełek std::mt19937_64 std::ranlux48 chi-square
0 183946412 183955260 0.425576871246
1 92094858 92080380 2.27640767773
2 22458053 22465964 2.785721592
3 3561951 3558532 3.28493912658
4 412856 413504 1.01547748027
5 37076 37688 9.93801740607
6 2788 2676 4.68759342302
7 172 162 0.617283950617
8 11 11 0
chi-square: 25.03101752753471722
chi-dist: 0.000599442989703091512
chi-dist-cum: 0.9984771823024356957
--------------------------------------
^C
real 518m3.047s
user 517m44.904s
sys 0m6.612s
Drugi test:
time ./frnd
rnd seed1: 1800537340
rnd seed2: 2132837258
--------------------------------------
loops: 301268993
// kubełek std::mt19937_64 std::ranlux48 chi-square
0 183192536 183166993 3.56202194683
1 91701620 91722424 4.7186543609
2 22376562 22380635 0.741235849653
3 3547901 3548389 0.0671132730938
4 410212 410556 0.288233517474
5 37260 37082 0.854430721105
6 2726 2730 0.00586080586081
7 163 176 0.960227272727
8 10 8 0.5
chi-square: 11.69777774763957802
chi-dist: 0.04807272058814565609
chi-dist-cum: 0.8347998915301052147
--------------------------------------
^C
real 510m57.016s
user 510m39.752s
sys 0m6.032s
[toc] | [prev] | [next] | [standalone]
| From | "AK" <nobody@nowhere.net> |
|---|---|
| Date | 2017-12-20 00:46 +0100 |
| Message-ID | <p1c8dq$1224$1@gioia.aioe.org> |
| In reply to | #31099 |
Użytkownik "M.M." <mmarszik@gmail.com> napisał: > [...] > Ciekawe jak się zachowa std::mt19937_64 w takim teście. > Wygląda na to, że std::mt19937_64 dwa testy przeszedł, jeden > co prawda z p-value równym 0.9984, ale przeszedł. Liczb w > obu testach było około 38mld. ...no i i po cholere cala Twoja robota ? PS: szczerze: naprawde doceniam aspekt poznawczy tego co zrobiles. Tu szacun. W kwestii sensownosci juz mniej. Po prostu trzeba bylo wpierw sprawdzic jakosc (szybkosc tez, ale IMHO to rzecz mniej wazna w znakomitej wiekszosci przypadkow) standardu (std::mt), a pozniej samemu "odkrywac kolo na nowo"? AK
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-19 16:52 -0800 |
| Message-ID | <d8ac150b-f690-4a13-944d-80d9a61d100d@googlegroups.com> |
| In reply to | #31113 |
On Wednesday, December 20, 2017 at 12:47:09 AM UTC+1, AK wrote: > Użytkownik "M.M." <mmarszik@gmail.com> napisał: > > [...] > > Ciekawe jak się zachowa std::mt19937_64 w takim teście. > > > Wygląda na to, że std::mt19937_64 dwa testy przeszedł, jeden > > co prawda z p-value równym 0.9984, ale przeszedł. Liczb w > > obu testach było około 38mld. > > ...no i i po cholere cala Twoja robota ? Ale konkretnie jaka robota? Po co mi generator Fibonacciego? Po to, że jest bardzo szybki i przechodzi lepiej testy niż MT. > PS: szczerze: naprawde doceniam aspekt poznawczy tego co zrobiles. Tu szacun. Dziękuję. > W kwestii sensownosci juz mniej. Może dlatego, że zaszło jakieś nieporozumienie? 1) Sens generatora Fibonacciego już opisałem powyżej, czasami potrzebuję ekstremalnie szybkiego generatora. 2) W dieharder dobre generatory nie przechodzą testu urodzinowego, musiałem upewnić się jaka jest tego przyczyna. Policzyłem rozkłady na bignum, itd. Ale ok, napisałeś, że w kwestii poznawczej się zgadzasz. 3) Metoda testowania jednego generatora przy pomocy drugiego ma zalety. Spróbuj zaprojektować jakiś bardzo trudny test o skomplikowanym, ale znanym rozkładzie. Czujesz że kłóci się już samo w sobie, prawda? Jak coś może być jednocześnie trudne, skomplikowane i znane? W przypadku metody z dwoma generatorami, jeden generator przygotowuje dowolnie trudny rozkład dla drugiego generatora. Jeśli generatory testu nie przejdą, to mamy 100% pewności, że przynajmniej jeden generator nie jest równomierny. To chyba nieporozumienie, bo sporo w tym sensu? > Po prostu trzeba bylo wpierw sprawdzic jakosc > (szybkosc tez, ale IMHO to rzecz mniej wazna w znakomitej wiekszosci przypadkow) > standardu (std::mt), a pozniej samemu "odkrywac kolo na nowo"? To na 100% nieporozumienie, bo żadnego koła nie odkryłem. Używam często, od kilku, a może od kilkunastu lat, generatorów Fibonacciego. Teorię wziąłem z książki, nic nie odkrywałem. Używam ich, bo są zarazem szybsze od mt i dają lepsze liczby (czytaj: częściej przechodzi testy) niż mt. A mt sprawdzałem pierwszy raz... nie pamiętam już kiedy, dawno. Teraz użyłem mt raczej dlatego, żeby zobaczyć, jakie będą wyniki. Teraz sprawdzałem raczej program testujący, a nie mt. Jeśli (w miarę) dobry generator by nie przeszedł testów, to mamy silną przesłankę za tym, aby w kodzie testującym szukać błędów. A tak poza tym, nie tak dawno, to ktoś inny, a nie ja, wywołał temat szybkiego generatora liczb losowych, ja tylko trochę rozszerzyłem ;-) Pozdrawiam
[toc] | [prev] | [next] | [standalone]
| From | "AK" <nobody@nowhere.net> |
|---|---|
| Date | 2017-12-21 22:53 +0100 |
| Message-ID | <p1hahr$h32$1@gioia.aioe.org> |
| In reply to | #31114 |
Użytkownik "M.M." <mmarszik@gmail.com> napisał:
> > Wygląda na to, że std::mt19937_64 dwa testy przeszedł, jeden
> > co prawda z p-value równym 0.9984, ale przeszedł. Liczb w
> > obu testach było około 38mld.
>
> ...no i i po cholere cala Twoja robota ?
>> W kwestii sensownosci juz mniej.
>Może dlatego, że zaszło jakieś nieporozumienie?
Nie tyle nieporozumienie, tylko to, ze moje uwagi byly wybitnie
ukierunkowane pod potrzeby "pytacza" ktore sa tak proste/standardowe,
ze nie ma sensu uzywac nic innego jak wlasnie standardowe "randomy",
a juz zupelnie nie ma sensu tworzyc cus w assemblerze w tym ("pytacza") kontekscie.
W kontekscie natomiast Twojego rozwiniecia tematu nie mam
nie tylko najmniejszych zastrzezen, ale po prostu juz "grzrecznie, milcze" bo:
1. przerastacie mnie z Bartkiem na dzis o glowe z wiedza
(no kiedys gdy na Odrze pisalem "troche" programow symulacyjnych
gdzie roznego rodzaju generatory - jednostajny, normalny, Poisona itp itd -
byly u mnie "na porzadku dziennym" moglibysmy glebiej pogadac
/choc wtedy Mersene jeszcze nie bylo/ :)
2. Wasz watek jest naprawde interesujacy - skopiowalem kod/rozwiazania
co mi sie zdarza juz bardzo rzadko. Wcale nie z tego powodu ze "wiem lepiej",
ale z racji ogolnego znudzenia zawodem i "poziomem"/mialkoscia dzisiejszej Mlodziezy/usnetu.
> 1) Sens generatora Fibonacciego już opisałem powyżej, czasami
> potrzebuję ekstremalnie szybkiego generatora.
j/w: grzecznie ,milcze :)
> A tak poza tym, nie tak dawno, to ktoś inny, a nie ja, wywołał temat
> szybkiego generatora liczb losowych, ja tylko trochę rozszerzyłem ;-)
"Troche" ;) ? Heh.
No wypada sobie zyczyc wiecej takich "troche" :)
Porzadne metodyczne/systematyczne podejscie do tematu.
Z mojej strony bezwarunlowy szacun :)
PS: Co nie znaczy ze gdy ew. w innym termacie walniesz gdzies jakas glupote
nie omieszkam zmieszac Cie z (s)firem :) / no moze az tak to nie ;)/
AK
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-21 15:05 -0800 |
| Message-ID | <9a50767c-da08-456e-ba4d-8ad58f5d500a@googlegroups.com> |
| In reply to | #31136 |
On Thursday, December 21, 2017 at 10:54:06 PM UTC+1, AK wrote: > Użytkownik "M.M." <mmarszik@gmail.com> napisał: > [...] > j/w: grzecznie ,milcze :) Ok, rozumiem. Ale ja mam góra podstawową wiedzę statystyczną. Nie wiedziałem np. że złącza się kubełki gdy przypada mało liczb na kubełek. > > A tak poza tym, nie tak dawno, to ktoś inny, a nie ja, wywołał temat > > szybkiego generatora liczb losowych, ja tylko trochę rozszerzyłem ;-) > > "Troche" ;) ? Heh. No może trochę więcej niż trochę ;-) Zaniepokoiło mnie to że dobre generatory nie przechodzą testu urodzinowego w dieharder i pociągnąłem temat. > No wypada sobie zyczyc wiecej takich "troche" :) > Porzadne metodyczne/systematyczne podejscie do tematu. > Z mojej strony bezwarunlowy szacun :) Dzięki, ale tu nie ma nic zaawansowanego. Są trzy wzory z definicji na dużej precyzji. Gamę liczy biblioteka. Do tego jest jedno całkowanie trapezami - bardziej lamersko nie można, chyba że prostokątami ;-) Generator Fibonacciego z lagiem stanowi jedno dodawanie :) Ostatnia rzecz to procedura generująca dowolny rozkład w kubełkach - mam nadzieję że to jest dobra procedura robiąca test urodzinowy. Reszta to wyświetlanie wyników i "formatowanie kodu w c++". > PS: Co nie znaczy ze gdy ew. w innym termacie walniesz gdzies jakas glupote > nie omieszkam zmieszac Cie z (s)firem :) / no moze az tak to nie ;)/ Ale na spokojnie też zrozumiem, albo... nie zawsze za pierwszym razem ;-) Pozdrawiam
[toc] | [prev] | [next] | [standalone]
| From | "AK" <nobody@nowhere.net> |
|---|---|
| Date | 2017-12-22 09:55 +0100 |
| Message-ID | <p1ihab$4lq$1@gioia.aioe.org> |
| In reply to | #31137 |
Użytkownik "M.M." <mmarszik@gmail.com> napisał: > Użytkownik "M.M." <mmarszik@gmail.com> napisał: > [...] > j/w: grzecznie ,milcze :) > Ok, rozumiem. Ale ja mam góra podstawową wiedzę statystyczną. No i co z tego? Porzadnie "zalapales" temat i mysle ze niedlugo staniesz sie specjalista w tej domenie :) > > A tak poza tym, nie tak dawno, to ktoś inny, a nie ja, wywołał temat > > szybkiego generatora liczb losowych, ja tylko trochę rozszerzyłem ;-) > >> "Troche" ;) ? Heh. > No może trochę więcej niż trochę ;-) Zaniepokoiło mnie to że dobre generatory > nie przechodzą testu urodzinowego w dieharder i pociągnąłem temat. Tu tez mi sie podoba, ze nie potratowales "aksjomatycznie" tzw standardow :) Zarowno biblioteki kompilatorow nie sa doskonale jak i inne "standardy". Pisza je zwykli (tacy sami) jak my ludzie. Bardzo czesto (ostatnio juz wylacznie:) spotykam postawe ze to co z USA to jest _bezwzglednie_ doskonale, a to co nasze (polskie) to z zasady beee. Tymczasem w dziedzinie szeroko pojetej inz.programowania akurat Europa historycznie ma wiekszy dorobek i nie mozna miec idiotycznych kompleksow. Pisze to bardzo ceniac USA (o wiele bardziej niz... Kur...rope - szczegolnie pragmatyzm USA) i.. swiadomie "zbaczam" z tematu aby kolejny raz "wlozyc kij w mrowisko"... >> No wypada sobie zyczyc wiecej takich "troche" :) >> Porzadne metodyczne/systematyczne podejscie do tematu.t >> Z mojej strony bezwarunlowy szacun :) > Dzięki, ale tu nie ma nic zaawansowanego. Są trzy wzory z definicji > na dużej precyzji. Nie o to chodzi jak zaawansowane matematycznie/merytorycznie jest zagadnienie. Chodzi o Twoj sposob podejscia do tematu. Nie "fanatyczny/uczuciowy" lecz taki stricte inzynierski/profesjonalny. Dzis coraz rzadszy nie tylko w usenecie lecz i w "normalnej" zawodowej rzeczywistosci. AK
[toc] | [prev] | [next] | [standalone]
| From | bartekltg <bartekltg@gmail.com> |
|---|---|
| Date | 2017-12-18 15:48 -0800 |
| Message-ID | <df89446d-9f33-4313-aa65-2ecbe99c2585@googlegroups.com> |
| In reply to | #31098 |
On Monday, December 18, 2017 at 5:33:04 AM UTC+1, M.M. wrote: > Co by było, gdyby rozkład wzorcowy wygenerować innym generatorem, Powinno być w miarę dobrze, tyle, że to test na to, że oba generatory daj ten sam rozkład, nie na to, że generatory sa dobre! Do Twoich celów musiałbyś więc założyć, że jeden z nich jest dobry;-) a to może zostać odebrane jako mętne. Pamiętaj, że te testy mają test i chi^2. Ten pierwszy też może być chi^2, ale nie musi (np kołgomorowa-kogośtam dla ciągłych). Rozumiem, że mówisz o zastąpieniu właśnie tego pierwszego testu? Czy drugiego? Jeśli pierwszgo, to znany asymptotyczny rozkład (o dystrybuancie F) używamy tylko do rozsądnego podziału kubełków, generujemy właściwy test, wychodzi x, liczym y = F^-1(x), i ładujemy do odpowiedniego kubełka. Teraz testujemy (np chi^2) czy oba generatory miały ten sam rozkład (w oryginale - czy jest to rozkład jenostajny). Chyba standardowy chi^2 na porównanie wystarczy (ten, gdzie się porównuje do rozkładów brzegowych https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data ) BTW, trochę zgaduję, bo nie opisałeś, co i w którym momencie robisz. Kod jest i z niego wszytko wynika, ale... przeczytanie kody zajęłoby mi znacznie więcej czasu niż informacji o podstawach w poście;> > albo tym samym z innym zarodkiem? Bardzo zły pomysł. Ten sam generator dla róznych seedów pewnie ma ten sam rozkład. Niekoniecznie dobry. Nic takim testem nie wykryjesz, poza bardzo złymi generatorami;-) >Otóż są problemy z liczeniem chi-square, bo inny generator może >dać w jakimś kubełku zero i by trzeba dzielić przez zero. To źle dobrane kubełki. Dobór kubełków powinien być dobrany do oczekiwanej liczby pomiarów. pzdr bartekltg
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-18 17:24 -0800 |
| Message-ID | <b2214f68-1e85-4335-a2c2-69dddbf375f4@googlegroups.com> |
| In reply to | #31100 |
On Tuesday, December 19, 2017 at 12:48:30 AM UTC+1, bartekltg wrote:
> On Monday, December 18, 2017 at 5:33:04 AM UTC+1, M.M. wrote:
> > Co by było, gdyby rozkład wzorcowy wygenerować innym generatorem,
>
> Powinno być w miarę dobrze, tyle, że to test na to, że oba generatory
> daj ten sam rozkład, nie na to, że generatory sa dobre!
Oczywiście, to tak naprawdę test na to, że oba dają ten sam rozkład.
Można tym też testować ten sam z innym zarodkiem.
> Do Twoich celów musiałbyś więc założyć, że jeden z nich jest dobry;-)
> a to może zostać odebrane jako mętne.
Tak.
> Pamiętaj, że te testy mają test i chi^2.
1) Najpierw jest test urodzinowy. Zliczane jest w kubełkach jak często
było zero powtórzeń, jedno powtórzenie, dwa... N-1.
2) Potem jest liczone chi-kwadrat.
3) Potem chi-kwadrat podstawiane jest do rozkładu - co w sumie nie jest
tutaj przydatne.
4) Ostatecznie jest liczona całka rozkładu (dystrybuanta) od zera do
chi-kwadrat - wychodzi p-value.
> Ten pierwszy też może być chi^2,
> ale nie musi (np kołgomorowa-kogośtam dla ciągłych).
Nie rozumiem. Pierwszy to jest test urodzinowy, jakaś całka, czy
cokolwiek co daje znany rozkład.
> Rozumiem, że mówisz o zastąpieniu właśnie tego pierwszego testu?
> Czy drugiego?
Chyba pierwszego, bo nie bardzo rozumiem jak można zastąpić drugi.
W pierwszym teście dwa generatory budują jakiś rozkład, tutaj konkretnie
rozkład dla testu urodzinowego. W drugim, jeden generator jest traktowany
tak, jakby był teoretycznie idealny i są liczone powyższe punkty od 2 do 4.
> Jeśli pierwszgo, to znany asymptotyczny rozkład (o dystrybuancie F)
> używamy tylko do rozsądnego podziału kubełków, generujemy właściwy
> test, wychodzi x, liczym y = F^-1(x), i ładujemy do odpowiedniego kubełka.
Właśnie tutaj miałem problem. Niby rozkład teoretyczny jest znany dla
testu urodzinowego. Liczyłem poissonem, wartość oczekiwaną brałem z tej
strony:
https://pl.wikipedia.org/wiki/Test_Birthday_Spacings
[
BFloat lambda = 1;
lambda *= n_births;
lambda *= n_births;
lambda *= n_births;
lambda /= 4;
lambda /= l_year;
]
Wartość rozkładu poissona poniżej. Zmienna poisson przechowuje
wartość dla i-tego kubełka.
[
BFloat poisson = boost::multiprecision::exp( lambda * -1.0 );
BFloat chi = 0;
for( unsigned int i=0 ; i<n_births ; i++ ) {
if( i > 0 ) {
poisson *= lambda;
poisson /= i;
}
BFloat E = poisson * loops;
BFloat tmp = sums[i] - E; // (test - E)
tmp = tmp * tmp / E; // (test - E)^2 / E
if( E >= 0.001 || sums[i] > 0 ) {
std::cout << std::setw( 5) << i << " " ;
std::cout << std::setw(11) << sums[i] << " " ;
std::cout << std::setw(16) << std::setprecision(12) << E << " ";
std::cout << std::setw(16) << std::setprecision(12) << tmp << std::endl;
}
chi += tmp;
}
]
Rozkład chi-kwadrat tutaj:
[
BFloat chi_dist( BFloat x , BFloat n ) {
return
boost::multiprecision::pow( x , n / 2 - 1 )
*
boost::multiprecision::exp( x / -2 )
/
boost::math::tgamma( n / 2 )
/
boost::multiprecision::pow( BFloat(2) , n / 2 );
}
]
Skumulowany (dystrybuanta) tutaj:
[
BFloat chi_dist_cum( BFloat x , BFloat n , const int steps=10000 ) {
BFloat sum = 0;
BFloat step = x / steps;
BFloat x1 = 0;
BFloat x2 = step;
BFloat y1 = chi_dist( x1 , n );
while( x2 <= x ) {
BFloat y2 = chi_dist( x2 , n );
sum += step * ( y1 + y2 ) / 2;
x1 = x2;
x2 += step;
y1 = y2;
}
return sum;
}
]
Ale... nie wiem czy warto się w to wczytywać, bo wolfram i arkusz
kalkulacyjny dawały bardzo podobne wartości dla chi-square, gamy,
poissona, itd.
Prędzej test urodzinowy robię źle. Jedna pętla testu jest tutaj:
[
template<class TRnd>
static void loopBirthdaySpacings(
TRnd &rnd, // generator
const unsigned int l_year, // length of year
const unsigned int n_births, // number of briths
QVector<unsigned int> &sums, // sums
QVector<unsigned int> &births, // work memory
QSet<unsigned int> &dupl // work memory
) {
births.clear();
dupl.clear();
for( unsigned int i=0 ; i<n_births ; i++ ) {
births.append( rnd() % l_year );
}
qSort(births);
unsigned int sum = 0;
for( unsigned int i=0 ; i<n_births ; i++ ) {
const unsigned int dist = i==0 ? births[0] : births[i] - births[i-1];
if( ! dupl.contains( dist ) ) {
dupl.insert( dist );
} else {
sum ++;
}
}
sums[ sum ] ++;
}
]
W sums są kubełki. Jeśli było N powtórzeń, to sums[N]++;
dla 0 <= N < ilość urodzeń.
Reszta kodu to wyświetlanie, albo zdublowanie.
W main definiuje się dwa (lub jeden z różnymi seedami) generatory jakie
chcemy przetestować:
ExactRnd exact_rnd(seed1);
TestRnd test_rnd(seed2);
birthdaySpacings<TestRnd,ExactRnd>( test_rnd , exact_rnd , 1<<20 , 1<<7 , 100000000 );
Podaje się długość roku i ile pierwszych urodzeń w roku chcemy analizować.
Ostatni parametr 100000000 to maksymalna ilość pętli.
> Teraz testujemy (np chi^2) czy oba generatory miały ten sam rozkład
> (w oryginale - czy jest to rozkład jenostajny).
Tak, taki miałem zamiar.
> Chyba standardowy chi^2 na porównanie wystarczy (ten, gdzie się porównuje
> do rozkładów brzegowych
> https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data
> )
To chyba robię dobrze, bo testy dla dwóch różnych generatorów udają się.
>
> BTW, trochę zgaduję, bo nie opisałeś, co i w którym momencie robisz.
> Kod jest i z niego wszytko wynika, ale... przeczytanie kody zajęłoby
> mi znacznie więcej czasu niż informacji o podstawach w poście;>
Mam nadzieję że trochę wyjaśniłem.
> > albo tym samym z innym zarodkiem?
>
> Bardzo zły pomysł. Ten sam generator dla róznych seedów pewnie ma
> ten sam rozkład. Niekoniecznie dobry. Nic takim testem nie wykryjesz,
> poza bardzo złymi generatorami;-)
Hmmm, muszę spróbować i przemyśleć na spokojnie.
> >Otóż są problemy z liczeniem chi-square, bo inny generator może
> >dać w jakimś kubełku zero i by trzeba dzielić przez zero.
>
> To źle dobrane kubełki.
> Dobór kubełków powinien być dobrany do oczekiwanej liczby
> pomiarów.
Hmmm ale przy teście urodzinowym ilość kubełków jest zawsze
równa ilości pierwszych urodzin.
Mnie się zdaje, że albo źle robię test urodzinowy, albo rozkład
poissona słabo przybliża rozkład testu urodzinowego. Może trzeba
wziąć bardzo długi rok (np. miliard dni) i tylko kilka
najczęstszych kubełków... Nie wiem.
Pozdrawiam
>
>
> pzdr
> bartekltg
[toc] | [prev] | [next] | [standalone]
| From | bartekltg <bartekltg@gmail.com> |
|---|---|
| Date | 2017-12-18 20:11 -0800 |
| Message-ID | <7c77eae7-0600-4ebe-9428-783b16fe069d@googlegroups.com> |
| In reply to | #31101 |
On Tuesday, December 19, 2017 at 2:24:09 AM UTC+1, M.M. wrote: > On Tuesday, December 19, 2017 at 12:48:30 AM UTC+1, bartekltg wrote: > > On Monday, December 18, 2017 at 5:33:04 AM UTC+1, M.M. wrote: > > > Co by było, gdyby rozkład wzorcowy wygenerować innym generatorem, > > > > Powinno być w miarę dobrze, tyle, że to test na to, że oba generatory > > daj ten sam rozkład, nie na to, że generatory sa dobre! > Oczywiście, to tak naprawdę test na to, że oba dają ten sam rozkład. > Można tym też testować ten sam z innym zarodkiem. > > > > Do Twoich celów musiałbyś więc założyć, że jeden z nich jest dobry;-) > > a to może zostać odebrane jako mętne. > Tak. > > > Pamiętaj, że te testy mają test i chi^2. > 1) Najpierw jest test urodzinowy. Zliczane jest w kubełkach jak często > było zero powtórzeń, jedno powtórzenie, dwa... N-1. OK > 2) Potem jest liczone chi-kwadrat. > 3) Potem chi-kwadrat podstawiane jest do rozkładu - co w sumie nie jest > tutaj przydatne. Pewien jesteś, że chi^2 z kubełków? A nie liczba trafień podwójnych, potrójnych... w porównaniu do teoretycznej liczby? To też będzie chi^2, ale kubełkami będzie liczba dni z jednym, dwoma, trzema, ...k, "wiecej niż k" trafieniami. k dobrane tak, ze nie ma żadnych zer. Nie wiem, czy tam nie ma jeszcze innego testu, takiego, co bierze dużo liczb, sortuje i patrzy na rozkład różnic. Tam też nie powinno być zer. > 4) Ostatecznie jest liczona całka rozkładu (dystrybuanta) od zera do > chi-kwadrat - wychodzi p-value. I test powtarza się wieloktornie i robi chi^2 na rozkład tego p, powinien być jednostajny. > > Rozumiem, że mówisz o zastąpieniu właśnie tego pierwszego testu? > > Czy drugiego? > Chyba pierwszego, bo nie bardzo rozumiem jak można zastąpić drugi. > W pierwszym teście dwa generatory budują jakiś rozkład, tutaj konkretnie > rozkład dla testu urodzinowego. W drugim, jeden generator jest traktowany > tak, jakby był teoretycznie idealny i są liczone powyższe punkty od 2 do 4. Nie wchodzc w szczgoły. Unikałbym pisania, że zakładasz idealność jakiegoś rozkładu, czy, ze przetestowałeś tak jakiś generator i jest on dobry. Wspomnij o tym raz w trybie przypuszczającym, a pisz o tym, ze test stwierdził brak różnic w rozkłądach generowanych oboma genratorami. W ten sposób nie odstraszysz czytelników;-) > > > Jeśli pierwszgo, to znany asymptotyczny rozkład (o dystrybuancie F) > > używamy tylko do rozsądnego podziału kubełków, generujemy właściwy > > test, wychodzi x, liczym y = F^-1(x), i ładujemy do odpowiedniego kubełka. > Właśnie tutaj miałem problem. Niby rozkład teoretyczny jest znany dla > testu urodzinowego. Liczyłem poissonem, wartość oczekiwaną brałem z tej > strony: > > https://pl.wikipedia.org/wiki/Test_Birthday_Spacings O, to ten drugi. To o rozkładzie poissona to tylko przybliżenia dla dłygiego roku;-) O czym masz w referencjach na tej stronie. > > > > Chyba standardowy chi^2 na porównanie wystarczy (ten, gdzie się porównuje > > do rozkładów brzegowych > > https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data > > ) > To chyba robię dobrze, bo testy dla dwóch różnych generatorów udają się. Eeee, to tak nie działa, to, że dało wynik OK to kiepska przesłanka;-) Chyba też nie robisz dokłądnie tak, bo wtedy byś nie miał problemu z tym, że jeden generator dał 0 w danym kukbełku, bo dzieli się przez sumę z obu. > > > albo tym samym z innym zarodkiem? > > > > Bardzo zły pomysł. Ten sam generator dla róznych seedów pewnie ma > > ten sam rozkład. Niekoniecznie dobry. Nic takim testem nie wykryjesz, > > poza bardzo złymi generatorami;-) > Hmmm, muszę spróbować i przemyśleć na spokojnie. Jeśli generator G zasedowany s będzie miał nny rozkłąd niż zaseedowany s', to jest to oczywiście generator zepsuty. Ale generator G może mieć ten sam rozkład niezależnie od seede s, a być ujowym generatorem. Weż dobry genrator h i zrób z niego kiepski: Niech G daje liczbę będącą średnią dwuch odpaleń generatora h. G nie jest nawet w przybliżeniu jednorodny. A Twój test przejdzie. > > >Otóż są problemy z liczeniem chi-square, bo inny generator może > > >dać w jakimś kubełku zero i by trzeba dzielić przez zero. > > > > To źle dobrane kubełki. > > Dobór kubełków powinien być dobrany do oczekiwanej liczby > > pomiarów. > > Hmmm ale przy teście urodzinowym ilość kubełków jest zawsze > równa ilości pierwszych urodzin. Nie. Czemu. Klasycznie bierzesz np 1024 urodzin i rok na 2^24. To daje średnią 16. Masz coś, co z grubsza wygląda jak rozkład poissona o średniej 16 i ma 1023 punkty. Rozsądne kubełki to tak 7-25. Pozostałe połączyłbym w jeden to tego typu testów BTW, moze sie przydać https://www.jstatsoft.org/article/view/v007i03/tuftests.pdf > > Mnie się zdaje, że albo źle robię test urodzinowy, albo rozkład > poissona słabo przybliża rozkład testu urodzinowego. Może trzeba > wziąć bardzo długi rok (np. miliard dni) i tylko kilka > najczęstszych kubełków... Nie wiem. Tak. Piszą o tym w przypisach artykułu, który wysłałes;-) pzdr bartekltg
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-18 21:39 -0800 |
| Message-ID | <08871785-d6ca-40a2-bca8-d750fac09cfb@googlegroups.com> |
| In reply to | #31102 |
On Tuesday, December 19, 2017 at 5:11:43 AM UTC+1, bartekltg wrote: > On Tuesday, December 19, 2017 at 2:24:09 AM UTC+1, M.M. wrote: > > On Tuesday, December 19, 2017 at 12:48:30 AM UTC+1, bartekltg wrote: > > > On Monday, December 18, 2017 at 5:33:04 AM UTC+1, M.M. wrote: > > > > Co by było, gdyby rozkład wzorcowy wygenerować innym generatorem, > > > > > > Powinno być w miarę dobrze, tyle, że to test na to, że oba generatory > > > daj ten sam rozkład, nie na to, że generatory sa dobre! > > Oczywiście, to tak naprawdę test na to, że oba dają ten sam rozkład. > > Można tym też testować ten sam z innym zarodkiem. > > > > > > > Do Twoich celów musiałbyś więc założyć, że jeden z nich jest dobry;-) > > > a to może zostać odebrane jako mętne. > > Tak. > > > > > Pamiętaj, że te testy mają test i chi^2. > > 1) Najpierw jest test urodzinowy. Zliczane jest w kubełkach jak często > > było zero powtórzeń, jedno powtórzenie, dwa... N-1. > > OK > > > 2) Potem jest liczone chi-kwadrat. > > 3) Potem chi-kwadrat podstawiane jest do rozkładu - co w sumie nie jest > > tutaj przydatne. > > Pewien jesteś, że chi^2 z kubełków? A nie liczba trafień podwójnych, > potrójnych... w porównaniu do teoretycznej liczby? O ile rozumiem, właśnie to miałem na myśli. W kubełkach mam właśnie liczbę trafień. Może niepotrzebnie używam tutaj słowa 'kubełek', bo zazwyczaj o kubełkach mówi się gdy zmienną ciągłą dzieli się na przedziały. W zmiennej 'sums' mam liczbę: sums[0] - bez powtórzeń sums[1] - z jednym powtórzeniem sums[N-1] - z N-1 powtórzeniami Potem robię: sum( (sums[i] - e[i])^2 / e[i] ) > To też będzie chi^2, ale kubełkami będzie liczba dni z jednym, > dwoma, trzema, ...k, "wiecej niż k" trafieniami. > k dobrane tak, ze nie ma żadnych zer. Czyli żeby kubełki bliskie zeru połączyć z sobą? Myślę, że dobry pomysł. > Nie wiem, czy tam nie ma jeszcze innego testu, takiego, co > bierze dużo liczb, sortuje i patrzy na rozkład różnic. > Tam też nie powinno być zer. Hmmm formalnie zer nie może być w rozkładzie wzorcowym/teoretycznym. Jeśli jest zero, to mamy: ( wynik_testu - 0 )^2 / 0 Z poissona nigdy zero nie wyjdzie, ale może wyjść 0.001. Jeśli generator akurat trafi jedynkę a nie zero, to mamy: ( 1 - 0.001)^2 / 0.001 = 998 <- rozwali każdy test. > > 4) Ostatecznie jest liczona całka rozkładu (dystrybuanta) od zera do > > chi-kwadrat - wychodzi p-value. > > I test powtarza się wieloktornie i robi chi^2 na rozkład tego p, > powinien być jednostajny. Tego póki co w ogóle nie robiłem. > > > > > Rozumiem, że mówisz o zastąpieniu właśnie tego pierwszego testu? > > > Czy drugiego? > > Chyba pierwszego, bo nie bardzo rozumiem jak można zastąpić drugi. > > W pierwszym teście dwa generatory budują jakiś rozkład, tutaj konkretnie > > rozkład dla testu urodzinowego. W drugim, jeden generator jest traktowany > > tak, jakby był teoretycznie idealny i są liczone powyższe punkty od 2 do 4. > > > Nie wchodzc w szczgoły. Unikałbym pisania, że zakładasz idealność > jakiegoś rozkładu, czy, ze przetestowałeś tak jakiś generator > i jest on dobry. Wspomnij o tym raz w trybie przypuszczającym, > a pisz o tym, ze test stwierdził brak różnic w rozkłądach generowanych > oboma genratorami. W ten sposób nie odstraszysz czytelników;-) Nie chciałem powiedzieć, że wierzę aby generator był doskonały. Po prostu algorytm działa tak, jakby jeden generator był doskonały. W ten sposób chciałem tylko opisać działanie algorytmu. > > https://pl.wikipedia.org/wiki/Test_Birthday_Spacings > > > O, to ten drugi. To o rozkładzie poissona to tylko przybliżenia > dla dłygiego roku;-) O czym masz w referencjach na tej stronie. No tak, ale rok w moim teście, podobnie jak w referencjach, też miał np. 2^24 dni i też nie przechodziło testu. W deiharderze też nie przechodzi jak da się duże m. Gdy porównuję z rozkładem ranluxa, to nagle przechodzi. Coś mi tutaj się nie podoba... > > > > > > > > > Chyba standardowy chi^2 na porównanie wystarczy (ten, gdzie się porównuje > > > do rozkładów brzegowych > > > https://en.wikipedia.org/wiki/Chi-squared_test#Example_chi-squared_test_for_categorical_data > > > ) > > To chyba robię dobrze, bo testy dla dwóch różnych generatorów udają się. > > Eeee, to tak nie działa, to, że dało wynik OK to kiepska przesłanka;-) Ale nie jedyna przesłanka, jeszcze wolfrma i arkusz kalkulacyjny dla kilku przykładów dały te same wyniki. > Chyba też nie robisz dokłądnie tak, bo wtedy byś nie miał problemu > z tym, że jeden generator dał 0 w danym kukbełku, bo dzieli się > przez sumę z obu. Hmmm na wiki jest że dzieli się przez wartość oczekiwaną: https://wikimedia.org/api/rest_v1/media/math/render/svg/f709dc014d7ced59a61000b58cb0ea19ba5926f6 > > > > > > albo tym samym z innym zarodkiem? > > > > > > Bardzo zły pomysł. Ten sam generator dla róznych seedów pewnie ma > > > ten sam rozkład. Niekoniecznie dobry. Nic takim testem nie wykryjesz, > > > poza bardzo złymi generatorami;-) > > Hmmm, muszę spróbować i przemyśleć na spokojnie. > > Jeśli generator G zasedowany s będzie miał nny rozkłąd niż > zaseedowany s', to jest to oczywiście generator zepsuty. > Ale generator G może mieć ten sam rozkład niezależnie od > seede s, a być ujowym generatorem. Tak, to działa tylko w jedną stronę. Jeśli test nie wyjdzie, to przynajmniej jeden z generatorów jest zepsuty. Wnioskowanie w drugą stronę jest ryzykowne. > Weż dobry genrator h i zrób z niego kiepski: > Niech G daje liczbę będącą średnią dwuch odpaleń > generatora h. G nie jest nawet w przybliżeniu jednorodny. > A Twój test przejdzie. Pewnie by przeszedł. > > > To źle dobrane kubełki. > > > Dobór kubełków powinien być dobrany do oczekiwanej liczby > > > pomiarów. > > > > Hmmm ale przy teście urodzinowym ilość kubełków jest zawsze > > równa ilości pierwszych urodzin. > > Nie. Czemu. > > Klasycznie bierzesz np 1024 urodzin i rok na 2^24. > > To daje średnią 16. Masz coś, co z grubsza wygląda jak rozkład > poissona o średniej 16 i ma 1023 punkty. > Rozsądne kubełki to tak 7-25. Pozostałe połączyłbym w jeden > to tego typu testów Odpalę taki test, tamten kod można łatwo dostosować. Z tego co sobie przypominam wyniki, też nie przejdzie, bo różnice były nawet w maksimum rozkładu. > > BTW, moze sie przydać > https://www.jstatsoft.org/article/view/v007i03/tuftests.pdf Wygląda ciekawie, dzięki. > > Mnie się zdaje, że albo źle robię test urodzinowy, albo rozkład > > poissona słabo przybliża rozkład testu urodzinowego. Może trzeba > > wziąć bardzo długi rok (np. miliard dni) i tylko kilka > > najczęstszych kubełków... Nie wiem. > > Tak. Piszą o tym w przypisach artykułu, który wysłałes;-) Ale co tak? Źle robię test, czy rozkład poissona tak źle przybliża Birthday Spacings Test ? Pozdrawiam
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-18 22:22 -0800 |
| Message-ID | <57990515-34ba-48e9-a39b-cc6149555eab@googlegroups.com> |
| In reply to | #31103 |
On Tuesday, December 19, 2017 at 6:39:25 AM UTC+1, M.M. wrote: > > > Mnie się zdaje, że albo źle robię test urodzinowy, albo rozkład > > > poissona słabo przybliża rozkład testu urodzinowego. Może trzeba > > > wziąć bardzo długi rok (np. miliard dni) i tylko kilka > > > najczęstszych kubełków... Nie wiem. > > > > Tak. Piszą o tym w przypisach artykułu, który wysłałes;-) > > Ale co tak? Źle robię test, czy rozkład poissona tak źle > przybliża Birthday Spacings Test ? > Rozumiem, że im się tylko wydaje iż rozkład poissona to dobrze aproksymuje, że tylko liczne testy to potwierdzają: [ Theory provides little guidance on speed of the approach to limiting form, but extensive simulation with a variety of RNG’s provides values of m and n for which the limiting Poisson distribution seems satisfactory. ] Potem piszą, że w teście biorą tylko 5000 przebiegów: [ This process is repeated to get a sample of 5000 from that Poisson distribution ] A ja chciałem testować całą dobę na kilku rdzeniach, czyli na miliardach przebiegów. Coraz bardziej jestem pewny, że nie mam błędu, a po prostu poisson się rozjeżdża z Birthday Spacings nawet dla roku o długości 2^24. Pozdrawiam
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-19 23:30 -0800 |
| Message-ID | <2027339c-574e-44f6-8a51-4217e48a355f@googlegroups.com> |
| In reply to | #31102 |
On Tuesday, December 19, 2017 at 5:11:43 AM UTC+1, bartekltg wrote:
> [...]
> Weź dobry generator h i zrób z niego kiepski:
> Niech G daje liczbę będącą średnią dwóch odpaleń
> generatora h. G nie jest nawet w przybliżeniu jednorodny.
> A Twój test przejdzie.
> [...]
Co myślisz o tym na dole? Porównałem ranlux48 z ranlux48 na innych
seedach. Długość roku dałem 2^20, ilość urodzin 2^12. Ilość
kubełków zredukowałem, jak radziłeś. Cały kod:
https://pastebin.com/JhLN12C5
P-value wyszło 0.9999927195600541432. Może jednak taki test jest trochę
lepszy niż myślimy?
time ./frnd
rnd seed1: 1163463455
rnd seed2: 1984622677
chi-square: 122.5638184406948564
chi-dist: 1.909341135233440832e-06
chi-dist-cum: 0.9999927195600541432
--------------------------------------
^C
real 102m38.915s
user 102m22.596s
sys 0m10.160s
Kubełki:
0 475 472 0.0190677966102
1 153 178 3.51123595506
2 251 263 0.54752851711
3 371 375 0.0426666666667
4 542 515 1.41553398058
5 846 840 0.0428571428571
6 1053 1128 4.98670212766
7 1564 1565 0.000638977635783
8 2187 2089 4.59741503112
9 2991 2801 12.8882541949
10 3862 3926 1.04330106979
11 5028 5012 0.0510774142059
12 6667 6637 0.135603435287
13 8581 8396 4.07634587899
14 11039 11140 0.915709156194
15 13611 13763 1.67870377098
16 16827 16828 5.94247682434e-05
17 20729 20540 1.73909444985
18 25058 24955 0.425125225406
19 29748 29642 0.379056743809
20 34722 34355 3.9205064765
21 39962 39966 0.000400340289246
22 45666 45611 0.0663217206376
23 50888 51324 3.70384225703
24 56501 56747 1.06641760798
25 62241 61824 2.81264557453
26 66695 66457 0.852340611222
27 70825 70981 0.342852312591
28 74429 74460 0.0129062583938
29 76968 78238 20.6153020271
30 78476 78737 0.865171393373
31 79766 80160 1.93657684631
32 79360 78559 8.16712279942
33 77508 77537 0.0108464346054
34 75260 75084 0.412551275904
35 71362 71280 0.0943322109989
36 66661 66850 0.534345549738
37 62177 62491 1.5777631979
38 56758 56954 0.674509253081
39 51661 51124 5.64057976684
40 45815 45673 0.44148621724
41 40740 40463 1.89627560982
42 34935 34509 5.25880205164
43 29703 30088 4.92638261101
44 25035 25077 0.0703433425051
45 21068 20974 0.42128349385
46 17340 17215 0.907638687191
47 14079 14042 0.097493234582
48 11251 11209 0.15737353912
49 8795 8787 0.00728348696939
50 6710 6883 4.34824930989
51 5180 5161 0.0699476845573
52 3882 3948 1.10334346505
53 2900 2986 2.47689216343
54 2104 2157 1.30227167362
55 1572 1628 1.92628992629
56 1120 1090 0.825688073394
57 810 781 1.07682458387
58 500 499 0.00200400801603
59 372 394 1.22842639594
60 272 276 0.0579710144928
61 180 173 0.28323699422
62 105 120 1.875
Pozdrawiam
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-20 10:40 -0800 |
| Message-ID | <bbd9bc33-9495-42df-98ab-2f61af046bc7@googlegroups.com> |
| In reply to | #31116 |
On Wednesday, December 20, 2017 at 8:30:32 AM UTC+1, M.M. wrote: > On Tuesday, December 19, 2017 at 5:11:43 AM UTC+1, bartekltg wrote: > > > [...] > > Weź dobry generator h i zrób z niego kiepski: > > Niech G daje liczbę będącą średnią dwóch odpaleń > > generatora h. G nie jest nawet w przybliżeniu jednorodny. > > A Twój test przejdzie. > > [...] > > Co myślisz o tym na dole? Porównałem ranlux48 z ranlux48 na innych > seedach. Długość roku dałem 2^20, ilość urodzin 2^12. Ilość > kubełków zredukowałem, jak radziłeś. Cały kod: > > https://pastebin.com/JhLN12C5 > > > P-value wyszło 0.9999927195600541432. Może jednak taki test jest trochę > lepszy niż myślimy? MT testowany sam ze sobą raczej też nie przechodzi testu: test 1 chi-dist-cum: 0.9999997015849526988 test 2 chi-dist-cum: 0.9999228118927154972
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-20 15:46 -0800 |
| Message-ID | <ca24cdbf-454d-4a6b-90eb-dbbc05bdb70b@googlegroups.com> |
| In reply to | #31117 |
On Wednesday, December 20, 2017 at 7:40:52 PM UTC+1, M.M. wrote: > On Wednesday, December 20, 2017 at 8:30:32 AM UTC+1, M.M. wrote: > > On Tuesday, December 19, 2017 at 5:11:43 AM UTC+1, bartekltg wrote: > > > > > [...] > > > Weź dobry generator h i zrób z niego kiepski: > > > Niech G daje liczbę będącą średnią dwóch odpaleń > > > generatora h. G nie jest nawet w przybliżeniu jednorodny. > > > A Twój test przejdzie. > > > [...] > > > > Co myślisz o tym na dole? Porównałem ranlux48 z ranlux48 na innych > > seedach. Długość roku dałem 2^20, ilość urodzin 2^12. Ilość > > kubełków zredukowałem, jak radziłeś. Cały kod: > > > > https://pastebin.com/JhLN12C5 > > > > > > P-value wyszło 0.9999927195600541432. Może jednak taki test jest trochę > > lepszy niż myślimy? > > > MT testowany sam ze sobą raczej też nie przechodzi testu: > > test 1 > chi-dist-cum: 0.9999997015849526988 > > test 2 > chi-dist-cum: 0.9999228118927154972 I generator Fibonacciego z tamtego kodu powyżej ( przypomnę: https://pastebin.com/JhLN12C5 ), gdy jest testowany sam ze sobą, też nie przechodzi testu urodzinowego. Albo mam błąd, albo to jest lepszy (bo trudniejszy) test niż można było się spodziewać :) Ale błędu raczej nie mam, bo ten sam kod generuje oba rozkłady i inne narzędzia dają tę samą wartość p-value. Mam prośbę, spójrzcie na tamten kod, może znajdziecie błędy? Przy założeniu, że nie mam błędu, jakie płyną z tego wnioski? Proszę, jeden ważny wniosek: Jeśli uruchamiacie symulację na klastrze, jeśli używacie nawet tak dobrych generatorów jak std::ranlux48 lub std::mt19937_64 i w każdym procesie/wątku liczycie to samo zadanie z innym seedem, to wyniki z poszczególnych wątków/procesów prawdopodobnie nie są niezależne :) Ułatwię test. Zrobię rok o długości 2^24 i dam 32 urodziny. Generatory powinny przejść ułatwione testy.... zobaczymy. Z jakiś czas dam wyniki. Pozdrawiam
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-21 00:25 -0800 |
| Message-ID | <264aa68a-cd26-4b58-b33e-9833fd601cb7@googlegroups.com> |
| In reply to | #31118 |
On Thursday, December 21, 2017 at 12:46:19 AM UTC+1, M.M. wrote:
> On Wednesday, December 20, 2017 at 7:40:52 PM UTC+1, M.M. wrote:
> > On Wednesday, December 20, 2017 at 8:30:32 AM UTC+1, M.M. wrote:
> > > On Tuesday, December 19, 2017 at 5:11:43 AM UTC+1, bartekltg wrote:
> > >
> > > > [...]
> > > > Weź dobry generator h i zrób z niego kiepski:
> > > > Niech G daje liczbę będącą średnią dwóch odpaleń
> > > > generatora h. G nie jest nawet w przybliżeniu jednorodny.
> > > > A Twój test przejdzie.
> > > > [...]
> > >
> > > Co myślisz o tym na dole? Porównałem ranlux48 z ranlux48 na innych
> > > seedach. Długość roku dałem 2^20, ilość urodzin 2^12. Ilość
> > > kubełków zredukowałem, jak radziłeś. Cały kod:
> > >
> > > https://pastebin.com/JhLN12C5
> > >
> > >
> > > P-value wyszło 0.9999927195600541432. Może jednak taki test jest trochę
> > > lepszy niż myślimy?
> >
> >
> > MT testowany sam ze sobą raczej też nie przechodzi testu:
> >
> > test 1
> > chi-dist-cum: 0.9999997015849526988
> >
> > test 2
> > chi-dist-cum: 0.9999228118927154972
>
> I generator Fibonacciego z tamtego kodu powyżej ( przypomnę:
> https://pastebin.com/JhLN12C5 ), gdy jest testowany sam ze sobą,
> też nie przechodzi testu urodzinowego. Albo mam błąd, albo to
> jest lepszy (bo trudniejszy) test niż można było się spodziewać :)
> Ale błędu raczej nie mam, bo ten sam kod generuje oba rozkłady i
> inne narzędzia dają tę samą wartość p-value. Mam prośbę, spójrzcie
> na tamten kod, może znajdziecie błędy?
>
> Przy założeniu, że nie mam błędu, jakie płyną z tego wnioski? Proszę,
> jeden ważny wniosek: Jeśli uruchamiacie symulację na klastrze, jeśli
> używacie nawet tak dobrych generatorów jak std::ranlux48 lub
> std::mt19937_64 i w każdym procesie/wątku liczycie to samo zadanie z
> innym seedem, to wyniki z poszczególnych wątków/procesów prawdopodobnie
> nie są niezależne :)
>
>
> Ułatwię test. Zrobię rok o długości 2^24 i dam 32 urodziny. Generatory
> powinny przejść ułatwione testy.... zobaczymy. Z jakiś czas dam wyniki.
>
Generator Fibonacciego na ułatwionym teście zachował się przyzwoicie.
P-value jest równe 0.6862016765421758663. W teście było wygenerowanych
3E11 liczb pseudo-losowych, ponad 11 godzin obliczeń.
Kod:
https://pastebin.com/1huv7HP5
Test:
time ./frnd
rnd seed1: 252276773
rnd seed2: 1201639756
--------------------------------------
loops: 4763156481
0 465935620 465937865 0.0108169465901
1 2253109 2250870 2.22719259664
2 456 450 0.08
chi-square: 2.318009543230488209
chi-dist: 0.1568991632651941654
chi-dist-cum: 0.6862016765421758663
--------------------------------------
^C
real 679m37.501s
user 679m28.800s
sys 0m2.584s
[toc] | [prev] | [next] | [standalone]
| From | "M.M." <mmarszik@gmail.com> |
|---|---|
| Date | 2017-12-21 11:33 -0800 |
| Message-ID | <ae47d0b1-513e-4251-a9be-6fad2dd02ce1@googlegroups.com> |
| In reply to | #31120 |
On Thursday, December 21, 2017 at 9:25:55 AM UTC+1, M.M. wrote:
> On Thursday, December 21, 2017 at 12:46:19 AM UTC+1, M.M. wrote:
> > On Wednesday, December 20, 2017 at 7:40:52 PM UTC+1, M.M. wrote:
> > > On Wednesday, December 20, 2017 at 8:30:32 AM UTC+1, M.M. wrote:
> > > > On Tuesday, December 19, 2017 at 5:11:43 AM UTC+1, bartekltg wrote:
> > > >
> > > > > [...]
> > > > > Weź dobry generator h i zrób z niego kiepski:
> > > > > Niech G daje liczbę będącą średnią dwóch odpaleń
> > > > > generatora h. G nie jest nawet w przybliżeniu jednorodny.
> > > > > A Twój test przejdzie.
> > > > > [...]
> > > >
> > > > Co myślisz o tym na dole? Porównałem ranlux48 z ranlux48 na innych
> > > > seedach. Długość roku dałem 2^20, ilość urodzin 2^12. Ilość
> > > > kubełków zredukowałem, jak radziłeś. Cały kod:
> > > >
> > > > https://pastebin.com/JhLN12C5
> > > >
> > > >
> > > > P-value wyszło 0.9999927195600541432. Może jednak taki test jest trochę
> > > > lepszy niż myślimy?
> > >
> > >
> > > MT testowany sam ze sobą raczej też nie przechodzi testu:
> > >
> > > test 1
> > > chi-dist-cum: 0.9999997015849526988
> > >
> > > test 2
> > > chi-dist-cum: 0.9999228118927154972
> >
> > I generator Fibonacciego z tamtego kodu powyżej ( przypomnę:
> > https://pastebin.com/JhLN12C5 ), gdy jest testowany sam ze sobą,
> > też nie przechodzi testu urodzinowego. Albo mam błąd, albo to
> > jest lepszy (bo trudniejszy) test niż można było się spodziewać :)
> > Ale błędu raczej nie mam, bo ten sam kod generuje oba rozkłady i
> > inne narzędzia dają tę samą wartość p-value. Mam prośbę, spójrzcie
> > na tamten kod, może znajdziecie błędy?
> >
> > Przy założeniu, że nie mam błędu, jakie płyną z tego wnioski? Proszę,
> > jeden ważny wniosek: Jeśli uruchamiacie symulację na klastrze, jeśli
> > używacie nawet tak dobrych generatorów jak std::ranlux48 lub
> > std::mt19937_64 i w każdym procesie/wątku liczycie to samo zadanie z
> > innym seedem, to wyniki z poszczególnych wątków/procesów prawdopodobnie
> > nie są niezależne :)
> >
> >
> > Ułatwię test. Zrobię rok o długości 2^24 i dam 32 urodziny. Generatory
> > powinny przejść ułatwione testy.... zobaczymy. Z jakiś czas dam wyniki.
> >
>
> Generator Fibonacciego na ułatwionym teście zachował się przyzwoicie.
> P-value jest równe 0.6862016765421758663. W teście było wygenerowanych
> 3E11 liczb pseudo-losowych, ponad 11 godzin obliczeń.
>
> Kod:
> https://pastebin.com/1huv7HP5
>
>
> Test:
>
> time ./frnd
> rnd seed1: 252276773
> rnd seed2: 1201639756
>
> --------------------------------------
> loops: 4763156481
> 0 465935620 465937865 0.0108169465901
> 1 2253109 2250870 2.22719259664
> 2 456 450 0.08
> chi-square: 2.318009543230488209
> chi-dist: 0.1568991632651941654
> chi-dist-cum: 0.6862016765421758663
> --------------------------------------
>
> ^C
> real 679m37.501s
> user 679m28.800s
> sys 0m2.584s
Uproszczony test przechodzą:
Generator std::ranlux48
rnd seed1: 1898900298
rnd seed2: 16827081
loops: 141295617
0 141229121 141228768 0.000882320236625
1 66489 66834 1.78090492863
2 7 15 4.26666666667
chi-square: 6.048453915532432401
chi-dist: 0.02429768651465504778
chi-dist-cum: 0.9514046559756827399
-------------------------------------------------------------------
Generator std::mt19937_64
rnd seed1: 1661541351
rnd seed2: 1506358270
loops: 4062183425
0 4060261981 4060263019 0.000265363104547
1 1921054 1919983 0.597422477178
2 390 423 2.57446808511
chi-square: 3.172155925389113521
chi-dist: 0.1023634930368723807
chi-dist-cum: 0.7952730205949993346
Pozdrawiam
[toc] | [prev] | [standalone]
Back to top | Article view | pl.comp.programming
csiph-web