fork() und Zufallszahlen
-
Hallo,
ich habe ein Problem mit dem Erzeugen von Kinderprozessen.
Ich hab genau 4 davon erzeugt (mit fork() ) und will nun das in jedem Kindprozess eine Zufallszahl erzeugt wird.
Dazu habe ich in jedem Kindprozess den Zufallsgenerator mitsrand ( time(NULL) );
initialisiert und mit
x= rand() % 100 + 1;
eine Zufallszahl zwischen 1 und 100 erzeugt..
Das Problem ist jetzt, das in jedem Prozess exakt die gleiche Zahl erzeugt wird??
Was mache ich falsch??
-
du hast die 4 kinder innerhalb einer sekunde gestartet. time(0) gibt die ganzen sekunden zurück.
-
danke für deine schnelle Antwort.
Du meinst, da ich die alle innerhalb einer sehr kurzen Zeit erzeugt habe, gibts bei der Initialisierung vom Random keinen unterschied?
Aber wie Löse ich denn das Problem?
-
kannst du den geforkten ein zahl mitgeben? dann könntest du hochzählen, damit jeder woanders starte. oder im haupprozess mit rand() die startwerte der kinder würfeln.
-
ich könnte die pid des prozesses verwenden, die is ja immer verschieden?
-
Hirbel001 schrieb:
ich könnte die pid des prozesses verwenden, die is ja immer verschieden?
klar.
stattsrand(time(0));
also
srand(time(0)+getpid());rand();
das einsame rand() nach srand hat den sinn, daß die ersten zufallszahlen nicht mehr aufeinanderfolgend sind. das time(0) ist nur, weil ich der zufälligkeit von getpid() nicht ausreichend traue.
-
Danke schön,
hat geklappt
-
Alternativ könntest du natürlich auch einen Wert aus /dev/random als seed lesen. Das sollte dann deutlich zufälliger sein
#include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <time.h> void seed_dev() { int fh = open("/dev/random", O_RDONLY); unsigned int seed; if(fh < 0) { seed = time(0) + getpid(); // fallback } else { read(fh, &seed, sizeof(seed)); close(fh); } srand(seed); }