Zainspirowany przez Random ze związanymi rękami :
Cel
Celem tego wyzwania jest napisanie programu, który generuje pseudolosowy strumień bitów, który jest ciągiem 1 i 0, które wydają się być całkowicie losowe, ale w rzeczywistości są generowane w sposób deterministyczny. Twój program powinien wypisać ciąg 1 i 0 (z opcjonalnym białym znakiem) i powinien spełnić następujące wymagania:
- Biorąc pod uwagę nieograniczony czas i pamięć, twój program musi nadal wyświetlać ciąg 1 i 0 na zawsze
- Twój program musi wygenerować ponad 1000 losowych bitów w ciągu około jednej minuty na rozsądnej maszynie. Jeśli to wymaganie jest niemożliwe, zmniejszę je.
- Ciąg bitów może się powtarzać, ale długość powtarzającej się sekcji musi być większa niż 1000 bitów.
- Ciąg bitów musi przejść jak najwięcej testów losowości (opisanych poniżej), jak to możliwe.
- Program nie może pobierać żadnych danych wejściowych z zewnętrznych źródeł ani używać wbudowanej funkcji podobnej do rand ().
- Ze względu na powyższe wymagania program musi wyświetlać ten sam ciąg bitów za każdym razem, gdy jest uruchamiany.
Test losowości nr 1
Ciąg bitów pseudolosowych nie może zawierać żadnego oczywistego wzorca po oględzinach.
Test losowości nr 2 (może ulec zmianie na podstawie komentarzy)
Ciąg bitów musi zawierać równy rozkład 1 i 0. Aby to przetestować (i inne rzeczy), strumień bitów jest podzielony na segmenty o długości 3 bitów, takie jak 101|111|001
.
Spośród wszystkich tych segmentów 1/8 z nich powinna mieć trzy jedynki i żadnych zer, 3/8 z nich powinno mieć dwa jedynki, a jeden 0, 3/8 powinno mieć jeden 1 i dwa zera, a 1/8 z nich nie powinny mieć 1 i 3 0.
Test losowości # 3
„Przebieg” jest definiowany jako kolejna seria bitów, z których wszystkie mają tę samą wartość. Ciąg 1001001110
ma trzy przebiegi o rozmiarze 1 ( 1..1.....0
), dwa przebiegi o rozmiarze 2 ( .00.00....
) i jeden przebieg o rozmiarze 3 ( ......111.
). Zauważ, że przebiegi nie nakładają się.
Z ciągu 1000 losowych bitów powinno być około 250 serii o rozmiarze 1, 125 serii o rozmiarze 2, 62 serii o rozmiarze 3 itd. Ogólnie rzecz biorąc, dla serii o rozmiarze R powinno być około serii 1000/(2**(R+1))
o tej wielkości.
Test losowości # 4
Pierwsze 840 bitów podzielono na dwie połowy po 420 bitów. Każdy bit w pierwszej połowie jest porównywany z odpowiednim bitem w drugiej połowie. Dwa bity powinny pasować przez około pięćdziesiąt procent czasu.
Oto kod źródłowy programu Perl, który wykonuje testy od 2 do 4. Obecnie wymaga, aby ciąg bitów nie zawierał żadnych białych znaków.
Czas Kryterium Zwycięskiego Celu!
Zwycięzcą jest program, który spełnia wszystkie 6 wymagań i wszystkie testy losowości w stopniu, który jest nie do odróżnienia od losowości. Jeśli wiele programów to osiągnie, wygra ten, który zajmuje najwięcej czasu. Jeśli wiele programów to osiągnie, być może będę musiał znaleźć więcej testów losowości, aby działać jak remis.