C
Compilez avec l'indicateur -pthread (ou tout ce que votre compilateur utilise).
#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;
}
Je ne sais pas si cela se qualifie ou non en fonction de la norme "le temps n'est pas autorisé", car il utilise essentiellement le planificateur comme source d'entropie en ignorant intentionnellement la sécurité des threads. Il fonctionne en utilisant une fonction pseudo-aléatoire assez basique ( générateur de nombres aléatoires Lehmer ) avec une graine initiale codée en dur. Il démarre ensuite 20 threads qui exécutent tous le calcul de Lehmer avec un ensemble partagé de variables.
Semble assez bien fonctionner, voici quelques runs consécutifs:
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: A
réfléchi un peu plus et a réalisé que ce n'est pas du tout basé sur le temps. Même avec un ordonnanceur complètement déterministe, l'entropie ne provient pas des tranches de temps - elle provient du chargement de tous les processus en cours d'exécution sur le système.
EDIT 2
Après m'être inspiré de @Quincunx qui a affiché une courbe en cloche, j'ai vidé 12 Mo d'aléatoire dans un fichier et l'ai téléchargé sur CAcert . Il a échoué à tous les tests purs et durs, mais a réussi un respectable 7,999573 sur 8 au test ORL (uniquement potentiellement déterministe). Curieusement, doubler le nombre de fils a aggravé la situation.