C
Biên dịch với cờ -pthread (hoặc bất cứ thứ gì trình biên dịch của bạn sử dụng).
#include <stdio.h>
#include <pthread.h>
#define m (unsigned long)2147483647
#define q (unsigned long)127773
#define a (unsigned int)16807
#define r (unsigned int)2836
static unsigned long seed;
pthread_t t[20];
int lo, hi, done;
void *pseudorandom(void *id)
{
while(done)
{
int test;
hi = seed/q;
lo = seed%q;
test = a * lo - r * hi;
if (test > 0) seed = test;
else seed = test + m;
}
}
main()
{
int i;
seed = 54321;
done = 1;
for(i = 0; i < 20; i++)
{
pthread_create(&(t[i]), NULL, &pseudorandom, NULL);
}
for (i = 0; i < 10; i++)
{
printf("%lu\n", seed);
}
done = 0;
}
Tôi không chắc chắn điều này có đủ điều kiện hay không dựa trên tiêu chuẩn "thời gian không được phép", bởi vì về cơ bản, nó sử dụng bộ lập lịch làm nguồn entropy bằng cách cố ý bỏ qua an toàn luồng. Nó hoạt động bằng cách sử dụng một hàm psuedo-Random khá cơ bản (trình tạo số ngẫu nhiên của Lehmer ) với một hạt giống ban đầu được mã hóa cứng. Sau đó, nó bắt đầu 20 luồng mà tất cả chạy tính toán Lehmer với một bộ biến được chia sẻ.
Có vẻ như hoạt động khá tốt, đây là một vài lần chạy liên tiếp:
comintern ~ $ ./a.out
821551271
198866223
670412515
4292256
561301260
1256197345
959764614
874838892
1375885882
1788849800
comintern ~ $ ./a.out
2067099631
953349057
1736873858
267798474
941322622
564797842
157852857
1263164394
399068484
2077423336
EDIT:
Đã cho điều này thêm một chút suy nghĩ và nhận ra rằng đây hoàn toàn không phải là thời gian. Ngay cả với một bộ lập lịch hoàn toàn xác định, entropy không đến từ các lát cắt thời gian - nó đến từ việc tải tất cả các quy trình đang chạy trên hệ thống.
EDIT 2
Sau khi lấy một số cảm hứng từ @Quincunx đăng một đường cong hình chuông, tôi đã đổ 12MB ngẫu nhiên vào một tệp và tải nó lên CAcert . Nó đã thất bại trong tất cả các bài kiểm tra cực đoan, nhưng đã đạt được 7.999573 đáng nể trong số 8 bài kiểm tra ENT (chỉ có khả năng xác định). Thật kỳ lạ, nhân đôi số lượng chủ đề làm cho nó tồi tệ hơn.