-
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