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 therand
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 callrand
. (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
- C++ Standard Library Defect Report List, #395 inconsistencies in the definitions of rand() and random_shuffle()