C
Compilare con il flag -pthread (o qualunque cosa usi il compilatore).
#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;
}
Non sono sicuro che ciò si qualifichi o meno in base allo standard "tempo non consentito", poiché utilizza sostanzialmente lo scheduler come fonte di entropia ignorando intenzionalmente la sicurezza del thread. Funziona utilizzando una funzione psuedo-casuale abbastanza semplice ( generatore di numeri casuali Lehmer ) con un seme iniziale codificato. Quindi avvia 20 thread che eseguono tutti il calcolo di Lehmer con un insieme condiviso di variabili.
Sembra funzionare abbastanza bene, ecco un paio di tirature consecutive:
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: ci
ho pensato un po 'di più e ho capito che questo non è affatto basato sul tempo. Anche con uno scheduler completamente deterministico, l'entropia non proviene dalle fasce temporali, ma dal caricamento di tutti i processi in esecuzione sul sistema.
EDIT 2
Dopo aver preso ispirazione da @Quincunx pubblicando una curva a campana, ho scaricato 12 MB di casualità in un file e l'ho caricato su CAcert . Ha fallito tutti i test irriducibili, ma ha registrato un rispettabile 7.999573 su 8 nel test ENT (solo potenzialmente deterministico). Curiosamente, raddoppiare il numero di thread ha peggiorato le cose.