C
-Pthread bayrağını (veya derleyicinizin kullandığı her şeyi) derleyin.
#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;
}
Bu temelde zamanlayıcı zamanlama entropi kaynağı olarak entropi kaynağı olarak kasıtlı olarak iş parçacığı güvenliğini göz ardı ederek kullanarak, "zaman izin verilmez" standardı dayalı olup olmadığını emin değilim. Sert kodlanmış bir başlangıç tohumuna sahip oldukça basit bir psuedo-random fonksiyonu ( Lehmer rasgele sayı üreteci ) kullanarak çalışır . Daha sonra, Lehmer hesaplamasını paylaşılan bir değişkenler kümesiyle çalıştıran 20 iş parçacığı başlar.
Oldukça iyi çalışıyor gibi görünüyor, burada birkaç ardışık koşu var:
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:
Bunu biraz daha düşünerek verdi ve bunun hiç zamana dayalı olmadığını fark etti. Tamamen deterministik bir zamanlayıcı ile bile, entropi zaman dilimlerinden gelmez - sistemdeki tüm çalışan işlemlerin yüklenmesinden gelir.
2 DÜZENLEME
@Quincunx bir çan eğrisi göndererek biraz ilham aldıktan sonra, bir dosyaya 12MB rasgele döktüm ve CAcert'e yükledim . Tüm diehard testlerinde başarısız oldu, ancak ENT testinde 8 üzerinden 7.999573'e dikkat çekti (sadece Potansiyel olarak deterministik). İlginçtir ki, iplik sayısının iki katına çıkarılması durumu daha da kötüleştirdi.