Ich habe ein Programm, das den Zufallszahlengenerator mt19937 aus boost::random verwendet. Ich muss einen random_shuffle durchführen und möchte, dass die dafür generierten Zufallszahlen aus diesem gemeinsamen Zustand stammen, damit sie in Bezug auf die zuvor generierten Zahlen des Mersenne-Twisters deterministisch sein können.
Ich habe etwas Ähnliches versucht:
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
struct bar {
boost::mt19937 &_state;
unsigned operator()(unsigned i) {
boost::uniform_int<> rng(0, i - 1);
return rng(_state);
}
bar(boost::mt19937 &state) : _state(state) {}
} rand(state);
std::random_shuffle(vec.begin(), vec.end(), rand);
}
Aber ich bekomme eine Vorlage Fehler Aufruf random_shuffle mit Rand. Dies funktioniert jedoch:
unsigned bar(unsigned i)
{
boost::mt19937 no_state;
boost::uniform_int<> rng(0, i - 1);
return rng(no_state);
}
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
std::random_shuffle(vec.begin(), vec.end(), bar);
}
Wahrscheinlich, weil es sich um einen tatsächlichen Funktionsaufruf handelt. Aber offensichtlich wird der Zustand des ursprünglichen Mersenne-Twisters nicht beibehalten. Woran liegt das? Gibt es eine Möglichkeit, das zu tun, was ich versuche, ohne globale Variablen zu tun?
0 Stimmen
Könnten Sie bitte den korrekten Code für die Nachwelt posten, sobald Sie ihn getestet haben? Danke
0 Stimmen
Greg: Ich habe deine Änderung rückgängig gemacht. Sie müssen keine HTML-Zeichen in Ihrem Code auslassen, wenn Sie bereit sind, Markdown-Codeblöcke zu verwenden (jede Zeile 4 Leerzeichen einrücken).
0 Stimmen
Markieren Sie einfach den Code, und klicken Sie auf die Schaltfläche "010 101".
0 Stimmen
Robert: stackoverflow.com/questions/147391#147438