-
1. Data: 2017-12-18 05:33:02
Temat: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...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
-
2. Data: 2017-12-18 17:37:29
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...com>
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
-
3. Data: 2017-12-19 00:48:28
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: bartekltg <b...@g...com>
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#Examp
le_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
-
4. Data: 2017-12-19 02:24:07
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...com>
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#Examp
le_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
-
5. Data: 2017-12-19 05:11:41
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: bartekltg <b...@g...com>
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#Examp
le_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/tufte
sts.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
-
6. Data: 2017-12-19 06:39:23
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...com>
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#Examp
le_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/tufte
sts.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
-
7. Data: 2017-12-19 07:22:48
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...com>
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
-
8. Data: 2017-12-20 00:46:33
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "AK" <n...@n...net>
Użytkownik "M.M." <m...@g...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
-
9. Data: 2017-12-20 01:52:55
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...com>
On Wednesday, December 20, 2017 at 12:47:09 AM UTC+1, AK wrote:
> Użytkownik "M.M." <m...@g...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
-
10. Data: 2017-12-20 08:30:31
Temat: Re: jeden generator liczb losowych do testowania drugiego?
Od: "M.M." <m...@g...com>
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