eGospodarka.pl

eGospodarka.plGrupypl.comp.programming › Jak zrobić test za pomocą PractRand?
Ilość wypowiedzi w tym wątku: 82

  • 1. Data: 2021-08-19 18:15:24
    Temat: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com>

    Czy ktoś z Was robił testy generatorów liczb pseudolosowych za pomocą PractRand?

    Przeczytałem instrukcje stąd:

    https://www.pcg-random.org/posts/how-to-test-with-pr
    actrand.html

    I zrobiłem build process na konsoli Ubuntu na Windowsie. Chcę jednak zrobić test
    mojego własnego generatora. Rozumiem, że muszę napisać kod w C++. Skopiowałem kod:

    #include <cstdio>
    #include <cstdint>

    #include <random>

    int main()
    {
    freopen(NULL, "wb", stdout); // Only necessary on Windows, but harmless.

    std::mt19937 rng(42);

    while (1) {
    uint32_t value = rng();
    fwrite((void*) &value, sizeof(value), 1, stdout);
    }
    }

    ale nie udało mi się go skompilować. Wynik:

    g++: error: mt19937-min.cpp: No such file or directory
    g++: fatal error: no input files
    compilation terminated.

    Nie wiem właściwie nic o C++, znam podstawy programowania w Pythonie, więc może coś
    robię źle? Niemniej, kod mojego generatora w C++ jakoś sobie prędzej, czy później
    napiszę, choć liczyłem, że będzie można użyć pliku txt z wygenerowanymi już liczbami.
    Najważniejsze jest dla mnie jak to uruchomić.


  • 2. Data: 2021-08-20 00:38:31
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com>

    g++: error: mt19937-min.cpp: No such file or directory
    g++: fatal error: no input files
    compilation terminated.

    To błąd z kompilacją, a nie z samym testem. Błąd tak powszechny i beznadziejny, że
    uznałem, iż prędzej zainstaluję VS i to skompiluję, niż naprawię ten błąd
    (internetowe poradniki są albo nie działają albo są niezrozumiałe). Pozostaje mieć
    nadzieję, że kiedyś ktoś w Linuxie zrobi z tym porządek. Zresztą, jeśli mam napisać i
    kompilować program w C++ i tak przyda mi się VS.

    Same testy dają się odpalić, wczytałem plik z liczbami, ale coś jest nie tak:

    rng=RNG_stdin, seed=0x1687c235
    length= 256 megabytes (2^28 bytes), time= 2.8 seconds
    Test Name Raw Processed Evaluation
    BCFN(2+0,13-2,T) R=+15927312 p = 0 FAIL !!!!!!!!
    BCFN(2+1,13-2,T) R=+11593600 p = 0 FAIL !!!!!!!!
    BCFN(2+2,13-3,T) R=+8011486 p = 0 FAIL !!!!!!!!
    BCFN(2+3,13-3,T) R=+3903870 p = 0 FAIL !!!!!!!!

    Nie wiem nawet, czy liczby w pliku są w odpowiednim formacie (32-bitowe wypisane
    jedna pod drugą) i nie mogę się doszukać w jakim mają być formacie.




  • 3. Data: 2021-08-20 15:04:12
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "M.M." <m...@g...com>

    On Thursday, August 19, 2021 at 6:15:26 PM UTC+2, o...@g...com wrote:
    > Czy ktoś z Was robił testy generatorów liczb pseudolosowych za pomocą PractRand?

    Jeśli chce Ci się czytać C++ to możesz zobaczyć jak ja to zrobiłem:

    https://github.com/mmarszik/MRndCPP

    https://github.com/mmarszik/MRndCPP/blob/master/test
    s/test.sh
    { time ./$prog | ./../../PractRand/RNG_test stdin -singlethreaded -tlmax 360000s >
    $test; } 2> $time

    https://github.com/mmarszik/MRndCPP/blob/master/test
    01.cpp
    fwrite( buf, 1, sizeof(buf), stdout );


    >
    > Przeczytałem instrukcje stąd:
    >
    > https://www.pcg-random.org/posts/how-to-test-with-pr
    actrand.html
    >
    > I zrobiłem build process na konsoli Ubuntu na Windowsie. Chcę jednak zrobić test
    mojego własnego generatora. Rozumiem, że muszę napisać kod w C++. Skopiowałem kod:
    >
    > #include <cstdio>
    > #include <cstdint>
    >
    > #include <random>
    >
    > int main()
    > {
    > freopen(NULL, "wb", stdout); // Only necessary on Windows, but harmless.
    >
    > std::mt19937 rng(42);
    >
    > while (1) {
    > uint32_t value = rng();
    > fwrite((void*) &value, sizeof(value), 1, stdout);
    > }
    > }
    >
    > ale nie udało mi się go skompilować. Wynik:
    >
    > g++: error: mt19937-min.cpp: No such file or directory
    > g++: fatal error: no input files
    > compilation terminated.
    >
    > Nie wiem właściwie nic o C++, znam podstawy programowania w Pythonie, więc może coś
    robię źle? Niemniej, kod mojego generatora w C++ jakoś sobie prędzej, czy później
    napiszę, choć liczyłem, że będzie można użyć pliku txt z wygenerowanymi już liczbami.
    Najważniejsze jest dla mnie jak to uruchomić.

    Słyszałem że temat generowania liczb pseudo-losowych jest bardzo trudny :/

    Pozdrawiam


  • 4. Data: 2021-08-20 16:53:24
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com>

    piątek, 20 sierpnia 2021 o 15:04:14 UTC+2 M.M. napisał(a):
    > On Thursday, August 19, 2021 at 6:15:26 PM UTC+2, o...@g...com wrote:
    > > Czy ktoś z Was robił testy generatorów liczb pseudolosowych za pomocą PractRand?
    > Jeśli chce Ci się czytać C++ to możesz zobaczyć jak ja to zrobiłem:
    >
    > https://github.com/mmarszik/MRndCPP
    >
    > https://github.com/mmarszik/MRndCPP/blob/master/test
    s/test.sh
    > { time ./$prog | ./../../PractRand/RNG_test stdin -singlethreaded -tlmax 360000s >
    $test; } 2> $time
    >
    > https://github.com/mmarszik/MRndCPP/blob/master/test
    01.cpp
    > fwrite( buf, 1, sizeof(buf), stdout );

    Nic z tego nie rozumiem, ani nawet nie wiem od czego zacząć. Co robi Twój kod? Bo
    podstawowe pytanie jakie mam to co ma zwracać program do PractRand? Domyślam się, że
    ma generować bit po bicie, czyli pojedyncze wywołanie powinno generować jeden
    psudolosowy bit.

    > > Nie wiem właściwie nic o C++, znam podstawy programowania w Pythonie, więc może
    coś robię źle? Niemniej, kod mojego generatora w C++ jakoś sobie prędzej, czy później
    napiszę, choć liczyłem, że będzie można użyć pliku txt z wygenerowanymi już liczbami.
    Najważniejsze jest dla mnie jak to uruchomić.
    > Słyszałem że temat generowania liczb pseudo-losowych jest bardzo trudny :/

    Moje generatory zdają wszystkie testy Dieharder, szukam więc czegoś bardziej
    wymagającego. Także mam już generatory, które działają, zresztą generatorów, które
    istnieją i można modyfikować na wiele sposobów również jest pod dostatkiem. Co do
    zasady jest to trudne i trzeba wiedzieć co się robi, ale z tym problemem już się
    uporałem. Większe wyzwanie stanowi dla mnie C++ (ten język chyba już na poziomie
    projektowania stawiał sobie za bycie nieprzejrzystym i inkluzywnym) i dokumentacja
    PractRand.


  • 5. Data: 2021-08-20 17:09:26
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "M.M." <m...@g...com>

    On Friday, August 20, 2021 at 4:53:25 PM UTC+2, o...@g...com wrote:
    > piątek, 20 sierpnia 2021 o 15:04:14 UTC+2 M.M. napisał(a):
    > > On Thursday, August 19, 2021 at 6:15:26 PM UTC+2, o...@g...com wrote:
    > > > Czy ktoś z Was robił testy generatorów liczb pseudolosowych za pomocą
    PractRand?
    > > Jeśli chce Ci się czytać C++ to możesz zobaczyć jak ja to zrobiłem:
    > >
    > > https://github.com/mmarszik/MRndCPP
    > >
    > > https://github.com/mmarszik/MRndCPP/blob/master/test
    s/test.sh
    > > { time ./$prog | ./../../PractRand/RNG_test stdin -singlethreaded -tlmax 360000s
    > $test; } 2> $time
    > >
    > > https://github.com/mmarszik/MRndCPP/blob/master/test
    01.cpp
    > > fwrite( buf, 1, sizeof(buf), stdout );
    > Nic z tego nie rozumiem, ani nawet nie wiem od czego zacząć. Co robi Twój kod? Bo
    podstawowe pytanie jakie mam to co ma zwracać program do PractRand? Domyślam się, że
    ma generować bit po bicie, czyli pojedyncze wywołanie powinno generować jeden
    psudolosowy bit.
    > > > Nie wiem właściwie nic o C++, znam podstawy programowania w Pythonie, więc może
    coś robię źle? Niemniej, kod mojego generatora w C++ jakoś sobie prędzej, czy później
    napiszę, choć liczyłem, że będzie można użyć pliku txt z wygenerowanymi już liczbami.
    Najważniejsze jest dla mnie jak to uruchomić.
    > > Słyszałem że temat generowania liczb pseudo-losowych jest bardzo trudny :/
    > Moje generatory zdają wszystkie testy Dieharder, szukam więc czegoś bardziej
    wymagającego. Także mam już generatory, które działają, zresztą generatorów, które
    istnieją i można modyfikować na wiele sposobów również jest pod dostatkiem. Co do
    zasady jest to trudne i trzeba wiedzieć co się robi, ale z tym problemem już się
    uporałem. Większe wyzwanie stanowi dla mnie C++ (ten język chyba już na poziomie
    projektowania stawiał sobie za bycie nieprzejrzystym i inkluzywnym) i dokumentacja
    PractRand.

    Odnośnie C++ właśnie wkleiłem kluczową linię kodu:
    fwrite( buf, 1, sizeof(buf), stdout );
    Lina ta wywala binarnie bufor na standardowe wyjście, wcześniej trzeba go
    zapełnić binarnymi danymi. W pliku do którego
    dałem link jest pełny przykład.

    Odnośnie Practrand ta linia jest kluczowa:
    { time ./$prog | ./../../PractRand/RNG_test stdin -singlethreaded -tlmax 360000s >
    $test; } 2> $time
    Przekierowuje ona standardowe wyjście programu do programu PractRand, reszta to
    opcje, pomiar czasu, przekierowanie wyników.

    W skrócie, jeśli PractRand jest w tym samym katalogu co program, uruchamia się to
    tak:
    ./Program | ./PractRand stdin [tu wpisz opcje PractRand]

    Jeśli dane są w pliku binarnym to tak:
    cat dane_binarne.bin | ./PractRand stdin [tu wpisz opcje PractRand]

    Jeśli w są w tekstowym, to np. tak (nie wiem czy można prościej, by musiała być
    odpowiednia
    opcja PractRand i odpowiedni format danych tekstowych - może jest):
    cat dane_tekstowe.txt | ./zamien_na_binarne | ./PractRand stdin [tu wpisz opcje
    PractRand]
    Ale program który poprawnie zamieni Twoje dane tekstowe na dane binarne musisz
    napisać sobie sam.

    Pozdrawiam


  • 6. Data: 2021-08-20 18:14:52
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com>

    > Odnośnie C++ właśnie wkleiłem kluczową linię kodu:
    > fwrite( buf, 1, sizeof(buf), stdout );
    > Lina ta wywala binarnie bufor na standardowe wyjście, wcześniej trzeba go zapełnić
    binarnymi danymi. W pliku do którego
    > dałem link jest pełny przykład.
    >
    > Odnośnie Practrand ta linia jest kluczowa:
    > { time ./$prog | ./../../PractRand/RNG_test stdin -singlethreaded -tlmax 360000s >
    $test; } 2> $time
    > Przekierowuje ona standardowe wyjście programu do programu PractRand, reszta to
    opcje, pomiar czasu, przekierowanie wyników.
    >
    > W skrócie, jeśli PractRand jest w tym samym katalogu co program, uruchamia się to
    tak:
    > ./Program | ./PractRand stdin [tu wpisz opcje PractRand]

    Wydaje mi się, że prędzej, niż ogarnę C++ zrobię odpowiedni plik. Przepisanie kodu z
    Pythona do C++ musiałbym raczej komuś zlecić. Także chyba z pisaniem programu w C++
    dam sobie spokój (tym bardziej, że mój program wykonuje operacje na liczbach
    128-bitowych, a C++ takich nie obsługuje, zaś zainstalowanie odpowiedniej biblioteki
    do obsługi tak dużych liczb, to już jest dla mnie zadanie na długie tygodnie, może
    miesiące, bez gwarancji sukcesu - gdy próbowałem zrobić to lata temu nie udało się).
    Pytanie, czy będę w stanie wygenerować odpowiedni plik w odpowiednim czasie (bo
    pomimo, że generatory, które testuję są jednymi z najszybszych na świecie, co do
    zasady są podobne do PCG generators, to Python nie dość, że bywa 50-100 razy
    wolniejszy niż C++, to jeszcze do tego sam zapis do pliku trwa długo i jak szybki nie
    byłby generator - nie da się tego procesu przyspieszyć). Ile PractRand potrzebuje
    danych?

    Dieharder przykładowo potrzebował 32-bitowe liczby wypisane jedna pod drugą w ilości
    blisko 50 GB (których zapisanie do pliku i wygenerowanie trwało kilka godzin), żeby
    generator nie oblewał testów (gdy danych było za mało plik był zawijany i do testów
    był brane w kółko te same liczby, do powodowało oblewanie testów). A i tak zawijał
    niektóre próbki, tzw. " rewounds".

    > Jeśli dane są w pliku binarnym to tak:
    > cat dane_binarne.bin | ./PractRand stdin [tu wpisz opcje PractRand]

    Jak utworzyć plik .bin? Mam 50GB danych binarnych, to jest zera i jedynki w formie
    .txt. Ale pliki .bin to chyba coś innego?

    > Jeśli w są w tekstowym, to np. tak (nie wiem czy można prościej, by musiała być
    odpowiednia
    > opcja PractRand i odpowiedni format danych tekstowych - może jest):
    > cat dane_tekstowe.txt | ./zamien_na_binarne | ./PractRand stdin [tu wpisz opcje
    PractRand]
    > Ale program który poprawnie zamieni Twoje dane tekstowe na dane binarne musisz
    napisać sobie sam.

    Tutaj piszą:

    https://www.researchgate.net/publication/340214294_A
    _Practical_Approach_to_Testing_Random_Number_Generat
    ors_in_Computer_Algebra_Systems

    że:

    "For testing data from a file, the fol-lowing command can be used:

    cat file.data | RNG_test stdin64

    The data in the file must be binary; text files are not supported."

    Że pliki tekstowe nie są akceptowane, więc, czy na pewno można to tak zrobić i to
    zadziała poprawnie? Same testy mi się wykonały, ale mam dużo FAILI:

    rng=RNG_stdin, seed=0x8117bdda
    length= 256 megabytes (2^28 bytes), time= 2.9 seconds
    Test Name Raw Processed Evaluation
    BCFN(2+0,13-2,T) R=+27538479 p = 0 FAIL !!!!!!!!
    BCFN(2+1,13-2,T) R=+13016562 p = 0 FAIL !!!!!!!!
    BCFN(2+2,13-3,T) R=+8037376 p = 0 FAIL !!!!!!!!
    BCFN(2+3,13-3,T) R=+3903883 p = 0 FAIL !!!!!!!!
    BCFN(2+4,13-3,T) R=+1911999 p = 0 FAIL !!!!!!!!
    BCFN(2+5,13-4,T) R=+1199616 p = 0 FAIL !!!!!!!!
    BCFN(2+6,13-5,T) R=+746903 p = 0 FAIL !!!!!!!!
    BCFN(2+7,13-5,T) R=+370686 p = 0 FAIL !!!!!!!!
    BCFN(2+8,13-6,T) R=+228593 p = 0 FAIL !!!!!!!!
    BCFN(2+9,13-6,T) R=+113862 p = 0 FAIL !!!!!!!!
    BCFN(2+10,13-7,T) R=+69095 p = 0 FAIL !!!!!!!!
    BCFN(2+11,13-8,T) R=+40957 p = 0 FAIL !!!!!!!!
    BCFN(2+12,13-8,T) R=+20441 p = 1e-5188 FAIL !!!!!!!!
    BCFN(2+13,13-9,T) R=+11734 p = 8e-2638 FAIL !!!!!!!!
    BCFN(2+14,13-9,T) R= +5853 p = 3e-1316 FAIL !!!!!!!!
    DC6-9x1Bytes-1 R=+13379089 p = 0 FAIL !!!!!!!!
    Gap-16:A R=+5676902 p = 0 FAIL !!!!!!!!
    Gap-16:B R=+25156958 p = 0 FAIL !!!!!!!!
    FPF-14+6/16:(0,14-0) R=+9523586 p = 0 FAIL !!!!!!!!
    FPF-14+6/16:(4,14-1) R=+11217844 p = 0 FAIL !!!!!!!!
    FPF-14+6/16:all R=+16607352 p = 0 FAIL !!!!!!!!
    FPF-14+6/16:cross R=+56967921 p = 0 FAIL !!!!!!!!
    BRank(12):128(4) R= +4568 p~= 2e-2430 FAIL !!!!!!!!
    BRank(12):256(4) R= +9390 p~= 6e-4995 FAIL !!!!!!!!
    BRank(12):384(1) R= +7106 p~= 3e-2140 FAIL !!!!!!!!
    BRank(12):512(2) R=+13459 p~= 1e-4052 FAIL !!!!!!!!
    BRank(12):768(1) R=+14339 p~= 1e-4317 FAIL !!!!!!!!
    BRank(12):1K(2) R=+27098 p~= 2e-8158 FAIL !!!!!!!!
    BRank(12):1536(1) R=+28805 p~= 2e-8672 FAIL !!!!!!!!
    BRank(12):2K(1) R=+38450 p~= 0 FAIL !!!!!!!!
    [Low1/8]BCFN(2+0,13-4,T) R= +4290 p = 2e-1874 FAIL !!!!!!!!
    [Low1/8]BCFN(2+1,13-4,T) R= +4280 p = 4e-1870 FAIL !!!!!!!!
    [Low1/8]BCFN(2+2,13-5,T) R= +5376 p = 1e-2104 FAIL !!!!!!!!
    [Low1/8]BCFN(2+3,13-5,T) R= +5322 p = 1e-2083 FAIL !!!!!!!!
    [Low1/8]BCFN(2+4,13-5,T) R= +5216 p = 4e-2042 FAIL !!!!!!!!
    [Low1/8]BCFN(2+5,13-6,T) R= +6417 p = 4e-2198 FAIL !!!!!!!!
    [Low1/8]BCFN(2+6,13-6,T) R= +6363 p = 1e-2179 FAIL !!!!!!!!
    [Low1/8]BCFN(2+7,13-7,T) R= +7512 p = 4e-2260 FAIL !!!!!!!!
    [Low1/8]BCFN(2+8,13-8,T) R= +8494 p = 1e-2156 FAIL !!!!!!!!
    [Low1/8]BCFN(2+9,13-8,T) R= +7611 p = 1e-1932 FAIL !!!!!!!!
    [Low1/8]BCFN(2+10,13-9,T) R= +7064 p = 2e-1588 FAIL !!!!!!!!
    [Low1/8]BCFN(2+11,13-9,T) R= +4936 p = 3e-1110 FAIL !!!!!!!!
    [Low1/8]DC6-9x1Bytes-1 R=+391.8 p = 4.9e-263 FAIL !!!!!!
    [Low1/8]FPF-14+6/16:(0,14-0) R= +56.6 p = 1.0e-51 FAIL !!!!
    [Low1/8]FPF-14+6/16:(1,14-1) R= +39.1 p = 1.9e-34 FAIL !!!
    [Low1/8]FPF-14+6/16:(2,14-2) R= +24.1 p = 7.6e-21 FAIL !
    [Low1/8]FPF-14+6/16:(3,14-2) R= +11.6 p = 6.6e-10 very suspicious
    [Low1/8]FPF-14+6/16:all R= +80.5 p = 4.7e-75 FAIL !!!!
    [Low1/8]FPF-14+6/16:all2 R= +1234 p = 8.7e-437 FAIL !!!!!!!
    [Low1/8]FPF-14+6/16:cross R=+347.9 p = 4.3e-274 FAIL !!!!!!
    [Low4/32]BCFN(2+0,13-4,T) R=+5636982 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+1,13-4,T) R=+2664412 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+2,13-5,T) R=+1609820 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+3,13-5,T) R=+781907 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+4,13-5,T) R=+382945 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+5,13-6,T) R=+233930 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+6,13-6,T) R=+115740 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+7,13-7,T) R=+69900 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+8,13-8,T) R=+41294 p = 0 FAIL !!!!!!!!
    [Low4/32]BCFN(2+9,13-8,T) R=+20560 p = 6e-5219 FAIL !!!!!!!!
    [Low4/32]BCFN(2+10,13-9,T) R=+11783 p = 1e-2648 FAIL !!!!!!!!
    [Low4/32]BCFN(2+11,13-9,T) R= +5870 p = 4e-1320 FAIL !!!!!!!!
    [Low4/32]DC6-9x1Bytes-1 R=+2399367 p = 0 FAIL !!!!!!!!
    [Low4/32]Gap-16:A R=+756848 p = 0 FAIL !!!!!!!!
    [Low4/32]Gap-16:B R=+4597397 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:(0,14-0) R=+1007012 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:(4,14-3) R=+1156867 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:(8,14-6) R=+1083851 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:(12,14-9) R=+1027154 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:all R=+1913749 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:all2 R=+1775316442517 p = 0 FAIL !!!!!!!!
    [Low4/32]FPF-14+6/16:cross R=+10872050 p = 0 FAIL !!!!!!!!
    [Low4/32]BRank(12):128(4) R= +3922 p~= 8e-2087 FAIL !!!!!!!!
    [Low4/32]BRank(12):256(2) R= +5696 p~= 1e-1715 FAIL !!!!!!!!
    [Low4/32]BRank(12):384(1) R= +6094 p~= 1e-1835 FAIL !!!!!!!!
    [Low4/32]BRank(12):512(2) R=+11541 p~= 2e-3475 FAIL !!!!!!!!
    [Low4/32]BRank(12):768(1) R=+12294 p~= 6e-3702 FAIL !!!!!!!!
    [Low4/32]BRank(12):1K(1) R=+16427 p~= 3e-4946 FAIL !!!!!!!!
    [Low1/32]BCFN(2+0,13-5,T) R= +1333 p = 5.0e-522 FAIL !!!!!!!
    [Low1/32]BCFN(2+1,13-5,T) R= +1309 p = 1.3e-512 FAIL !!!!!!!
    [Low1/32]BCFN(2+2,13-6,T) R= +1678 p = 4.5e-575 FAIL !!!!!!!
    [Low1/32]BCFN(2+3,13-6,T) R= +1603 p = 1.6e-549 FAIL !!!!!!!
    [Low1/32]BCFN(2+4,13-6,T) R= +1599 p = 6.2e-548 FAIL !!!!!!!
    [Low1/32]BCFN(2+5,13-7,T) R= +1945 p = 1.3e-585 FAIL !!!!!!!
    [Low1/32]BCFN(2+6,13-8,T) R= +2317 p = 6.9e-589 FAIL !!!!!!!
    [Low1/32]BCFN(2+7,13-8,T) R= +2195 p = 5.7e-558 FAIL !!!!!!!
    [Low1/32]BCFN(2+8,13-9,T) R= +2337 p = 2.7e-526 FAIL !!!!!!!
    [Low1/32]BCFN(2+9,13-9,T) R= +2193 p = 6.4e-494 FAIL !!!!!!!
    [Low1/32]DC6-9x1Bytes-1 R=+126.7 p = 8.2e-67 FAIL !!!!
    [Low1/32]FPF-14+6/16:(0,14-2) R= +22.0 p = 4.9e-19 FAIL !
    [Low1/32]FPF-14+6/16:(1,14-2) R= +12.1 p = 2.1e-10 VERY SUSPICIOUS
    [Low1/32]FPF-14+6/16:(2,14-3) R= +9.0 p = 1.1e-7 suspicious
    [Low1/32]FPF-14+6/16:(3,14-4) R= +6.8 p = 1.8e-5 unusual
    [Low1/32]FPF-14+6/16:all R= +29.9 p = 1.0e-26 FAIL !!
    [Low1/32]FPF-14+6/16:all2 R=+151.1 p = 3.4e-53 FAIL !!!!
    [Low1/32]FPF-14+6/16:cross R= +95.9 p = 4.0e-78 FAIL !!!!
    ...and 36 test result(s) without anomalies

    Co więcej w ten sposób PractRand przyjął też plik z wypisanymi liczbami 32-bitowymi
    jedna pod drugą w formacie dziesiętnym i też pokazał jakieś FAILE. Pytanie co program
    testuje, skoro plik był w nieodpowiednim formacie. Mam podejrzenia, że nie robi
    testów w sposób poprawny.


  • 7. Data: 2021-08-20 18:57:17
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com>

    Zapisałem plik za pomocą Pythona w formacie .data. Wygenerowałem strumień zer i
    jedynek do pliku. Plik ma 45 GB. I wciąż mam tę samą liczbę FAILI. Pytanie, czy
    danych nie jest za mało? Spróbuję wygenerować ich ponad 200 GB i zobaczę, czy to coś
    zmieni.


  • 8. Data: 2021-08-20 19:26:39
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "M.M." <m...@g...com>

    On Friday, August 20, 2021 at 6:14:53 PM UTC+2, o...@g...com wrote:
    > > Odnośnie C++ właśnie wkleiłem kluczową linię kodu:
    > > fwrite( buf, 1, sizeof(buf), stdout );
    > > Lina ta wywala binarnie bufor na standardowe wyjście, wcześniej trzeba go
    zapełnić binarnymi danymi. W pliku do którego
    > > dałem link jest pełny przykład.
    > >
    > > Odnośnie Practrand ta linia jest kluczowa:
    > > { time ./$prog | ./../../PractRand/RNG_test stdin -singlethreaded -tlmax 360000s
    > $test; } 2> $time
    > > Przekierowuje ona standardowe wyjście programu do programu PractRand, reszta to
    opcje, pomiar czasu, przekierowanie wyników.
    > >
    > > W skrócie, jeśli PractRand jest w tym samym katalogu co program, uruchamia się to
    tak:
    > > ./Program | ./PractRand stdin [tu wpisz opcje PractRand]


    > Wydaje mi się, że prędzej, niż ogarnę C++ zrobię odpowiedni plik.
    Można ,ale dobre testowanie wymaga dużo danych. Osobiście testowałem generatory
    minimum
    godzinę, maksimum (o ile pamiętam) dwa tygodnie na jednym wątku. Przez ten czas,
    szczególnie
    przez dwa tygodnie, generator jest w stanie wygenerować sporo liczb i program testowy
    sporo skonsumować.
    Liczby z dwóch tygodni nie wiem czy zmieszczą się na dysku.

    > Przepisanie kodu z Pythona do C++ musiałbym raczej komuś zlecić.
    Co tam konkretnie jest do napisania? Może coś podobnego jest to gotowe pod linkami
    które podałem?

    > Także chyba z pisaniem programu w C++ dam sobie spokój (tym bardziej, że mój
    program wykonuje operacje na liczbach
    > 128-bitowych, a C++ takich nie obsługuje, zaś zainstalowanie odpowiedniej
    biblioteki do obsługi tak dużych liczb, to już jest
    > dla mnie zadanie na długie tygodnie, może miesiące, bez gwarancji sukcesu - gdy
    próbowałem zrobić to lata temu nie udało się).

    Niektóre kompilatory obsługują typ 128bitowy tak samo jak typ 64bitowy. Po
    zainstalowaniu dobrej biblioteki w C++ używa się
    typu N-bitowego tak samo jak np. 64bitowego.

    > Pytanie, czy będę w stanie wygenerować odpowiedni plik w odpowiednim czasie (bo
    pomimo, że generatory, które testuję są
    > jednymi z najszybszych na świecie, co do zasady są podobne do PCG generators, to
    Python nie dość, że bywa 50-100 razy
    > wolniejszy niż C++, to jeszcze do tego sam zapis do pliku trwa długo i jak szybki
    nie byłby generator - nie da się tego procesu
    > przyspieszyć). Ile PractRand potrzebuje danych?

    Zapis całego dużego dysku to np. jedna doba, ale zależy jaki szybki/duży dysk, może
    być godzina, może być tydzień. Trudno
    bez testów powiedzieć czy wolniejszy będzie zapis czy powolne generowanie najszybszym
    generatorem na świecie. PractRand
    tym lepiej testuje im więcej danych otrzyma. Jeśli jakiś generator, w jakimś
    programie intensywnie pracuje przez długie tygodnie na
    wielu wątkach, to testowanie generatora przez kilka dni może mieć sens. Można też
    zapisać zarodki generatorów użyte w
    programie, aby potem wykonać testy dokładnie tych samych ciągów losowych liczby jakie
    były użyte.

    > Dieharder przykładowo potrzebował 32-bitowe liczby wypisane jedna pod drugą w
    ilości blisko 50 GB (których
    > zapisanie do pliku i wygenerowanie trwało kilka godzin),

    To możesz zapisać teraz 50GB na dysk z dev/zero przy użyciu dd i mieć przybliżony
    narzut na obliczenia generatora.


    > żeby generator nie oblewał testów (gdy danych było za mało plik był zawijany i do
    testów był brane w kółko te same liczby, do
    > powodowało oblewanie testów). A i tak zawijał niektóre próbki, tzw. " rewounds".

    Temat jest trudniejszy, może generator na małych zapętlonych danych przechodzić test,
    na na długich oblewać.
    Chyba najlepiej odtworzyć te same dane losowe co były użyte w programie, aby
    mieć pewność że program
    pracował na losowych danych które przechodzą testy statystyczne.

    > > Jeśli dane są w pliku binarnym to tak:
    > > cat dane_binarne.bin | ./PractRand stdin [tu wpisz opcje PractRand]
    > Jak utworzyć plik .bin? Mam 50GB danych binarnych, to jest zera i jedynki w formie
    .txt. Ale pliki .bin to chyba coś innego?
    > > Jeśli w są w tekstowym, to np. tak (nie wiem czy można prościej, by musiała być
    odpowiednia
    > > opcja PractRand i odpowiedni format danych tekstowych - może jest):
    > > cat dane_tekstowe.txt | ./zamien_na_binarne | ./PractRand stdin [tu wpisz opcje
    PractRand]
    > > Ale program który poprawnie zamieni Twoje dane tekstowe na dane binarne musisz
    napisać sobie sam.
    > Tutaj piszą:
    >
    > https://www.researchgate.net/publication/340214294_A
    _Practical_Approach_to_Testing_Random_Number_Generat
    ors_in_Computer_Algebra_Systems
    >
    > że:
    > "For testing data from a file, the fol-lowing command can be used:
    >
    > cat file.data | RNG_test stdin64
    >
    > The data in the file must be binary; text files are not supported."
    > Że pliki tekstowe nie są akceptowane, więc, czy na pewno można to tak zrobić i to
    zadziała poprawnie? Same testy mi się wykonały, ale mam dużo FAILI:

    Zadziała, ale jeśli tester nie wspomaga plików tekstowych, to trzeba samemu
    napisać program który zamieni dane tekstowe na binarne.
    Potem dam przykładowy kod w C++, może dziś wieczorem, to kilka linijek.

    > rng=RNG_stdin, seed=0x8117bdda
    > length= 256 megabytes (2^28 bytes), time= 2.9 seconds
    > Test Name Raw Processed Evaluation
    > BCFN(2+0,13-2,T) R=+27538479 p = 0 FAIL !!!!!!!!
    > BCFN(2+1,13-2,T) R=+13016562 p = 0 FAIL !!!!!!!!
    > BCFN(2+2,13-3,T) R=+8037376 p = 0 FAIL !!!!!!!!
    > BCFN(2+3,13-3,T) R=+3903883 p = 0 FAIL !!!!!!!!
    > BCFN(2+4,13-3,T) R=+1911999 p = 0 FAIL !!!!!!!!
    > BCFN(2+5,13-4,T) R=+1199616 p = 0 FAIL !!!!!!!!
    > BCFN(2+6,13-5,T) R=+746903 p = 0 FAIL !!!!!!!!
    > BCFN(2+7,13-5,T) R=+370686 p = 0 FAIL !!!!!!!!
    > BCFN(2+8,13-6,T) R=+228593 p = 0 FAIL !!!!!!!!
    > BCFN(2+9,13-6,T) R=+113862 p = 0 FAIL !!!!!!!!
    > BCFN(2+10,13-7,T) R=+69095 p = 0 FAIL !!!!!!!!
    > BCFN(2+11,13-8,T) R=+40957 p = 0 FAIL !!!!!!!!
    > BCFN(2+12,13-8,T) R=+20441 p = 1e-5188 FAIL !!!!!!!!
    > BCFN(2+13,13-9,T) R=+11734 p = 8e-2638 FAIL !!!!!!!!
    > BCFN(2+14,13-9,T) R= +5853 p = 3e-1316 FAIL !!!!!!!!
    > DC6-9x1Bytes-1 R=+13379089 p = 0 FAIL !!!!!!!!
    > Gap-16:A R=+5676902 p = 0 FAIL !!!!!!!!
    > Gap-16:B R=+25156958 p = 0 FAIL !!!!!!!!
    > FPF-14+6/16:(0,14-0) R=+9523586 p = 0 FAIL !!!!!!!!
    > FPF-14+6/16:(4,14-1) R=+11217844 p = 0 FAIL !!!!!!!!
    > FPF-14+6/16:all R=+16607352 p = 0 FAIL !!!!!!!!
    > FPF-14+6/16:cross R=+56967921 p = 0 FAIL !!!!!!!!
    > BRank(12):128(4) R= +4568 p~= 2e-2430 FAIL !!!!!!!!
    > BRank(12):256(4) R= +9390 p~= 6e-4995 FAIL !!!!!!!!
    > BRank(12):384(1) R= +7106 p~= 3e-2140 FAIL !!!!!!!!
    > BRank(12):512(2) R=+13459 p~= 1e-4052 FAIL !!!!!!!!
    > BRank(12):768(1) R=+14339 p~= 1e-4317 FAIL !!!!!!!!
    > BRank(12):1K(2) R=+27098 p~= 2e-8158 FAIL !!!!!!!!
    > BRank(12):1536(1) R=+28805 p~= 2e-8672 FAIL !!!!!!!!
    > BRank(12):2K(1) R=+38450 p~= 0 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+0,13-4,T) R= +4290 p = 2e-1874 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+1,13-4,T) R= +4280 p = 4e-1870 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+2,13-5,T) R= +5376 p = 1e-2104 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+3,13-5,T) R= +5322 p = 1e-2083 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+4,13-5,T) R= +5216 p = 4e-2042 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+5,13-6,T) R= +6417 p = 4e-2198 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+6,13-6,T) R= +6363 p = 1e-2179 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+7,13-7,T) R= +7512 p = 4e-2260 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+8,13-8,T) R= +8494 p = 1e-2156 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+9,13-8,T) R= +7611 p = 1e-1932 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+10,13-9,T) R= +7064 p = 2e-1588 FAIL !!!!!!!!
    > [Low1/8]BCFN(2+11,13-9,T) R= +4936 p = 3e-1110 FAIL !!!!!!!!
    > [Low1/8]DC6-9x1Bytes-1 R=+391.8 p = 4.9e-263 FAIL !!!!!!
    > [Low1/8]FPF-14+6/16:(0,14-0) R= +56.6 p = 1.0e-51 FAIL !!!!
    > [Low1/8]FPF-14+6/16:(1,14-1) R= +39.1 p = 1.9e-34 FAIL !!!
    > [Low1/8]FPF-14+6/16:(2,14-2) R= +24.1 p = 7.6e-21 FAIL !
    > [Low1/8]FPF-14+6/16:(3,14-2) R= +11.6 p = 6.6e-10 very suspicious
    > [Low1/8]FPF-14+6/16:all R= +80.5 p = 4.7e-75 FAIL !!!!
    > [Low1/8]FPF-14+6/16:all2 R= +1234 p = 8.7e-437 FAIL !!!!!!!
    > [Low1/8]FPF-14+6/16:cross R=+347.9 p = 4.3e-274 FAIL !!!!!!
    > [Low4/32]BCFN(2+0,13-4,T) R=+5636982 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+1,13-4,T) R=+2664412 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+2,13-5,T) R=+1609820 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+3,13-5,T) R=+781907 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+4,13-5,T) R=+382945 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+5,13-6,T) R=+233930 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+6,13-6,T) R=+115740 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+7,13-7,T) R=+69900 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+8,13-8,T) R=+41294 p = 0 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+9,13-8,T) R=+20560 p = 6e-5219 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+10,13-9,T) R=+11783 p = 1e-2648 FAIL !!!!!!!!
    > [Low4/32]BCFN(2+11,13-9,T) R= +5870 p = 4e-1320 FAIL !!!!!!!!
    > [Low4/32]DC6-9x1Bytes-1 R=+2399367 p = 0 FAIL !!!!!!!!
    > [Low4/32]Gap-16:A R=+756848 p = 0 FAIL !!!!!!!!
    > [Low4/32]Gap-16:B R=+4597397 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:(0,14-0) R=+1007012 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:(4,14-3) R=+1156867 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:(8,14-6) R=+1083851 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:(12,14-9) R=+1027154 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:all R=+1913749 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:all2 R=+1775316442517 p = 0 FAIL !!!!!!!!
    > [Low4/32]FPF-14+6/16:cross R=+10872050 p = 0 FAIL !!!!!!!!
    > [Low4/32]BRank(12):128(4) R= +3922 p~= 8e-2087 FAIL !!!!!!!!
    > [Low4/32]BRank(12):256(2) R= +5696 p~= 1e-1715 FAIL !!!!!!!!
    > [Low4/32]BRank(12):384(1) R= +6094 p~= 1e-1835 FAIL !!!!!!!!
    > [Low4/32]BRank(12):512(2) R=+11541 p~= 2e-3475 FAIL !!!!!!!!
    > [Low4/32]BRank(12):768(1) R=+12294 p~= 6e-3702 FAIL !!!!!!!!
    > [Low4/32]BRank(12):1K(1) R=+16427 p~= 3e-4946 FAIL !!!!!!!!
    > [Low1/32]BCFN(2+0,13-5,T) R= +1333 p = 5.0e-522 FAIL !!!!!!!
    > [Low1/32]BCFN(2+1,13-5,T) R= +1309 p = 1.3e-512 FAIL !!!!!!!
    > [Low1/32]BCFN(2+2,13-6,T) R= +1678 p = 4.5e-575 FAIL !!!!!!!
    > [Low1/32]BCFN(2+3,13-6,T) R= +1603 p = 1.6e-549 FAIL !!!!!!!
    > [Low1/32]BCFN(2+4,13-6,T) R= +1599 p = 6.2e-548 FAIL !!!!!!!
    > [Low1/32]BCFN(2+5,13-7,T) R= +1945 p = 1.3e-585 FAIL !!!!!!!
    > [Low1/32]BCFN(2+6,13-8,T) R= +2317 p = 6.9e-589 FAIL !!!!!!!
    > [Low1/32]BCFN(2+7,13-8,T) R= +2195 p = 5.7e-558 FAIL !!!!!!!
    > [Low1/32]BCFN(2+8,13-9,T) R= +2337 p = 2.7e-526 FAIL !!!!!!!
    > [Low1/32]BCFN(2+9,13-9,T) R= +2193 p = 6.4e-494 FAIL !!!!!!!
    > [Low1/32]DC6-9x1Bytes-1 R=+126.7 p = 8.2e-67 FAIL !!!!
    > [Low1/32]FPF-14+6/16:(0,14-2) R= +22.0 p = 4.9e-19 FAIL !
    > [Low1/32]FPF-14+6/16:(1,14-2) R= +12.1 p = 2.1e-10 VERY SUSPICIOUS
    > [Low1/32]FPF-14+6/16:(2,14-3) R= +9.0 p = 1.1e-7 suspicious
    > [Low1/32]FPF-14+6/16:(3,14-4) R= +6.8 p = 1.8e-5 unusual
    > [Low1/32]FPF-14+6/16:all R= +29.9 p = 1.0e-26 FAIL !!
    > [Low1/32]FPF-14+6/16:all2 R=+151.1 p = 3.4e-53 FAIL !!!!
    > [Low1/32]FPF-14+6/16:cross R= +95.9 p = 4.0e-78 FAIL !!!!
    > ...and 36 test result(s) without anomalies
    >
    > Co więcej w ten sposób PractRand przyjął też plik z wypisanymi liczbami 32-bitowymi
    jedna pod drugą w formacie dziesiętnym i też pokazał jakieś FAILE. Pytanie co program
    testuje, skoro plik był w nieodpowiednim formacie. Mam podejrzenia, że nie robi
    testów w sposób poprawny.

    Teraz nie mogę, potem dam kod program który przekonwertuje plik tekstowy do
    binarnego. Proszę, pokaż ( i jeśli trzeba to opisz )
    jak wygląda oryginalny plik tekstowy.

    Pozdrawiam


  • 9. Data: 2021-08-20 20:45:22
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com>

    > Jeśli dane są w pliku binarnym to tak:
    > cat dane_binarne.bin | ./PractRand stdin [tu wpisz opcje PractRand]

    Jakie są te opcje PractRand? Ja uruchamiam to w ten sposób:

    cat plik.data | ./RNG_test stdin

    Niestety zwiększenie rozmiaru pliku do 230 GB nie pomogło, a więcej nie zmieści mi
    się na dysku. Wciąż dziwią mnie te oblane testy, podczas, gdy wszystkie testy
    Dieharder ten generator zdawał. Albo PractRand jest o tyle bardziej wymagający, albo
    nadal coś jest nie tak.

    > > Wydaje mi się, że prędzej, niż ogarnę C++ zrobię odpowiedni plik.
    > Można ,ale dobre testowanie wymaga dużo danych. Osobiście testowałem generatory
    minimum
    > godzinę, maksimum (o ile pamiętam) dwa tygodnie na jednym wątku. Przez ten czas,
    szczególnie
    > przez dwa tygodnie, generator jest w stanie wygenerować sporo liczb i program
    testowy sporo skonsumować.
    > Liczby z dwóch tygodni nie wiem czy zmieszczą się na dysku.

    Na pewno się nie zmieszczą. Już osiągnąłem limit. Z jakichś powodów zresztą bardzo
    szybko udało mi się to wygenerować i zapisać do pliku (godzina z hakiem), tak jakby
    liczby w formacie binarnym zapisywały się szybciej. 50 GB liczb 32-bitowych w
    formacie dziesiętnym zapisywało mi się kilka godzin.

    Ile GB w takim przetestowałeś, skoro robiłeś testy nawet 2 tygodnie?

    > > Przepisanie kodu z Pythona do C++ musiałbym raczej komuś zlecić.
    > Co tam konkretnie jest do napisania? Może coś podobnego jest to gotowe pod linkami
    które podałem?

    Przykładowy program:

    https://pastebin.com/K164URZQ

    Liczby 128-bitowe są tam ładowanie po prostu do listy allstream, ale oczywiście można
    to zaaranżować inaczej.

    > > Pytanie, czy będę w stanie wygenerować odpowiedni plik w odpowiednim czasie (bo
    pomimo, że generatory, które testuję są
    > > jednymi z najszybszych na świecie, co do zasady są podobne do PCG generators, to
    Python nie dość, że bywa 50-100 razy
    > > wolniejszy niż C++, to jeszcze do tego sam zapis do pliku trwa długo i jak szybki
    nie byłby generator - nie da się tego procesu
    > > przyspieszyć). Ile PractRand potrzebuje danych?
    > Zapis całego dużego dysku to np. jedna doba, ale zależy jaki szybki/duży dysk, może
    być godzina, może być tydzień. Trudno
    > bez testów powiedzieć czy wolniejszy będzie zapis czy powolne generowanie
    najszybszym generatorem na świecie. PractRand
    > tym lepiej testuje im więcej danych otrzyma.

    Ja zapisałem cały dysk w godzinę z hakiem.

    > > żeby generator nie oblewał testów (gdy danych było za mało plik był zawijany i do
    testów był brane w kółko te same liczby, do
    > > powodowało oblewanie testów). A i tak zawijał niektóre próbki, tzw. " rewounds".
    > Temat jest trudniejszy, może generator na małych zapętlonych danych przechodzić
    test, na na długich oblewać.

    W każdym razie wszystkie testy przy odpowiedniej ilości danych zdawał. Wystarczyło 50
    GB danych, zapisanych w formacie dziesiętnym jako liczby 32-bitowe.

    > Chyba najlepiej odtworzyć te same dane losowe co były użyte w programie, aby mieć
    pewność że program
    > pracował na losowych danych które przechodzą testy statystyczne.

    Używam tych samych danych. A mimo to w PractRand pełno testów jest niezdanych.

    > Zadziała, ale jeśli tester nie wspomaga plików tekstowych, to trzeba samemu napisać
    program który zamieni dane tekstowe na binarne.
    > Potem dam przykładowy kod w C++, może dziś wieczorem, to kilka linijek.

    Wygenerowałem plik .data. Zapisałem tam liczby w formacie binarnym. Wszystko wskazuje
    na to, że to powinno działać. Może po prostu generator nie zdaje testów. Z drugiej
    jednak strony, jeśli Ty piszesz, że testowałeś generator nawet kilka dni, to jest nic
    w porównaniu z danymi, które ja dostarczyłem do testów, wygenerowanymi zaledwie w
    godzinę. Może po prostu jest ich za mało. Ale, czy 230 GB to za mało?

    > Teraz nie mogę, potem dam kod program który przekonwertuje plik tekstowy do
    binarnego. Proszę, pokaż ( i jeśli trzeba to opisz )
    > jak wygląda oryginalny plik tekstowy.

    Jeżeli zapisuję dane to pliku .txt, to wygląda to tak:

    "010101010101000101111010101010101110100101111101011
    0111110...010101010101010100101010101010010101010101
    00101010101011111"

    Po prostu pseudolosowy ciąg zer i jedynek, nic więcej.


  • 10. Data: 2021-08-20 22:32:54
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "M.M." <m...@g...com>

    On Friday, August 20, 2021 at 8:45:23 PM UTC+2, o...@g...com wrote:
    > > Jeśli dane są w pliku binarnym to tak:
    > > cat dane_binarne.bin | ./PractRand stdin [tu wpisz opcje PractRand]
    > Jakie są te opcje PractRand? Ja uruchamiam to w ten sposób:
    >
    > cat plik.data | ./RNG_test stdin
    >
    > Niestety zwiększenie rozmiaru pliku do 230 GB nie pomogło, a więcej nie zmieści mi
    się na dysku. Wciąż dziwią mnie te oblane testy, podczas, gdy wszystkie testy
    Dieharder ten generator zdawał. Albo PractRand jest o tyle bardziej wymagający, albo
    nadal coś jest nie tak.
    > > > Wydaje mi się, że prędzej, niż ogarnę C++ zrobię odpowiedni plik.
    > > Można ,ale dobre testowanie wymaga dużo danych. Osobiście testowałem generatory
    minimum
    > > godzinę, maksimum (o ile pamiętam) dwa tygodnie na jednym wątku. Przez ten czas,
    szczególnie
    > > przez dwa tygodnie, generator jest w stanie wygenerować sporo liczb i program
    testowy sporo skonsumować.
    > > Liczby z dwóch tygodni nie wiem czy zmieszczą się na dysku.
    > Na pewno się nie zmieszczą. Już osiągnąłem limit. Z jakichś powodów zresztą bardzo
    szybko udało mi się to wygenerować i zapisać do pliku (godzina z hakiem), tak jakby
    liczby w formacie binarnym zapisywały się szybciej. 50 GB liczb 32-bitowych w
    formacie dziesiętnym zapisywało mi się kilka godzin.
    >
    > Ile GB w takim przetestowałeś, skoro robiłeś testy nawet 2 tygodnie?
    > > > Przepisanie kodu z Pythona do C++ musiałbym raczej komuś zlecić.
    > > Co tam konkretnie jest do napisania? Może coś podobnego jest to gotowe pod
    linkami które podałem?
    > Przykładowy program:
    >
    > https://pastebin.com/K164URZQ
    >
    > Liczby 128-bitowe są tam ładowanie po prostu do listy allstream, ale oczywiście
    można to zaaranżować inaczej.
    > > > Pytanie, czy będę w stanie wygenerować odpowiedni plik w odpowiednim czasie (bo
    pomimo, że generatory, które testuję są
    > > > jednymi z najszybszych na świecie, co do zasady są podobne do PCG generators,
    to Python nie dość, że bywa 50-100 razy
    > > > wolniejszy niż C++, to jeszcze do tego sam zapis do pliku trwa długo i jak
    szybki nie byłby generator - nie da się tego procesu
    > > > przyspieszyć). Ile PractRand potrzebuje danych?
    > > Zapis całego dużego dysku to np. jedna doba, ale zależy jaki szybki/duży dysk,
    może być godzina, może być tydzień. Trudno
    > > bez testów powiedzieć czy wolniejszy będzie zapis czy powolne generowanie
    najszybszym generatorem na świecie. PractRand
    > > tym lepiej testuje im więcej danych otrzyma.
    > Ja zapisałem cały dysk w godzinę z hakiem.
    > > > żeby generator nie oblewał testów (gdy danych było za mało plik był zawijany i
    do testów był brane w kółko te same liczby, do
    > > > powodowało oblewanie testów). A i tak zawijał niektóre próbki, tzw. "
    rewounds".
    > > Temat jest trudniejszy, może generator na małych zapętlonych danych przechodzić
    test, na na długich oblewać.
    > W każdym razie wszystkie testy przy odpowiedniej ilości danych zdawał. Wystarczyło
    50 GB danych, zapisanych w formacie dziesiętnym jako liczby 32-bitowe.
    > > Chyba najlepiej odtworzyć te same dane losowe co były użyte w programie, aby mieć
    pewność że program
    > > pracował na losowych danych które przechodzą testy statystyczne.
    > Używam tych samych danych. A mimo to w PractRand pełno testów jest niezdanych.
    > > Zadziała, ale jeśli tester nie wspomaga plików tekstowych, to trzeba samemu
    napisać program który zamieni dane tekstowe na binarne.
    > > Potem dam przykładowy kod w C++, może dziś wieczorem, to kilka linijek.
    > Wygenerowałem plik .data. Zapisałem tam liczby w formacie binarnym. Wszystko
    wskazuje na to, że to powinno działać. Może po prostu generator nie zdaje testów. Z
    drugiej jednak strony, jeśli Ty piszesz, że testowałeś generator nawet kilka dni, to
    jest nic w porównaniu z danymi, które ja dostarczyłem do testów, wygenerowanymi
    zaledwie w godzinę. Może po prostu jest ich za mało. Ale, czy 230 GB to za mało?
    > > Teraz nie mogę, potem dam kod program który przekonwertuje plik tekstowy do
    binarnego. Proszę, pokaż ( i jeśli trzeba to opisz )
    > > jak wygląda oryginalny plik tekstowy.
    > Jeżeli zapisuję dane to pliku .txt, to wygląda to tak:
    >
    > "010101010101000101111010101010101110100101111101011
    0111110...010101010101010100101010101010010101010101
    00101010101011111"
    >
    > Po prostu pseudolosowy ciąg zer i jedynek, nic więcej.

    Ok.

    Pobierz ten plik źródłowy i skompiluj konwerter.
    https://github.com/mmarszik/01ToBin/blob/main/main.c
    pp

    Potem uruchom tak:

    TwójGeneratorZerIJedynek | ./01ToBin | ./PractRand stdin

    Albo gorzej tak:

    cat PlikZerIJedynek | ./01ToBin | ./PractRand stdin

    Nie testowałem, jak nie zadziała, to będzie trzeba sprawdzić czy konwerter nie ma
    jakiś błędów

    Pozdrawiam




strony : [ 1 ] . 2 ... 9



Szukaj w grupach

Szukaj w grupach

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: