C
Compile con el indicador -pthread (o lo que sea que use su compilador).
#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;
}
No estoy seguro de si esto califica o no en base al estándar "no se permite el tiempo", porque básicamente está usando el programador como fuente de entropía al ignorar intencionalmente la seguridad del hilo. Funciona mediante el uso de una función psuedo-aleatoria bastante básica ( generador de números aleatorios de Lehmer ) con una semilla inicial codificada. Luego comienza 20 hilos que ejecutan el cálculo de Lehmer con un conjunto compartido de variables.
Parece funcionar bastante bien, aquí hay un par de carreras consecutivas:
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
EDITAR:
Pensé un poco más sobre esto y me di cuenta de que esto no está basado en el tiempo. Incluso con un planificador completamente determinista, la entropía no proviene de los segmentos de tiempo, sino de la carga de todos los procesos en ejecución en el sistema.
EDITAR 2
Después de inspirarme en @Quincunx al publicar una curva de campana, volqué 12 MB de aleatoriedad en un archivo y lo cargué en CAcert . Falló todas las pruebas acérrimas, pero registró un respetable 7.999573 de 8 en la prueba ENT (solo Potencialmente determinista). Curiosamente, duplicar el número de hilos lo empeoró.