2017-03-08 2 views
4

C++標準では、std::generate_canonicalのテンプレート機能(C++コードではなく、擬似コードのみを表示します)が[rand.util.canonical]の下でかなり厳密に指定されています。generate_canonical出力はプラットフォーム間で一貫していますか?

ですがstd::generate_canonicalが同様に同じ出力を与えること、異なるプラットフォーム上でRealTypeの数学は同じように機能仕様の作者の意図であり、2つのプラットフォームで同じ出力を与える決定論URNGのため?

この

Is 1.0 a valid output from std::generate_canonical?のように同様の質問に関連している - 散文は1.0が除外されていると述べているが、彼らは擬似コードに与えるアルゴリズムは、時には、出力として、および RealTypeURNGのいくつかの組み合わせのためにそれを含んでいます。

これは、例えばC++11 random number distributions are not consistent across platforms -- what alternatives are there?として説明されている乱数分布関数とは対照的です。標準はどのようにして正規分布がどのように生成されるのかを指定するのではなく、そのプロパティだけを指定する。

これは議論の対象となっていないDRを見つけられておらず、標準の言い回しはC++ 11、C++ 14、C++ 17のドラフト標準私は簡単にアクセスできます。

答えて

1

リンクされた質問で遭遇する困難は、一貫性に関する基本的問題:丸めモードを指します。標準のgenerate_canonicalの数学的な定義の明確な意図は、URNGが複数回呼び出され、それぞれが結果を満たすためにエントロピーの非重複ブロックを生成することです。プラットフォーム間で完全に一貫しています。問題は、LSB以下の余分なビットをどうすればよいかについての指示がないことです。丸めモードと加算順序によっては、これらは上に丸められ、次のブロックに流出することができます(これは1.0の結果を可能にします)。

ここで、正確な表現は、「インスタンス化の結果...は、以下で指定されたようにできるだけ均一に分散されています」です。丸めモードが最も近い丸めである場合、1.0を生成する実装は、でなく、ではありません(1-epsは1-2 * epsより少ない可能性があるため)。しかしそれはまだ「以下のように指定されている」。したがって、その文をどのように構文解析するかに応じて、generate_canonicalは完全に指定され、一貫しているか、またはいくつか余分な議論されていないビットを実装に委譲しています。

いずれの場合でも、特定の実装で1.0が生成されるという事実は、現在の動作がプラットフォーム間で一貫性がないことを明確に示しています。必要ならば、independent_bits_engineにあなたのURNGをラップして、bitsビットのいくつかの要素を生成することが最も簡単なアプローチのように思えるので、何も丸められません。

関連する問題