2011-12-05 10 views
6

Quando stiamo usando un generatore di numeri casuali in C#, siamo in grado di definire una variabile comeC++ equivalente di new Random (seme) in C#

private Random _rndGenerator; 

in una classe e quindi chiamare

_rndGenerator = new Random(seed); 

correttamente nel costruttore della classe.

La mia domanda è:

Che cosa è un C++ equivalente di tale definizione (vale a dire un RNG in una classe). Penso che non sia un approccio corretto per usare

srand((unsigned int)seed); 

giusto?

risposta

14

C++ 11 dispone di funzionalità di generazione di numeri casuali molto più potenti. Ecco un esempio:

#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; 
} 

Ci sono molti modi per ottenere i semi. <random> fornisce un potenziale accesso ad alcune entropia hardware con la classe std::random_device, che è possibile utilizzare per seminare i propri PRNG.

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

E se non si utilizza un set di strumenti C++ 11, c'è [Boost.Random] (http://www.boost.org/libs/random/), che la libreria casuale C++ 11 era liberamente basato su. In ogni caso, per favore, non usare 'rand'. – ildjarn

+0

Ben scritto! :-) –

+0

'rng_type :: result_type' dovrebbe probabilmente essere' engine_type :: result_type' – MSalters

1

C++ ha un generatore di numeri casuali globale incorporato. Se vuoi seminare, allora srand((unsigned int)seed) è la strada da percorrere. Questo non è esattamente la stessa cosa del codice C# che hai mostrato, però. Quando scrivi:

Random _rndGenerator = new Random(seed); 

Si ottiene un'istanza di generatore di numeri casuali separati. Quindi puoi avere più generatori di numeri casuali nel tuo programma. Per quanto ne so, la libreria C++ non ha un costrutto simile, anche se sembra che lo faccia C++ 11.

In breve, srand((unsigned int)seed) è corretto se si utilizzano versioni precedenti di C++ o se si desidera un solo RNG nel programma. Se hai bisogno di più RNG, usa C++ 11 o fai i tuoi.