Terinspirasi secara acak dengan tangan terikat :
Target
Tujuan dari tantangan ini adalah untuk menulis sebuah program yang menghasilkan bit stream pseudorandom, yang merupakan string 1s dan 0s yang tampaknya murni acak, tetapi sebenarnya dihasilkan dengan cara deterministik. Program Anda harus menampilkan string 1 dan 0s (dengan spasi kosong opsional) dan harus melewati persyaratan berikut:
- Dengan waktu dan memori yang tidak terbatas, program Anda harus terus menghasilkan string 1s dan 0s selamanya
- Program Anda harus mengeluarkan lebih dari 1000 bit acak dalam waktu sekitar satu menit, pada mesin yang masuk akal. Jika persyaratan ini tidak mungkin, maka saya akan menguranginya.
- String bit dapat diulang, tetapi panjang bagian berulang harus lebih dari 1000 bit.
- String bit harus lulus sebanyak mungkin tes keacakan (dijelaskan di bawah) sebanyak mungkin.
- Program tidak boleh mengambil input dari sumber eksternal apa pun atau menggunakan fungsi bawaan () - seperti apa pun.
- Karena persyaratan di atas, program harus menampilkan string bit yang persis sama setiap kali dijalankan.
Uji Keacakan # 1
String bit pseudorandom tidak boleh menyertakan pola yang jelas pada inspeksi visual.
Uji Keacakan # 2 (dapat berubah berdasarkan komentar)
String bit harus mengandung distribusi yang sama antara 1s dan 0s. Untuk menguji ini (dan hal lainnya juga), aliran bit dipecah menjadi segmen yang panjangnya 3 bit, seperti 101|111|001
.
Dari semua segmen ini, 1/8 dari mereka harus memiliki tiga 1s dan tidak ada 0s, 3/8 dari mereka harus memiliki dua 1s dan satu 0, 3/8 dari mereka harus memiliki satu 1 dan dua 0s, dan 1/8 dari mereka seharusnya tidak memiliki 1 dan tiga 0.
Uji Keacakan # 3
"Jalankan" didefinisikan sebagai serangkaian bit berurutan yang semuanya memiliki nilai yang sama. String 1001001110
memiliki tiga kali run ukuran 1 ( 1..1.....0
), dua kali run ukuran 2 ( .00.00....
) dan satu kali run dari ukuran 3 ( ......111.
). Perhatikan bahwa menjalankan tidak tumpang tindih.
Dari string 1000 bit acak, harus ada sekitar 250 run ukuran 1, 125 run ukuran 2, 62 run ukuran 3, dll. Secara umum, untuk run size R, harus ada sekitar 1000/(2**(R+1))
run dari ukuran itu.
Uji Keacakan # 4
840 bit pertama dibagi menjadi dua bagian masing-masing 420 bit. Setiap bit di babak pertama dibandingkan dengan bit yang sesuai di babak kedua. Dua bit harus cocok dengan sekitar lima puluh persen dari waktu.
Berikut ini adalah kode sumber dari program Perl yang melakukan tes 2 hingga 4. Sampai sekarang, itu memerlukan string bit tidak mengandung spasi.
Waktu Kriteria Kemenangan yang Objektif!
Pemenangnya adalah program yang lulus semua 6 persyaratan dan semua tes keacakan sejauh tidak bisa dibedakan dari keacakan. Jika beberapa program mencapai ini, maka program yang membutuhkan waktu paling lama untuk mengulang akan menang. Jika beberapa program mencapai ini, maka saya mungkin harus menemukan lebih banyak tes keacakan untuk bertindak sebagai tie-breaker.