J'ai un programme qui utilise le générateur de nombres aléatoires mt19937 de boost :: random. J'ai besoin de faire un random_shuffle et je veux que les nombres aléatoires générés pour cela proviennent de cet état partagé afin qu'ils puissent être déterministes par rapport aux nombres générés précédemment par mersenne twister.Utilisation de boost :: random comme RNG pour std :: random_shuffle
J'ai essayé quelque chose comme ceci:
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);
}
mais je reçois une erreur de modèle appelant random_shuffle avec rand. Cependant cela fonctionne:
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);
}
Probablement parce que c'est un appel de fonction réel. Mais évidemment, cela ne garde pas l'état de la twister mersenne originale. Ce qui donne? Y at-il un moyen de faire ce que j'essaye de faire sans variables globales?
Une fois que vous le tester, pourriez-vous s'il vous plaît poster le bon code , pour la postérité? Merci –
Greg: J'ai inversé votre changement. Vous n'avez jamais besoin d'échapper des caractères HTML dans votre code, si vous souhaitez utiliser des blocs de code Markdown (indentez chaque ligne 4 espaces). –
Sélectionnez le code et cliquez sur le bouton "010 101". –