yohhoyの日記

技術的メモをしていきたい日記

rand関数とstd::random_shuffle関数テンプレートの関係

2014-12-04追記:std::random_shuffle関数テンプレートはC++1z(C++17)にて削除(remove)される。http://isocpp.org/blog/2014/11/updates-to-my-trip-report参照。

C++標準ライブラリが提供するstd::random_shuffle関数テンプレート*1では、その内部実装にてC標準ライブラリrand関数を呼び出す可能性がある。

C++11(JTC1/SC22/WG21 N3337) 25.3.12/p4, 26.8/p5より一部引用。

template<class RandomAccessIterator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last)
4 Remarks: To the extent that the implementation of these functions makes use of random numbers, the implementation shall use the following sources of randomness:
The underlying source of random numbers for the first form of the function is implementation-defined. An implementation may use the rand function from the standard C library.
(snip)

5 The rand function has the semantics specified in the C standard, except that the implementation may specify that particular library functions may call rand. (snip)

C標準規格では別ライブラリ関数からrand関数を呼び出すのはNGとされている。C99(JTC1/SC22/WG14 N1256) 7.20.2.1/p3より引用。

3 The implementation shall behave as if no library function calls the rand function.

大半のC++処理系ではstd::random_shuffle内部実装にrand関数を利用するにも関わらず、C++03ライブラリ仕様では特に例外事項を言及していなかったため、字義通り解釈すると規格違反となっていた。C++11ライブラリ仕様にて現状追認を明記。

関連URL

*1:本記事で対象とするのは、第3引数に乱数生成器(RNG; RandomNumberGenerator)をとらないイテレータ2引数のみのオーバーロード