Вдохновленный Рэндом со связанными руками :
Цель
Цель этой задачи - написать программу, которая генерирует псевдослучайный поток битов, который представляет собой строку из 1 и 0, которая выглядит чисто случайной, но фактически генерируется детерминированным способом. Ваша программа должна вывести строку из 1 и 0 (с необязательным пробелом) и должна соответствовать следующим требованиям:
- Учитывая неограниченное время и память, ваша программа должна продолжать выводить строки 1 и 0 навсегда
- Ваша программа должна вывести более 1000 случайных битов за одну минуту на приемлемой машине. Если это требование невозможно, я уменьшу его.
- Строка битов может повторяться, но длина повторяющейся секции должна быть больше 1000 бит.
- Строка битов должна пройти как можно больше тестов случайности (описанных ниже).
- Программа не должна принимать какие-либо входные данные от каких-либо внешних источников или использовать какую-либо встроенную функцию rand ().
- Из-за вышеуказанного требования программа должна выводить одну и ту же строку битов при каждом запуске.
Тест случайности № 1
Строка псевдослучайных битов не должна содержать какой-либо очевидной картины при визуальном осмотре.
Тест на случайность # 2 (возможны изменения в зависимости от комментариев)
Строка битов должна содержать равное распределение 1 и 0. Чтобы проверить это (и другие вещи), поток битов разбивается на сегменты длиной 3 бита, например 101|111|001
.
Из всех этих сегментов 1/8 из них должны иметь три единицы и не иметь нулей, 3/8 из них должны иметь две единицы и одну цифру 0, 3/8 из них должны иметь одну 1 и две цифры 0 и 1/8 из них не должно быть 1 и три 0.
Тест случайности № 3
«Выполнение» определяется как последовательный ряд битов, которые имеют одинаковое значение. Строка 1001001110
имеет три цикла размера 1 ( 1..1.....0
), два цикла размера 2 ( .00.00....
) и один цикл размера 3 ( ......111.
). Обратите внимание, что пробеги не перекрываются.
Из строки из 1000 случайных битов должно быть около 250 прогонов с размером 1, 125 прогонов с размером 2, 62 прогона с размером 3 и т. Д. В целом, для 1000/(2**(R+1))
прогонов размера R должно быть около прогонов такого размера.
Тест случайности № 4
Первые 840 бит разделены на две половины по 420 бит каждая. Каждый бит в первой половине сравнивается с соответствующим битом во второй половине. Два бита должны совпадать примерно в пятидесяти процентах случаев.
Вот исходный код программы на Perl, которая выполняет тесты со 2 по 4. На данный момент требуется, чтобы строка битов не содержала пробелов.
Объективный критерий времени победы!
Победителем становится программа, которая проходит все 6 требований и все тесты на случайность до такой степени, что она неотличима от случайности. Если несколько программ выполнят это, то выиграет та, которая повторяется дольше всех. Если несколько программ выполнят это, то мне, возможно, придется найти больше тестов случайности, чтобы действовать в качестве тай-брейков.