Sto appena iniziando a usare l'intestazione <random>
di C++ 11 per la prima volta, ma ci sono ancora alcune cose che sembrano un po 'misteriose. Questa domanda riguarda il modo inteso, idiomatico e best-practice per svolgere un compito molto semplice.Utilizzando l'intestazione <random> di C++ 11, qual è il modo corretto per ottenere un numero intero compreso tra 0 e n?
Attualmente, in una parte del mio codice ho qualcosa di simile:
std::default_random_engine eng {std::random_device{}()};
std::uniform_int_distribution<> random_up_to_A {0, A};
std::uniform_int_distribution<> random_up_to_B {0, B};
std::uniform_int_distribution<> random_up_to_some_other_constant {0, some_other_constant};
e poi quando voglio un intero compreso tra 0 e B chiamo random_up_to_B(eng)
.
Poiché questo sta iniziando a sembrare un po 'sciocco, voglio implementare una funzione rnd
tale che rnd(n, eng)
restituisca un numero casuale compreso tra 0 e n.
qualcosa come il seguente dovrebbe funzionare
template <class URNG>
int rnd(int n, URNG &eng) {
std::uniform_int_distribution<> dist {0, n};
return dist(eng);
}
ma che comporta la creazione di un nuovo oggetto di distribuzione ogni volta, e ho l'impressione che non è il modo in cui si suppone di farlo.
Quindi la mia domanda è: qual è il modo migliore e più pratico per eseguire questo semplice compito, utilizzando le astrazioni fornite dall'intestazione <random>
? Lo chiedo perché sono costretto a voler fare cose molto più complicate di questo in seguito, e voglio assicurarmi che sto usando questo sistema nel modo giusto.
Hai qualche indicazione che la creazione di un 'uniform_int_distribution' è costosa? Sospetto che non lo sia.Potresti trovare delle indicazioni nella documentazione di 'boost' che era la genesi di' random'. –
@MarkRansom Immagino che la creazione di un nuovo 'uniform_int_distribution' possa essere inline e non abbia alcun costo. Ma per altre distribuzioni questo potrebbe non essere il caso, dal momento che l'implementazione potrebbe dover memorizzare lo stato. La questione non è tanto l'implementazione di questa specifica cosa, quanto la comprensione di come '' sia destinato ad essere usato in generale. –
Nathaniel
Le distribuzioni sono progettate per essere economiche da costruire. È il motore casuale che è costoso. –