eGospodarka.pl

eGospodarka.plGrupypl.comp.programming › jeden generator liczb losowych do testowania drugiego?
Ilość wypowiedzi w tym wątku: 17

  • 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

strony : [ 1 ] . 2



Szukaj w grupach

Szukaj w grupach

REKLAMA

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo:

Ok, rozumiem Strona wykorzystuje pliki cookies w celu prawidłowego jej działania oraz korzystania z narzędzi analitycznych, reklamowych, marketingowych i społecznościowych. Szczegóły znajdują się w Polityce Prywatności. Dalsze korzystanie ze strony oznacza, że zgadzasz się na ich użycie. Jeśli nie chcesz, aby pliki cookies były zapisywane w pamięci Twojego urządzenia, możesz to zmienić za pomocą ustawień przeglądarki.