2011-12-05 13 views
6

Cuando estamos utilizando un generador de números aleatorios en C#, podemos definir una variable comoC++ de nuevo Random (semilla) en C#

private Random _rndGenerator; 

en una clase y luego llamar

_rndGenerator = new Random(seed); 

correctamente en el constructor de la clase.

Mi pregunta es:

¿Qué es un equivalente de C++ de tal definición (es decir, un generador de números aleatorios en una clase). Creo que no es un enfoque correcto para usar

srand((unsigned int)seed); 

¿verdad?

Respuesta

14

C++ 11 tiene instalaciones de generación de números aleatorios mucho más potentes. Aquí hay un ejemplo:

#include <random> 
#include <functional> 

std::size_t get_seed(); // whatever is the preferred way of obtaining a seed 

typedef std::mt19937 engine_type; // a Mersenne twister engine 
std::uniform_int_distribution<engine_type::result_type> udist(0, 200); 

engine_type engine; 

int main() 
{ 
    // seed rng first: 
    engine_type::result_type const seedval = get_seed(); 
    engine.seed(seedval); 

    // bind the engine and the distribution 
    auto rng = std::bind(udist, engine); 

    // generate a random number 
    auto random_number = rng(); 

    return random_number; 
} 

Hay muchas formas de obtener semillas. <random> proporciona acceso potencial a algo de entropía de hardware con la clase std::random_device, que puede usar para inicializar sus PRNG.

std::size_t get_seed() { 
    std::random_device entropy; 
    return entropy(); 
} 
+2

Y si no está utilizando un conjunto de herramientas C++ 11, hay [Boost.Random] (http://www.boost.org/libs/random/), que la biblioteca aleatoria de C++ 11 estaba suelta Residencia en. En cualquier caso, _por favor_, no use 'rand'. – ildjarn

+0

¡Bien escrito! :-) –

+0

'rng_type :: result_type' probablemente debería ser' engine_type :: result_type' – MSalters

1

C++ tiene un generador de números aleatorios global incorporado. Si desea sembrar, entonces srand((unsigned int)seed) es el camino a seguir. Sin embargo, esto no es exactamente lo mismo que el código C# que mostró. Cuando escriba:

Random _rndGenerator = new Random(seed); 

Se obtiene una instancia de generador de números aleatorios por separado. Entonces puede tener múltiples generadores de números aleatorios en su programa. Que yo sepa, la biblioteca C++ no tiene tal construcción, aunque parece que C++ 11 sí.

En resumen, srand((unsigned int)seed) es correcto si está usando versiones anteriores de C++, o si solo quiere un RNG en su programa. Si necesita varios RNG, utilice C++ 11 o haga los suyos propios.

Cuestiones relacionadas