2015-03-19 21 views
12

Sto cercando di ottenere un numero casuale in C++ e sto usando rand(). Questo è ciò che dice cpplint:Devo usare rand() o rand_s()?

considerare l'utilizzo di rand_r(...) invece di rand(...) per una maggiore sicurezza thread.

che sto passando a rand_r e questo è ciò che cppcheck dice:

obsoleto funzione 'rand_r' chiamato. Si consiglia di utilizzare la funzione 'rand' invece.

Chi ha ragione?

+5

Se possibile, utilizzare i "nuovi" '' strutture. 'rand' è piuttosto male. [Interessante] (http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful). –

risposta

11

Entrambi, più o meno.

La funzione rand() è definita dallo standard C ed è stata la prima di tale standard nel 1989/1990; è incluso per riferimento nello standard C++. Poiché rand() dipende dallo stato, non è thread-safe.

La funzione rand_r() è stata progettata come un'alternativa thread-safe a rand(). È non definito dallo standard ISO C o C++. È stato definito da POSIX.1-2001, ma contrassegnato come obsoleto da POSIX.1-2008 (il che significa che è ancora definito dallo standard POSIX, ma potrebbe essere rimosso in una versione futura).

Implementazioni di rand(), e quindi del rand_r(), può essere di bassa qualità. Esistono generatori di numeri pseudo-casuali molto migliori. Per C++, la libreria <random> è stata aggiunta in C++ 11 e offre diverse opzioni.

Se si desidera la massima portabilità e non si cura troppo della qualità o prevedibilità dei numeri generati e thread-sicurezza non è una preoccupazione, è possibile utilizzare srand() e rand(). In caso contrario, se è disponibile un'implementazione C++ 11, utilizzare le funzionalità definite nell'intestazione <random>. In caso contrario, consultare la documentazione del proprio sistema per altri generatori di numeri pseudo casuali.

Riferimenti: POSIX, <random> on cppreference.com.

+0

Potrebbe essere degno di nota che il random di C++ 11 esiste anche in Boost per coloro che non possono usare C++ 11 ma possono usare Boost. – Morwenn