Lấy cảm hứng từ Random với đôi tay bị trói :
Mục đích
Mục tiêu của thử thách này là viết một chương trình tạo ra luồng bit giả ngẫu nhiên, là một chuỗi 1 và 0 dường như hoàn toàn ngẫu nhiên, nhưng thực sự được tạo ra theo cách xác định. Chương trình của bạn sẽ xuất ra một chuỗi 1 và 0 (với khoảng trắng tùy chọn) và phải vượt qua các yêu cầu sau:
- Với thời gian và bộ nhớ không giới hạn, chương trình của bạn phải tiếp tục xuất ra chuỗi 1 và 0 mãi mãi
- Chương trình của bạn phải xuất hơn 1000 bit ngẫu nhiên trong khoảng một phút, trên một máy hợp lý. Nếu yêu cầu này là không thể, thì tôi sẽ giảm bớt nó.
- Chuỗi bit có thể lặp lại, nhưng độ dài của phần lặp lại phải lớn hơn 1000 bit.
- Chuỗi bit phải vượt qua càng nhiều phép thử ngẫu nhiên (được mô tả bên dưới) càng tốt.
- Chương trình không được lấy bất kỳ đầu vào nào từ bất kỳ nguồn bên ngoài nào hoặc sử dụng bất kỳ hàm rand () giống như tích hợp nào.
- Do yêu cầu trên, chương trình phải xuất ra cùng một chuỗi bit chính xác mỗi lần chạy.
Kiểm tra ngẫu nhiên # 1
Chuỗi bit giả ngẫu nhiên không được bao gồm bất kỳ mẫu rõ ràng nào khi kiểm tra trực quan.
Kiểm tra ngẫu nhiên # 2 (có thể thay đổi dựa trên ý kiến)
Chuỗi bit phải chứa phân phối bằng 1s và 0. Để kiểm tra điều này (và những thứ khác nữa), luồng bit được chia thành các đoạn dài 3 bit, chẳng hạn như 101|111|001
.
Trong số tất cả các phân khúc này, 1/8 trong số chúng nên có ba 1 và không 0, 3/8 trong số chúng nên có hai 1 và một 0, 3/8 trong số chúng nên có một 1 và hai 0 và 1/8 trong số họ không nên có 1 và ba 0.
Kiểm tra ngẫu nhiên # 3
Một "run" được định nghĩa là một chuỗi bit liên tiếp mà tất cả đều có cùng giá trị. Chuỗi 1001001110
có ba lần chạy kích thước 1 ( 1..1.....0
), hai lần chạy kích thước 2 ( .00.00....
) và một lần chạy kích thước 3 ( ......111.
). Lưu ý rằng chạy không chồng chéo.
Trong chuỗi 1000 bit ngẫu nhiên, cần có khoảng 250 lần chạy kích thước 1, 125 lần chạy kích thước 2, 62 lần chạy kích thước 3, v.v. Nói chung, đối với kích thước chạy R, cần có khoảng 1000/(2**(R+1))
chạy với kích thước đó.
Kiểm tra ngẫu nhiên # 4
8 bit đầu tiên được chia thành hai nửa 420 bit mỗi bit. Mỗi bit trên nửa đầu được so sánh với bit tương ứng trên nửa thứ hai. Hai bit sẽ khớp với khoảng năm mươi phần trăm thời gian.
Đây là mã nguồn của chương trình Perl thực hiện các thử nghiệm từ 2 đến 4. Cho đến nay, nó yêu cầu chuỗi bit không chứa bất kỳ khoảng trắng nào.
Tiêu chí chiến thắng khách quan Thời gian!
Người chiến thắng là chương trình vượt qua tất cả 6 yêu cầu và tất cả các bài kiểm tra ngẫu nhiên đến mức độ không thể phân biệt được với tính ngẫu nhiên. Nếu nhiều chương trình hoàn thành việc này, thì chương trình nào mất nhiều thời gian nhất để lặp lại sẽ giành chiến thắng. Nếu nhiều chương trình thực hiện điều này, thì tôi có thể phải tìm thêm các thử nghiệm ngẫu nhiên để hoạt động như các bộ ngắt kết nối.