rand() gibt dieselben Werte zurück, wenn es innerhalb einer einzelnen Funktion aufgerufen wird
Lesezeit: 2 Minuten
Ich bin ein C++-Neuling und bin ratlos. Ich muss diese Funktion dreimal in meiner Hauptfunktion aufrufen, aber jedes Mal erhalte ich das gleiche Ergebnis, dh pull_1, pull_2, pull_3 sind gleich. Was muss ich tun, damit sie wirklich zufällig sind?
BTW, wenn Sie verwenden rand() % 3, führen Sie eine Verzerrung in die Ausgabe ein: zB. Werte 0, 1, 2 haben nicht die gleiche Wahrscheinlichkeit. Siehe stackoverflow.com/questions/10984974/…
– Yann Droneaud
17. Juli 2018 um 17:20 Uhr
scharfer Zahn
Du solltest nicht anrufen srand() vor jedem Aufruf an rand(). Rufen Sie es einmal auf – irgendwo zu Beginn Ihres Programms.
Das Problem besteht darin, dass Sie den Zufallsgenerator neu starten, sodass er anfängt, genau dieselbe Pseudozufallsfolge vom selben Punkt aus zu erzeugen.
Nur wenn die Funktion mehrmals in derselben Sekunde aufgerufen wird, erhalten Sie dieselben Ergebnisse.
– Yann Droneaud
17. Juli 2018 um 17:18 Uhr
Tugrul Ates
Der Zufallszahlengenerator wird bei jedem Anruf auf einen Anfangszustand zurückgesetzt, der durch den Startwert vorgegeben wird srand. Der Zeitwert kann zwischen aufeinanderfolgenden Aufrufen gleich sein timedaher wird der gleiche Startwert und die gleiche Anzahl erzeugt.
Seeding-Funktion aufrufen (srand) nur einmal in Ihrer Hauptfunktion, bevor Sie Zufallsstichproben generieren.
Warum rufst du dauernd an std::srand(time(0));? Das setzt den PRNG neu … und da dies alles innerhalb derselben Sekunde geschieht, setzen Sie ihn immer mit derselben Sequenz neu.
Anruf srandEinmal in Ihrem Programm, und nur einmal.
Außerdem würde ich zumindest auf POSIX-kompatiblen Systemen etwas wie empfehlen std::srand(time(0) ^ getpid())sodass Sie Ihr Programm innerhalb derselben “Sekunde” zweimal ausführen können und trotzdem eine neue PRNG-Sequenz erhalten.
vsekhar
Die time(0) Die Funktion hat zwischen den Funktionsaufrufen möglicherweise nicht “angekreuzt”. Sie füllen den Zufallszahlengenerator also jedes Mal mit demselben Wert, was zu identischen Werten für führt rand()
Ihr Problem ist, dass Sie den RNG jedes Mal säen, wenn Sie die Funktion aufrufen. Sie sollten dies nur einmal in einem Programm aussäen, um die besten Ergebnisse zu erzielen. Wenn Sie möchten, dass das Ergebnis von einer Ausführung des Programms zur nächsten variiert, srand basierend auf dem Ergebnis der Funktion time().
9897000cookie-checkrand() gibt dieselben Werte zurück, wenn es innerhalb einer einzelnen Funktion aufgerufen wirdyes
BTW, wenn Sie verwenden
rand() % 3
, führen Sie eine Verzerrung in die Ausgabe ein: zB. Werte 0, 1, 2 haben nicht die gleiche Wahrscheinlichkeit. Siehe stackoverflow.com/questions/10984974/…– Yann Droneaud
17. Juli 2018 um 17:20 Uhr