C++ Random gibt immer wieder die selbe Zahlenkombination aus.

KnightRider1519

Cadet 1st Year
Dabei seit
Nov. 2015
Beiträge
8
Hallo,
ich bin neu hier im Forum und hoffe, dass ich den Thread richtig erstellt habe :D
Im Internet habe ich bereits nach dem Problem gesucht, aber alle Lösungsvorschläge haben nicht funktioniert.
Code:
int berechneZufall(string s){
    srand(time(0));
    int zufallszahl = (rand()%5)+1;
    int berechneZufall = zufallszahl;
    cout << s;
    return berechneZufall;
}
Diese Funktion gibt immer wieder die selbe Kombination aus, also z.B. 3333, 1111, 0000 usw.
Die Funktion wird 4 mal abgerufen:
Code:
    int a = berechneZufall(" .\n");
    int b = berechneZufall(" ..\n");
    int c = berechneZufall(" ...\n");
    int d = berechneZufall(" ....\n");
Kann mir jemand vielleicht weiterhelfen?
Vielen Dank schonmal!

PS: Ich sollte noch hinzufügen, dass ich ein totaler Anfänger im programmieren bin :D
 
Zuletzt bearbeitet:

goldmomo

Ensign
Dabei seit
Sep. 2013
Beiträge
135
Du setzt mit srand den seed immer auf die aktuelle Zeit (in Sekunden), dadurch wird dir rand immer den selben Wert zurückliefen (siehe Pseudozufallszahlen) bis eine Sekunde vergangen ist :)

Setze den seed einfach (einmal) am Anfang des Programms, dann sollte es funktionieren.
 

stage

Lieutenant
Dabei seit
Aug. 2012
Beiträge
591
Eine Pseudozufallsgenerator ist nichts anderes als eine mathematische Funktion. Sprich es gibt einen Eingangswert (Seed) und daraus berechnet die Zufallsfunktion einen Ausgangswert (Zufallszahl).

Bedeutet wenn der Eingangswert immer der selbe ist dann ist auch der Ausgangswert immer der selbe.
Du initialisierst die Zufallsfunktion mit srand(time(0)). Also mit einem Zeitstempel in Sekunden gemessen.

Da die Funktion aber so schnell hintereinander aufgerufen wird, ändert sich nichts an dem Zeitstempel, also wird auch immer die selbe Zufallszahl generiert.

Wie kannst du das besser machen? Es gibt mehrere Möglichkeiten.
Initialisiere die Zufallsfunktion nur einmal. Oder verwende jedesmal einen anderen Seed.
 

Martem

Cadet 4th Year
Dabei seit
Juni 2011
Beiträge
89
Hi,

du solltest srand(time(0)); aus deiner Zufallszahlenfunktion herrauslösen und nur einmalig in der main aufrufen,

heutige CPU sind so schnell, das sie sehr viele Zufallszahlen pro Sekunde erzeugen könnten, so das in deinem Fall warscheinlich die Function so schnell wieder aufgerufen wird, das der Initialwert immer der selbe ist.

mit anderen Worten die time(0) function gibt immer den selben wert an srand() zurück, weil einfach dein Rechner zu schnell ist, deshalb srand(time(0)) nur einmalig zum Programmstart aufrufen.

mfg
 

KnightRider1519

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Nov. 2015
Beiträge
8
Hallo, danke für die schnellen Antworten!
Habe den Seed direkt am Anfang des Programms gesetzt und seitdem kommen unterschiedliche Zahlen raus!
Vielen Dank!
 
V

VikingGe

Gast
wobei sich random_device in erster Linie zum Seeden des Mersenne-Twisters eignet:
Code:
std::random_device rd;
std::mt19937 mt(rd());
 

blöderidiot

Captain
Dabei seit
Juni 2004
Beiträge
3.346
Habe den Seed direkt am Anfang des Programms gesetzt und seitdem kommen unterschiedliche Zahlen raus!
Du kannst auch eine Gleitkomma-"Eigenbau-Zufallsfunktion" verwenden, die ohne "seed" auskommt, weil die Periode (die "sehr lang" ist) beim Programmstart über statische Gleitkommawerte initialisiert wird. Hat erstaunlich gute statistische Eigenschaften (triplet/quadruplet-Korellation sehr ordentlich), wahrscheinlich besser als rand() von libc und geht von 0 ... 1 (1.0 ausgeschlossen).
double fastRNG (void)
{
static double a = 0.3022777, b = 0.2371781, c = 0.5263637;
double r = a + b + c;
while(r >= 1.0) r -= 1.0;
return a=b, b=c, c=r;
}
 

blöderidiot

Captain
Dabei seit
Juni 2004
Beiträge
3.346
Top