4

C++11のランダムシャッフルの仕様を見ると、3つの関数があります。私の質問は、の典型的な用途と利点は何ですか:

template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );

に比べ:

template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );

つまり、URNG (一様分布) が何であれ、結果は (統計的な観点から) 同じになるようです。私が見る唯一のポイントは、それstd::shuffleが広告セーフであるのに対し、このオーバーロードはそうでstd::random_shuffleはないということです。それを確認していただけますか?

編集: URNG は統一されたディストリビューションであるべきだと思っていましたが、コンパイルされていないようです。それで、誰かがの使用の小さな例を提供できますstd::shuffleか?

4

1 に答える 1

2

コメントで述べたように、乱数分布ではなく、乱数std::shuffleジェネレーター(または標準的なエンジン) を使用します。乱数発生器が異なれば、理論的には均一な分布であっても、異なる特性を持っています。

  • 乱数または疑似乱数- 真の乱数ジェネレーターは、ある種の外部エントロピー ソースを使用します。疑似乱数発生器 (PRNG) は厳密に決定論的です。
  • パフォーマンス- 一部のジェネレーターは他のジェネレーターよりも高速です。
  • メモリ使用量- 一部の PRNG は、他のものよりも状態を保存するために多くのメモリを必要とします。
  • 期間の長さ- すべての PRNG には有限の期間があり、その後、同じシーケンスを最初から繰り返し始めます。他の人よりもはるかに長い期間を持つ人もいます。
  • ランダム性の品質-疑似ランダム ストリームに微妙な (またはそれほど微妙ではない!) パターンがあるかどうかを測定するための多数のテストがあります。たとえば、ダイハード テストを参照してください。
  • ストリームが暗号的に安全かどうか。私の知る限り、標準のPRNGはありません。

標準で提供されるさまざまな発生器の概要については、 http://en.cppreference.com/w/cpp/numeric/randomを参照してください。

于 2013-07-19T08:17:30.140 に答える