Random

Problem: multi thread
Nur der erste thread der auf die irand Funktion zugreift bekommt random Werte.
Ab dem zweiten thread erzeugt er identische Zahlenfolgen, offensichtlich weil die Initialisierung nicht thread übergreifend funktioniert, sprich ab dem zweiten thread rand() automatisch mit 1 initialisiert wird.
Warum liest du denn nicht einfach mal die Dokumentation? http://linux.die.net/man/3/rand
Ich müsste also die Initialisierung in jedem thread neu machen, was aber wieder bedeutet, werden 2 threads gleichzeitig gestartet, habe ich auch wieder identische Zahlenfolgen.
Dadurch das es nur einen Zufallszahlengenerator gibt, müßtest du den Zugriff auf diese Resource lediglich synchronisieren - oder z.B. die rand_r() Funktion verwenden, da diese threadsicher ist. Siehe DOKU.

Gruß

PS: Willst du wirklich Zahlen von 0 bis 6 genieren? Für ein Würfelspiel sollte das wohl eher 1 bis 6 sein, oder?
 
@langer
time(0) initialisiert den Generator mit der Uhrzeit, das sind (selbst wenn es Millisekunden sind) bei QuadCore mit 3Ghz theoretisch bis zu 12000 CPU Durchläufe, da kann man zur Not auch 100 threads starten.

@deepthroat
Ich habe mich durchaus am Lesen versucht, aber nach

"The function rand_r() is supplied with a pointer to an unsigned int, to be used as state. This is a very small amount of state, so this function will be a weak pseudo-random generator"

fand ich es nicht unbedingt wert das weiter zu verfolgen, sondern bin bei http://linux.die.net/man/3/drand48_r gelandet, was angeblich besser ist.
Nur ist die Beschreibung dazu arg kurz und für meine bescheidenen Kenntnisse sieht das aus wie chinesisch.
Als ich dann noch unten drunter gelesen habe

"These functions are GNU extensions and are not portable."

wusste ich nicht mehr weiter.
Stattdessen habe ich mich also an den Rat von devDevil gehalten (der ist mir offensichtlich um einiges voraus an Kenntnissen), aber sein Code brachte halt auch keinen Erfolg.

Ich weiss ja, 1 + ( 6 * ....) muss es heissen, aber für einen ersten Test musste es so genau nicht sein.
 
Zuletzt bearbeitet:
Zurück