Натхненний Random з зв’язаними руками :
Мета
Мета цього виклику - написати програму, яка генерує псевдослучайний потік бітів, який є рядком 1s і 0s, який видається чисто випадковим, але насправді генерується детермінованим способом. Ваша програма повинна виводити рядок у розмірі 1 та 0 (з необов’язковим пробілом) і повинна відповідати наступним вимогам:
- Враховуючи необмежений час і пам'ять, ваша програма повинна продовжувати виводити рядок 1s і 0s назавжди
- Ваша програма повинна виводити більше 1000 випадкових бітів за одну хвилину на розумній машині. Якщо ця вимога неможлива, я її зменшу.
- Рядок бітів може повторюватися, але довжина ділянки, що повторюється, повинна бути більше 1000 біт.
- Рядок бітів повинен пройти якомога більше тестів на випадковість (описаних нижче).
- Програма не повинна приймати жодних вхідних даних із будь-яких зовнішніх джерел або використовувати будь-яку вбудовану функцію rand ().
- Через вищезазначену вимогу програма повинна виводити однаковий точний рядок бітів щоразу, коли вона виконується.
Тест на випадковість №1
Рядок псевдовипадкових бітів не повинен містити очевидних зразків при візуальному огляді.
Тест на випадковість №2 (може змінюватися на основі коментарів)
Рядок бітів повинен містити рівний розподіл 1s і 0s. Щоб перевірити це (та й інші речі), потік бітів розбивається на сегменти довжиною 3 біти, наприклад 101|111|001
.
З усіх цих сегментів, 1/8 з них повинні мати три 1s, а не 0s, 3/8 з них повинні мати два 1s і один 0, 3/8 з них повинні мати один 1 і два 0s, і 1/8 з них не повинно бути ні 1, а три 0.
Тест на випадковість №3
"Виконання" визначається як послідовний ряд бітів, які мають однакове значення. Рядок 1001001110
має три прогони розміром 1 ( 1..1.....0
), два прогони розміром 2 ( .00.00....
) та один запуск розміром 3 ( ......111.
). Зауважте, що прогони не перетинаються.
Із рядка з 1000 випадкових бітів повинно бути близько 250 прогонів розміром 1, 125 прогонів розміром 2, 62 прогони розміром 3 і т. Д. Загалом, для розміру R має бути приблизно 1000/(2**(R+1))
прогонів такого розміру.
Тест на випадковість №4
Перші 840 біт розділені на дві половини по 420 біт кожна. Кожен біт на першому таймі порівнюється з відповідним бітом на другому таймі. Два біта повинні відповідати приблизно п’ятдесяти відсотків часу.
Ось вихідний код програми Perl, яка виконує тести з 2 по 4. На даний момент потрібно, щоб рядок бітів не містила пробілів.
Об'єктивний критерій виграшу!
Переможець - програма, яка проходить усі 6 вимог та всі тести на випадковість настільки, що вона не відрізняється від випадковості. Якщо це виконає декілька програм, то перемагає та, на яку потрібно повторити найдовший час. Якщо це виконає декілька програм, то, можливо, мені доведеться знайти більше тестів на випадковість, щоб діяти як вимикачі.