Tengo un programa que usa el generador de números aleatorios mt19937 de boost :: random. Necesito hacer un random_shuffle y quiero que los números aleatorios generados para esto sean de este estado compartido para que puedan ser determinísticos con respecto a los números previamente generados por Twister Twister.Uso de boost :: random como el RNG para std :: random_shuffle
que hemos probado algo como esto:
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);
}
pero me da un error de plantilla llamando random_shuffle con rand. Sin embargo esto funciona:
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);
}
Probablemente porque es una llamada de función real. Pero obviamente esto no mantiene el estado del twister original de mersenne. ¿Lo que da? ¿Hay alguna manera de hacer lo que estoy tratando de hacer sin las variables globales?
Una vez que probarlo, ¿podría publicar el código correcto , para la posteridad? Gracias –
Greg: he revertido su cambio. Nunca tendrá que escapar caracteres HTML en su código, si está dispuesto a usar bloques de código Markdown (sangría cada línea 4 espacios). –
Simplemente resalte el código y haga clic en el botón "010 101". –