Dal momento che vedo srand (time (NULL)) così diffuso (anche su questo sito), dovrebbe essere scoraggiato?
Dipende da come si desidera utilizzare l'uscita dal generatore (in questo caso, l'output di rand()
).
Se è necessaria una distribuzione uniforme per le singole sessioni del programma, allora srand(time(NULL))
va bene. Ciò sarebbe accettabile in una simulazione in cui è necessaria solo una distribuzione uniforme dei numeri rapidamente.
Se si desidera inviare un processo batch in modo che più istanze del programma vengano eseguite contemporaneamente (e che vengano effettivamente avviate contemporaneamente), quindi genererà probabilmente una o più istanze che producono lo stesso flusso casuale .
Se è necessaria un'uscita protetta, è necessario non utilizzare srand(time(NULL))
perché è spesso un generatore di linea lineare (LCG). Joan Boyar ci ha insegnato come rompere loro anni fa. Vedi Inferring sequences produced by a linear congruential generator missing low-order bits.
Per quanto riguarda il problema con time_t
, basta piegarlo per adattarlo all'argomento previsto da srand
se time_t
è troppo grande. Si potrebbe persino piegare il processo PID in modo che i lavori di simulazione batch funzionino come previsto/previsto.
Ci sono modi migliori di randomizzare, perché non usarli? –
È il meglio che puoi fare in C, o anche in C++ 98/03. C++ 11 ha aggiunto una nuova intestazione '' con nuove funzionalità di generazione di numeri casuali per migliorare la situazione in modo sostanziale. –
Mentre vero, Boost ha migliori PRNG che funzionano in C++ 98. – chris