C
Compile com o sinalizador -pthread (ou o que seu compilador usa).
#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;
}
Não tenho certeza se isso se qualifica ou não com base no padrão "tempo não é permitido", porque basicamente está usando o agendador como fonte de entropia, ignorando intencionalmente a segurança do encadeamento. Ele funciona usando uma função psuedo-aleatória bastante básica ( gerador de números aleatórios de Lehmer ) com uma semente inicial codificada. Em seguida, ele inicia 20 threads que executam o cálculo de Lehmer com um conjunto compartilhado de variáveis.
Parece funcionar bastante bem, eis algumas execuções 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
EDIT:
Pensei um pouco mais e percebi que isso não é baseado em tempo. Mesmo com um planejador completamente determinístico, a entropia não vem dos intervalos de tempo - vem do carregamento de todos os processos em execução no sistema.
EDIT 2
Depois de me inspirar no @Quincunx postando uma curva em sino, coloquei 12MB de aleatoriedade em um arquivo e enviei -o para o CAcert . Ele falhou em todos os testes obstinados, mas obteve um respeitável 7.999573 de 8 no teste ENT (apenas potencialmente determinístico). Curiosamente, dobrar a contagem de threads piorou.