2015-03-19 15 views
12

Próbuję uzyskać liczbę losową w C++ i używam rand(). To co cpplint mówi:Czy powinienem używać rand() lub rand_s()?

Rozważ użycie rand_r(...) zamiast rand(...) dla poprawy bezpieczeństwa wątków.

mam przełączania rand_r i to cppcheck mówi:

Przestarzałe funkcji '' rand_r nazwie. Zalecane jest użycie funkcji "rand".

Kto ma rację?

+5

Jeśli to możliwe, użyj "nowych" obiektów '. 'rand' jest całkiem zły. [Interesujące] (http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful). –

Odpowiedz

11

Obie, rodzaj.

Funkcja rand() jest zdefiniowana przez standard C i od pierwszego takiego standardu w 1989/1990; jest dołączany przez odniesienie w standardzie C++. Od rand() zależy od stanu, nie jest wątek bezpieczne.

Funkcja rand_r() została zaprojektowana jako bezpieczna dla wątków alternatywa dla rand(). Jest to , a nie określone przez normę ISO C lub C++. Został zdefiniowany przez POSIX.1-2001, ale oznaczony jako przestarzały przez POSIX.1-2008 (co oznacza, że ​​jest nadal zdefiniowany przez standard POSIX, ale może zostać usunięty w przyszłej wersji).

Implementacje rand(), a zatem rand_r(), mogą być niskiej jakości. Istnieje znacznie lepsze pseudolosowe generatory liczb. W C++ biblioteka <random> została dodana w C++ 11 i oferuje wiele różnych opcji.

Jeśli chcesz maksymalnej przenośności i nie dbają zbytnio o jakość i przewidywalność generowanych liczb i wątku bezpieczeństwa nie jest problemem, można użyć srand() i rand(). W przeciwnym razie, jeśli dostępna jest implementacja C++ 11, użyj funkcji zdefiniowanych w nagłówku <random>. W przeciwnym razie zapoznaj się z dokumentacją systemu dla innych pseudolosowych generatorów liczb.

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

+0

Warto zauważyć, że losowe C++ 11 istnieje również w Boost dla tych, którzy nie mogą używać C++ 11, ale mogą używać Boost. – Morwenn

Powiązane problemy