2015-04-21 16 views
5

È legale in C++ di scrivere:Sta usando std :: time con std :: srand codice valido?

std::srand(std::time(nullptr)); 

o questo comportamento indefinito rendimento?


std::time restituisce una std::time_t che è un tipo aritmetico, ma a parte questo non specificato. Dalla mia comprensione, il tipo aritmetico è uno qualsiasi dei tipi in virgola mobile, intero e carattere.

std::srand prende uno unsigned int come valore di inizializzazione.

Pertanto, penserei che non è possibile eseguire rigorosamente questa conversione. Ho letto che su sistemi conformi a POSIX che std::time_t è integrale ed è il numero di secondi da 00:00, 1 gennaio 1970 UTC. In questo caso, la conversione può comportare la conversione da firmato a non firmato, che è una conversione definita dall'implementazione, ma dovrebbe essere OK, e da un integrale più grande a un tipo integrale più piccolo che va bene anche per il seme.

+0

Un tipo aritmetico può essere convertito in un 'unsigned int' utilizzando una o più regole di conversione standard. –

+0

Considerando che 'rand' è in procinto di essere deprecato a favore della nuova intestazione' ', non perderò il sonno. –

risposta

4

È corretto, time_t può essere un tipo a virgola mobile e se il risultato del troncamento del valore non è rappresentabile come unsigned int, il comportamento non è definito ([conv.fpint]/1).

Se si desidera generare numeri casuali in modo conforme alla norma, suggerisco le strutture C++ 11 <random>. È possibile seminare gli RNG da std::random_device. Vedi, , ad esempio,https://stackoverflow.com/a/19666713/481267

Problemi correlati