당신의 손이 묶여있는 랜덤에서 영감을 얻었 습니다 .
목표
이 과제의 목표는 의사 랜덤 비트 스트림을 생성하는 프로그램을 작성하는 것입니다. 의사 랜덤 비트 스트림은 순전히 무작위 인 것처럼 보이지만 실제로는 결정적인 방식으로 생성되는 1과 0의 문자열입니다. 프로그램은 1과 0의 문자열 (선택적 공백)을 출력해야하며 다음 요구 사항을 통과해야합니다.
- 무제한 시간과 메모리가 주어지면 프로그램은 계속 1과 0의 문자열을 계속 출력해야합니다.
- 당신의 프로그램은 적당한 기계에서 약 1 분 안에 1000 개 이상의 랜덤 비트를 출력해야합니다. 이 요구 사항이 불가능하면 줄 이겠습니다.
- 비트 열은 반복 될 수 있지만 반복 구간의 길이는 1000 비트 이상이어야합니다.
- 비트 열은 무작위 테스트 (아래 설명 참조)를 가능한 한 많이 통과해야합니다.
- 프로그램은 외부 소스로부터 입력을 받거나 내장 rand ()와 유사한 함수를 사용해서는 안됩니다.
- 위의 요구 사항으로 인해 프로그램은 실행될 때마다 동일한 정확한 비트 문자열을 출력해야합니다.
무작위성 테스트 # 1
의사 랜덤 비트 열은 육안 검사시 명백한 패턴을 포함하지 않아야합니다.
무작위성 테스트 # 2 (주석에 따라 변경 될 수 있음)
비트 열은 1과 0의 등분 포를 포함해야합니다. 이것을 테스트하기 위해 (그리고 다른 것들도) 비트 스트림은 3 비트 길이의 세그먼트로 나뉩니다 101|111|001.
이 모든 세그먼트 중 1/8은 3이 1이고 0이 없어야하며, 3/8은 2가 1이고 1이 0, 3/8이 1과 2가 1, 2가 각각 1/8이어야합니다. 그들 중 1과 3은 없어야합니다.
무작위성 테스트 # 3
"실행"은 모두 동일한 값을 갖는 연속적인 일련의 비트로 정의됩니다. 문자열 1001001110에는 크기 1 ( 1..1.....0) 의 3 행 , 크기 2 ( .00.00....)의 2 행 및 크기 3 ( ......111.) 의 1 행이 있습니다 . 런은 겹치지 않습니다.
1000 개의 임의 비트의 문자열 중에서 크기가 1 인 250 개, 크기가 125 개의 2 개, 크기가 62 개의 3 개 등이 있어야합니다. 일반적으로 실행 크기 R 1000/(2**(R+1))의 경우 해당 크기의 실행이 있어야합니다.
무작위성 테스트 # 4
첫 번째 840 비트는 각각 420 비트의 두 반쪽으로 나뉩니다. 전반부의 각 비트는 후반의 해당 비트와 비교됩니다. 두 비트는 시간의 약 50 %와 일치해야합니다.
다음 은 테스트 2-4를 수행하는 Perl 프로그램의 소스 코드입니다. 현재로서는 비트 열에 공백이 없어야합니다.
객관적인 승리 기준 시간!
우승자는 6 가지 요구 사항과 모든 임의성 테스트를 임의성과 구분할 수없는 수준으로 통과시키는 프로그램입니다. 여러 프로그램이이 작업을 수행하면 반복하는 데 가장 오랜 시간이 걸리는 프로그램이 승리합니다. 여러 프로그램에서이 작업을 수행하는 경우 타이 브레이커 역할을하기 위해 더 많은 무작위 테스트를 찾아야 할 수 있습니다.
테스트 4 : 데이터의 전반과 후반의 일치