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?

string PullOne()
{
    string pick;
    string choices[3] = {"BAR", "7", "cherries"};

    std::srand(time(0));
    pick = choices[(std::rand() % 3)];
    return pick;
}

Aus meiner Hauptfunktion:

string pull_1, pull_2, pull_3;
pull_1 = PullOne();
pull_2 = PullOne();
pull_3 = PullOne();

  • 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

rand gibt dieselben Werte zuruck wenn es innerhalb einer einzelnen
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

rand gibt dieselben Werte zuruck wenn es innerhalb einer einzelnen
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 srand Einmal 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.

rand gibt dieselben Werte zuruck wenn es innerhalb einer einzelnen
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().

989700cookie-checkrand() gibt dieselben Werte zurück, wenn es innerhalb einer einzelnen Funktion aufgerufen wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy