gcc の実装では、これは自明に機能します。パラメータは、実際のアルゴリズムの出力の単純な乗算とシフトとしてのみ適用されます。しかし、このような特殊なケースで他のアルゴリズムに問題があることは想像できます。外部セーフガードを構築する必要がありますか、それともstd::normal_distribution
のコンストラクターに標準偏差パラメーターとして 0 を与えて、「非ランダム分布」、つまり常に平均値を生成する分布を取得しても問題ありませんか?
(性能はさておき)
gcc の実装では、これは自明に機能します。パラメータは、実際のアルゴリズムの出力の単純な乗算とシフトとしてのみ適用されます。しかし、このような特殊なケースで他のアルゴリズムに問題があることは想像できます。外部セーフガードを構築する必要がありますか、それともstd::normal_distribution
のコンストラクターに標準偏差パラメーターとして 0 を与えて、「非ランダム分布」、つまり常に平均値を生成する分布を取得しても問題ありませんか?
(性能はさておき)
標準は次のように述べています(§26.5.8.4.4):
explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Requires: 0 < stddev.
そのため、 の標準的な派生は0
、標準によって明示的に禁止されているため、動作が保証されていません。したがって、外部セーフガードを構築することは良い考えのようです
典型的な実装が 0 の標準派生で機能する場合でも (そうであるかどうかはわかりません)、そのような場合をテストし、標準派生がゼロの場合は例外をスローし、それがゼロの場合は例外をスローする実装を想像できます。そうではありません (コードが移植可能であることを保証するため)。別の方法として、コードがどこかで標準の派生によって除算される可能性があります。これは、 の派生でも問題になり0
ます。
標準偏差 0 は使用できません。標準のセクション 26.5.8.5.1 から:
explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Requires: 0 < stddev.
値 0 を使用すると未定義の動作が発生するため、その値を特殊なケースにする必要があります。
以前のライターが指摘したように、normal_distribution 関数の動作は stddev>0 に対してのみ定義されています。
これは数学的に非常に理にかなっていることを付け加えたいと思います: stddev (幅) =0 の場合、ガウス正規分布はディラック デルタ関数になります。
ディラックのデルタ関数は、定義されていない x==0 を除いて、どこでも ==0 と定義されています。ただし、積分限界内に x==0 を含むデルタ関数のすべての積分は 1 と定義され、x==0 を含まない積分は 0 と定義されます。
この動作は float/double 数の定義内では正しく表すことができないため、stddev=0 の正規分布は未定義のままにしておく必要があります。