ค
คอมไพล์ด้วยแฟล็ก -pthread (หรือคอมไพเลอร์ของคุณใช้)
#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;
}
ฉันไม่แน่ใจว่าสิ่งนี้มีคุณสมบัติหรือไม่ขึ้นอยู่กับมาตรฐาน "ไม่อนุญาตให้มีเวลา" เพราะโดยพื้นฐานแล้วการใช้ตัวกำหนดตารางเวลาเป็นแหล่งของเอนโทรปีโดยจงใจละเว้นความปลอดภัยของเธรด มันทำงานโดยใช้ฟังก์ชั่นพื้นฐาน psuedo-random ( เครื่องกำเนิดเลขสุ่ม Lehmer ) กับเมล็ดเริ่มต้นที่มีการเข้ารหัสอย่างหนัก จากนั้นจะเริ่ม 20 เธรดที่เรียกใช้การคำนวณ Lehmer ด้วยชุดตัวแปรที่แชร์
ดูเหมือนว่าจะทำงานได้ค่อนข้างดีต่อไปนี้คือการดำเนินการสองอย่างติดต่อกัน:
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
แก้ไข:
ให้ความคิดอีกเล็กน้อยและตระหนักว่านี่ไม่ใช่เวลาทั้งหมด แม้ว่าเอนโทรปีจะไม่ได้มาจากตัวแบ่งเวลา แต่ก็มาจากการโหลดของกระบวนการที่กำลังทำงานอยู่ทั้งหมดในระบบ
แก้ไข 2
หลังจากรับแรงบันดาลใจจากการโพสต์ @Quincunx ระฆังฉันทิ้ง 12MB ของการสุ่มลงในไฟล์และอัปโหลดไปยังCAcert มันล้มเหลวในการทดสอบมิจฉาทิฐิทั้งหมด แต่ได้ทดสอบระดับ 7.999573 จากทั้งหมด 8 ในการทดสอบ ENT (เฉพาะค่าที่อาจเป็นไปได้ ) อยากรู้อยากเห็นการนับด้ายสองเท่าทำให้แย่ลง