std::default_random_engine erzeugt die gleichen Werte, die auch bei wechselnden seed?
Ich versuche zu implementieren eine Klasse, die dient als eine Art wrapper für die random-Bibliothek, so kann ich mit seinen Objekten und Funktionen, die in (glaube ich) eine mehr intuitive Art und Weise an anderer Stelle in meinem code.
In meinem Kopf-ich habe so etwas wie dieses:
class RandomDevice{
private:
unsigned long rand_seed;
default_random_engine engine;
public:
RandomDevice(unsigned long n);
int randInt(int min, int max);};
Und dann in der .cpp-Datei, die ich implementieren Sie die zwei Funktionen (Konstruktor und randInt) etwa so:
RandomDevice::RandomDevice(unsigned long n){
rand_seed = n;
default_random_engine engine;
engine.seed(n);
}
int RandomDevice::randInt(int min, int max){
uniform_int_distribution<int> distribution(min, max);
return distribution(engine);
}
Schließlich in meinem main.cpp ich Teste diese Funktionen wie diese:
int main(){
unsigned long seed = 1;
RandomDevice my_rand(seed);
cout << "random integer: " << my_rand.randInt(0, 10) << endl;
}
Das problem ist, egal was ich einstelle der Samen in main.cpp ich bekomme immer die gleichen Werte für meine Zufallszahlen (nicht nur randInt habe ich auch andere Distributionen). Ich habe auch versucht die Einstellung Saatgut zu Zeit(NULL), aber das gleiche problem tritt auf.
Ich bin wirklich meinen Kopf kratzen an dieser. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist das seeding der lokalen
engine
, der zerstört am Ende des Konstruktors, der nicht die Klasseengine
..., die endet als Standard gebaut.Verwenden Sie die member-Initialisierungsliste statt:
default_random_engine new_engine;
engine = new_engine;
engine.seed(n);
funktionierte perfekt. Danke!Versuchen Sie es mit std::chrono zu ernähren, den Samen in jeder iteration oder bei jedem Aufruf. Ich denke, seeding Zeit Momente geben würde, am besten Zufälligkeit, da jeder Zeitpunkt ist ein einmalige Samen, ohne irgendwelche Wiederholungen. Ich würde Folgendes tun:
In Ihre Konstruktion-Funktion, die neue erstellte lokale
engine
Masken Ihre private Klasse memeberengine
.Einfach löschen 2. Zeile Ihr
RandomDevice::RandomDevice()
, werden Sie in Ordnung sein.Wie diese.
oder mit Mitglied intialize Liste wie @T. C. sagte,