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

KnightRider1519

Cadet 1st Year
Registriert
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:
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.
 
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.
 
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
 
Hallo, danke für die schnellen Antworten!
Habe den Seed direkt am Anfang des Programms gesetzt und seitdem kommen unterschiedliche Zahlen raus!
Vielen Dank!
 
wobei sich random_device in erster Linie zum Seeden des Mersenne-Twisters eignet:
Code:
std::random_device rd;
std::mt19937 mt(rd());
 
KnightRider1519 schrieb:
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;
}
 
VikingGe schrieb:
Aber damit bekommt er doch auch mit jedem Programmstart dieselbe Zahlenfolge.

Ja, für Debugging unabdingbar ;)

Aber Du hast schon recht, das ist ein semi-random generator und kein pseudo-random generator. Manchmal ist es aber genau das, was man braucht.
 
Zurück
Oben