15

C++ で乱数を取得しようとしていますが、rand(). これはcpplintが言うことです:

スレッドの安全性を向上させるためrand_r(...)に、代わりに使用することを検討してください。rand(...)

私はに切り替えていますがrand_r、これはcppcheck の言うことです:

古い関数 'rand_r' が呼び出されました。代わりに関数「ran​​d」を使用することをお勧めします。

誰が正しいですか?

4

2 に答える 2

14

両方、どちらかというと。

このrand()関数は C 標準で定義されており、1989/1990 の最初の標準から使用されています。これは、参照により C++ 標準に含まれています。rand()状態に依存するため、スレッドセーフではありません。

このrand_r()関数は、 のスレッドセーフな代替手段として設計されましたrand()。ISO C または C++ 標準では定義されていません。POSIX.1-2001 で定義されていましたが、POSIX.1-2008 で廃止されました (つまり、POSIX 標準ではまだ定義されていますが、将来のバージョンでは削除される可能性があります)。

の実装rand()、したがって の実装はrand_r()低品質になる可能性があります。はるかに優れた疑似乱数ジェネレーターがあります。C++ の場合、<random>ライブラリは C++11 で追加され、さまざまなオプションを提供します。

最大限の移植性必要で、生成された数値の品質や予測可能性をあまり気にせずスレッド セーフが問題にならない場合は、srand()andを使用できますrand()。それ以外の場合、C++11 実装が利用可能な場合は、<random>ヘッダーで定義された機能を使用します。それ以外の場合は、他の疑似乱数ジェネレーターについてシステムのドキュメントを参照してください。

参照: cppreference.comPOSIX<random>

于 2015-03-19T00:54:52.833 に答える
1

<random>C++11 のものを使用します。

STL によって有害と見なされる rand()を監視する

于 2015-11-14T21:03:00.070 に答える