目標
このチャレンジの目標は、純粋にランダムに見えるが実際には決定論的な方法で生成される1と0の文字列である擬似ランダムビットストリームを生成するプログラムを作成することです。プログラムは、1と0の文字列(オプションの空白を含む)を出力し、次の要件を満たしている必要があります。
- 時間とメモリが無制限の場合、プログラムは1と0の文字列を永久に出力し続ける必要があります
- プログラムは、合理的なマシンで、約1分で1000を超えるランダムビットを出力する必要があります。この要件が不可能な場合は、軽減します。
- ビット列は繰り返すことができますが、繰り返しセクションの長さは1000ビットを超える必要があります。
- ビット列は、可能な限り多くのランダム性テスト(以下で説明)に合格する必要があります。
- プログラムは、外部ソースから入力を受け取ったり、組み込みのrand()のような関数を使用したりしてはなりません。
- 上記の要件により、プログラムは実行されるたびに同じ正確なビット文字列を出力する必要があります。
ランダム性テスト#1
擬似ランダムビットの文字列には、目視検査で明らかなパターンを含めないでください。
ランダム性テスト#2(コメントに基づいて変更される場合があります)
ビット列には、1と0の等分布が含まれている必要があります。これをテストするために(および他のことも)、ビットストリームは、などの3ビット長のセグメントに分割され101|111|001
ます。
これらのすべてのセグメントのうち、1/8には1が3つあり、0はありません。3/ 8には2つの1と1つの0があり、3/8には1と2つの0があり、1/8がありますそれらのうち、1がなく、3つの0が必要です。
ランダム性テスト#3
「実行」は、すべて同じ値を持つ連続した一連のビットとして定義されます。文字列に1001001110
は、サイズ1(1..1.....0
)の3 つの実行、サイズ2(.00.00....
)の2 つの実行、およびサイズ3(......111.
)の1つの実行があります。実行が重複しないことに注意してください。
1000個のランダムビットの文字列のうち、サイズ1の実行が約250回、サイズ2の実行が125回、サイズ3の実行が62回などである必要があり1000/(2**(R+1))
ます。
ランダム性テスト#4
最初の840ビットは、それぞれ420ビットの2つの半分に分割されます。前半の各ビットは、後半の対応するビットと比較されます。2つのビットは、約50%の時間で一致する必要があります。
以下は、テスト2〜4を実行するPerlプログラムのソースコードです。現在のところ、ビットの文字列に空白が含まれていないことが必要です。
客観的勝利基準時間!
勝者は、6つの要件すべてとすべてのランダム性テストに合格し、ランダム性と区別できない程度に合格するプログラムです。複数のプログラムがこれを達成する場合、繰り返しに最も長い時間がかかるプログラムが勝ちます。複数のプログラムがこれを達成する場合、タイブレーカーとして機能するために、さらにランダム性テストを見つける必要があるかもしれません。