Perl 28/13 2,15
sub r{$s^=~($s^=$s/7215)<<8}
đăng nhập tập tin ở đây
Perl 29/13 2,23
sub r{$s^=~($s^=$s<<8)/60757}
đăng nhập tập tin ở đây
Đây là một cái gì đó của một biến thể trên Xorshift , sử dụng phân chia dấu phẩy động thay vì dịch chuyển phải. Cả hai đều vượt qua 13 trong số 15 bài kiểm tra, chỉ trượt bài kiểm tra 6 và 7.
Tôi không chắc chắn chính xác chu kỳ là bao lâu, nhưng vì đoạn mã sau không chấm dứt trong bất kỳ khoảng thời gian ngắn nào, nên có khả năng là toàn bộ 2 32 :
$start = r();
$i++ while $start != r();
print $i;
Perl 39/10 = 3,9
$s=$^T;sub r{~($s=$s*$s%4294969373)||r}
Lưu ý: nếu bạn đang tìm kiếm một PRNG Blum-Blum-Shub-esque, giải pháp của Keith Randall tốt hơn nhiều so với một trong hai.
Như với giải pháp ban đầu của tôi dưới đây, đây cũng là một triển khai của Blum Blum Shub, với một sự khác biệt lớn. Tôi sử dụng một mô-đun lớn hơn 2 32 ( M = 50971 • 84263 ) và bất cứ khi nào gặp một giá trị mà nó không phải là số nguyên 32 bit hợp lệ (nghĩa là lớn hơn 2 32 ), nó sẽ trả về giá trị tiếp theo trong thay thế luân chuyển. Về bản chất, các giá trị này được cắt bỏ, khiến phần còn lại của vòng quay không bị xáo trộn, dẫn đến phân phối gần như thống nhất.
Nó dường như đã giúp đỡ. Ngoài việc vượt qua 9 bài kiểm tra tương tự như trước đây, giờ đây nó cũng vượt qua bài kiểm tra Khoảng cách tối thiểu một cách thuyết phục. Một tệp nhật ký mẫu có thể được tìm thấy ở đây .
Perl 33/9 3,67 (Không hợp lệ?)
$s=$^T;sub r{$s=$s*$s%4294951589}
Lưu ý: giải pháp này có thể được coi là không hợp lệ, vì hầu hết 0,00037% trong phạm vi sẽ không bao giờ được quan sát.
Một triển khai nhanh chóng và bẩn thỉu của Blum Blum Shub . Tôi yêu cầu các kết quả sau:
1. passed - Birthday Spacings
2. FAILED - Overlapping Permutations
3. passed - Ranks of 31x31 and 32x32 Matrices
4. passed - Ranks of 6x8 Matrices
5. FAILED - Monkey Tests on 20-bit Words
6. FAILED - Monkey Tests OPSO, OQSO, DNA
7. FAILED - Count the 1s in a Stream of Bytes
8. passed - Count the 1s for Specific Bytes
9. passed - Parking Lot Test
10. FAILED - Minimum Distance Test
11. passed - Random Spheres Test
12. FAILED - The Squeeze Test
13. passed - Overlapping Sums Test
14. passed - Runs Test
15. passed - The Craps Test
Một tệp nhật ký mẫu có thể được tìm thấy ở đây , vui lòng tranh chấp bất kỳ kết quả nào. Các tập tin cho diehard có thể được tạo theo cách sau:
print pack('N', r()) for 1..4194304
và sau đó đường ống đầu ra thành một tập tin. Khoảng cách tối thiểu có vẻ như đã vượt qua, nhưng nếu bạn chạy nó nhiều lần thì nó luôn rất gần với 1.0 , điều này cho thấy sự thất bại.
Chi tiết
Nhìn chung, Blum Blum Shub là một PRNG khủng khiếp, nhưng hiệu suất của nó có thể được cải thiện bằng cách chọn một mô-đun tốt. Các M tôi đã chọn là 7027 • 611.207 . Cả hai yếu tố chính này, p và q , đều có dư lượng mô-đun 3 (mod 4) và gcd ((p-1), φ (q-1)) = 2 , mức này thấp nhất có thể.
Mặc dù đây là những tiêu chí duy nhất được liệt kê trên trang wiki, nhưng dường như nó không đủ. Hầu như tất cả các modulo tôi đã thử thất bại trong mọi thử nghiệm. Nhưng có một số ít sẽ vượt qua một số bài kiểm tra, và bài kiểm tra mà tôi đã chọn dường như đặc biệt tốt, vì bất kỳ lý do gì.
Như một lưu ý cuối cùng, bản thân Test 5 dường như là một chỉ số khá tốt về mức độ PRNG tốt như thế nào. Nếu nó gần như không vượt qua Bài kiểm tra 5, nó sẽ thất bại một cách ngoạn mục.
TIỀN THƯỞNG: Perl 62/14 4,43
$t=$^T;sub r{$t|=(($s=$s/2|$t%2<<31)^($t/=2))<<31for 1..37;$t}
Chỉ dành cho người đam mê, đây là phiên bản 32 bit của PRNG được sử dụng trong Tetris gốc cho NES. Thật đáng ngạc nhiên, nó vượt qua 14 trong số 15 bài kiểm tra!
1. passed - Birthday Spacings
2. passed - Overlapping Permutations
3. passed - Ranks of 31x31 and 32x32 Matrices
4. passed - Ranks for 6x8 Matrices
5. passed - Monkey Tests on 20-bit Words
6. passed - Monkey Tests OPSO, OQSO, DNA
7. FAILED - Count the 1s in a Stream of Bytes
8. passed - Count the 1s for Specific Bytes
9. passed - Parking Lot Test
10. passed - Minimum Distance Test
11. passed - Random Spheres Test
12. passed - The Squeeze Test
13. passed - Overlapping Sums Test
14. passed - Runs Test
15. passed - The Craps Test
Tệp nhật ký mẫu có thể trước đây .
Phải thừa nhận rằng, 1..37
bit không phải là phiên âm chính xác. Trong phiên bản ban đầu, thói quen entropy được cập nhật 60 lần mỗi giây và sau đó được truy vấn theo các khoảng thời gian ngẫu nhiên, chủ yếu phụ thuộc vào đầu vào của người dùng. Đối với bất cứ ai quan tâm đến việc tháo rời ROM, thói quen entropy bắt đầu từ 0xAB47
.
Mã giả kiểu Python:
carry = entropy_1 & 1
entropy_1 >>= 1
entropy_2 = (entropy_2 >> 1) | (carry << 31)
carry = (entropy_1 & 1) ^ (entropy_2 & 1)
entropy_1 |= carry << 31