rand_r(), seed time
-
Hallo Kollegen,
wollte mal wieder eine Zufallszahl anlegen. Nachdem rand() nicht Thread-Safe ist wollte ich einfach mal rand_r() nehmen.
Jedoch rand_r ist so definiert: int rand_r(unsigned int *seed)
Seed wollte ich dann mit der Zeit koppeln, jedoch schmeißt der Compiler um sich.time_t t; unsigned int seed = 0; seed = (unsigned int)(time(&t));
Die erste Zeile habe ich deshalb angelegt, da der Comiler meint dass der Wert nicht konstant sei. Sollte er auch nicht, da sonst immer die selben Zufallszahlen herauskommen.
Dies ist dann die Ausgabe bzw sollte sie sein
int rand_val = rand_r(&seed) %50+1; printf("Zufallszahlen: %i\n ", rand_val);
Kann einer von Euch bitte helfen?
MfG
Luis
-
Warum nimmst du nicht time(NULL); ?
unsigned int seed; int rand_val; seed = (unsigned int)(time(NULL)); rand_val = rand_r(&seed) %50+1; printf("Zufallszahlen: %i\n ", rand_val);
-
Wenn du bessere Zufallszahlen haben willst, dann benutze unter Linux /dev/random bzw. dev/urandom. Kannst du wie eine Datei auslesen...
-
DirkB schrieb:
Warum nimmst du nicht time(NULL); ?
unsigned int seed; int rand_val; seed = (unsigned int)(time(NULL)); rand_val = rand_r(&seed) %50+1; printf("Zufallszahlen: %i\n ", rand_val);
meinst du unsigned int seed = time(NULL) ?
Dann kommt der Kompiler mit folgender Fehlermeldung:
intializer element is not constant.
-
Wo hast du denn das
unsigned int seed = time(NULL);
hingeschrieben?
Vor main() oder in main()?Vor main() geht es nicht, du kannst einer globalen Variablen kein Funktionsergebnis zuweisen.
Zudem sollte auch jeder Thread sein eigenen seed haben, sonst kannst du auch gleich wieder
rand()
nehmen.
-
DirkB schrieb:
Wo hast du denn das
unsigned int seed = time(NULL);
hingeschrieben?
Vor main() oder in main()?Vor main() geht es nicht, du kannst einer globalen Variablen kein Funktionsergebnis zuweisen.
Zudem sollte auch jeder Thread sein eigenen seed haben, sonst kannst du auch gleich wieder
rand()
nehmen.Jep, da liegt mein Fehler.
Also ich habe es probiert vor main, geht nicht.
In der Funktion welche von pthread_create aufgerufen wurde, ergibt immer die
selbe Zufallszahl.
Sollte man dies also im main machen und dann als Argument von pthread_create übergeben?Danke
MfG
Luis
-
s.luis schrieb:
In der Funktion welche von pthread_create aufgerufen wurde, ergibt immer die
selbe Zufallszahl.Das wird daran liegen, dass das innerhalb einer Sekunde aufgerufen wird.
Denn time() liefert nur jede Sekunde einen neuen Wert.Du brauchst also einen anderen Mechanismus für den seed als
time(NULL)
.Ob die PID sich bei threads ändert weiß ich jetzt nicht.
Sonst kannst du ja auch den seed für rand_r() mit rand():seed = (unsigned int)(rand);
bestimmen.
Verwurste die Adresse von seed:seed = (unsigned int)(&seed);
Oder eine Kombination aus allen.s.luis schrieb:
Sollte man dies also im main machen und dann als Argument von pthread_create übergeben?
Möglich, dann solltest du aber den seed trotzdem noch verändern.
seed = time(NULL) + threadnummer*irgendeinezahl;
Mit irgendeinezahl > 10, damit du nicht beim Sekundenwechsel doch noch gleiche Zufallszahlen bekommst.
-
DirkB schrieb:
s.luis schrieb:
In der Funktion welche von pthread_create aufgerufen wurde, ergibt immer die
selbe Zufallszahl.Das wird daran liegen, dass das innerhalb einer Sekunde aufgerufen wird.
Denn time() liefert nur jede Sekunde einen neuen Wert.Du brauchst also einen anderen Mechanismus für den seed als
time(NULL)
.Ob die PID sich bei threads ändert weiß ich jetzt nicht.
Sonst kannst du ja auch den seed für rand_r() mit rand():seed = (unsigned int)(rand);
bestimmen.
Verwurste die Adresse von seed:seed = (unsigned int)(&seed);
Oder eine Kombination aus allen.Genau hier liegt die schon länger gesuchte Lösung. Ich muss einfach mein seed besser setzten damit nicht jeder Thread, der zwar extra die Funktion aufruf, aber halt im selben Zeitintervall, das selbe liefert.
Dank dir