C.
Kompilieren Sie mit dem Flag -pthread (oder was auch immer Ihr Compiler verwendet).
#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;
}
Ich bin mir nicht sicher, ob dies aufgrund des Standards "Zeit ist nicht zulässig" qualifiziert ist oder nicht, da der Scheduler im Grunde genommen als Entropiequelle verwendet wird, indem die Thread-Sicherheit absichtlich ignoriert wird. Es funktioniert mit einer ziemlich einfachen Pseudozufallsfunktion ( Lehmer-Zufallszahlengenerator ) mit einem hartcodierten Anfangssamen. Anschließend werden 20 Threads gestartet, die alle die Lehmer-Berechnung mit einem gemeinsamen Satz von Variablen ausführen.
Scheint ziemlich gut zu funktionieren, hier sind ein paar aufeinanderfolgende Läufe:
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:
Hab mir ein bisschen mehr Gedanken gemacht und festgestellt, dass dies überhaupt nicht zeitbasiert ist. Selbst mit einem vollständig deterministischen Scheduler kommt die Entropie nicht aus den Zeitscheiben, sondern aus dem Laden aller laufenden Prozesse auf dem System.
BEARBEITEN 2
Nachdem ich mich von @Quincunx inspirieren ließ, eine Glockenkurve zu veröffentlichen, habe ich 12 MB Zufälligkeit in eine Datei kopiert und auf CAcert hochgeladen . Es hat alle eingefleischten Tests nicht bestanden, aber beim HNO-Test respektable 7,999573 von 8 erreicht (nur potenziell deterministisch). Seltsamerweise machte es die Verdoppelung der Fadenzahl noch schlimmer.