2016-07-24 8 views
1
zu arbeiten

ich eine Klasse erstellt MyRandom eine Matrize auf eine gleichmäßige Verteilung zu rollen, da der Bereich als Eingang:C++ - Boost: Gleiche Zufallszahl erhalten. Seeding scheint nicht

MyRandom.cpp

#include "MyRandom.h" 

MyRandom::MyRandom(){ 
    gen.seed(static_cast<unsigned int>(std::time(0))); 
} 


int MyRandom::die(int min, int max){ 

    boost::uniform_int<> dist(min, max); 
    boost::variate_generator<boost::mt19937&, boost::uniform_int<> > role(gen, dist); 
    int result = role(); 
    role.engine().seed(); 
    role.distribution().reset(); 
    return result; 
} 

main.cpp

std::cout << myRandom.die(0, 8) << std::endl; 
std::cout << myRandom.die(0, 8) << std::endl; 
std::cout << myRandom.die(0, 8) << std::endl; 
std::cout << myRandom.die(0, 8) << std::endl; 
std::cout << myRandom.die(0, 8) << std::endl; 
std::cout << myRandom.die(0, 8) << std::endl; 
std::cout << myRandom.die(0, 8) << std::endl; 

Ich bekomme immer die gleiche Nummer (außer die erste, so funktioniert mein Reset etwas). Offensichtlich säte ich das nicht richtig. Ich habe versucht, die reset() wie vorgeschlagen here ohne Erfolg hinzuzufügen. Was vermisse ich?

+2

Seed nur einmal, nicht jedes Mal, du bist eine Zufallszahl generieren. –

+0

Es hat funktioniert. Ich missverstehe die Antwort aus der verknüpften Antwort. Es löste mein Problem für die aufeinander folgenden Anrufe, aber nicht das komplette Problem, ich muss meine Frage bearbeiten. –

+0

Eigentlich habe ich es herausgefunden. Ich übergab ein Objekt MyRandom myRandom = MyRandom() nach Wert und nicht durch Verweis, was dazu führt, dass die Serie von Rollen identisch ist, weil es eine Kopie des Generators mit dem gleichen Seed war :) –

Antwort

0

Das übliche, was schief geht, ist so etwas wie diese:

std::generate_n(out_iterator, 10, my_random); 

Dies kopiert das my_random Objekt komplett mit Zustand. Gleiche kann mit Lambda-Ausdrücke vorkommen:

MyRandom my_random; 
std::generate_n(out_iterator, 10, [=] { return my_random.die(0,8); }); 

Was Sie wollen, ist der Motor durch referece passieren, entweder tun

std::generate_n(out_iterator, 10, std::ref(my_random)); 

oder

MyRandom my_random; 
std::generate_n(out_iterator, 10, [&my_random] { return my_random.die(0,8); }); 
+0

Ja, mein Seeding war falsch und ich habe es nach Wert anstatt nach Referenz weitergegeben (das ist nicht in der kleinen Probe enthalten - sollte ich es bearbeiten?) und damit habe ich identische Serien von Rollen gerollt, weil ich im Wesentlichen mit dem gleichen kopierten zufälligen Würfel beginnen würde. –

+0

Sie könnten es natürlich bearbeiten. Auf diese Weise könnte es für andere hilfreicher sein, ihr Problem anhand Ihrer Frage zu erkennen :) – sehe