2017-01-03 14 views
1

uniform_real_distribution右端は含まれていません。これは、E = 0の乱数を生成することは正しい方法ではないことを意味します。開いている間隔または閉じた間隔のどちらかで、半開きではなくuniform_real_distributionを作成するにはどうすればよいですか?E = 0の浮動小数点乱数を生成

負の値への偏りは問題ではないと主張できますが、その差は小さいためですが、それでも完全には正しくありません。

+0

cpp/numeric/random/uniform_real_distribution/uniform_real_distribution)ので、浮動小数点のすべての機能を心に留める必要はありません。 –

+0

@mkluweどのように私はそれを逃すことができます – user877329

答えて

4

あなたはstd::nextafterstd::uniform_real_distributionを組み合わせることができます

template <typename RealType = double> 
auto make_closed_real_distribution(RealType a = 0.0, RealType b = 1.0) { 
    return std::uniform_real_distribution<RealType>(
     a, std::nextafter(b, std::numeric_limits<RealType>::max())); 
} 

検索のビットの後、これは実際にen.cppreferenceに提案された方法です。

あなたはオープン間隔を作りたい場合は、単に最初の引数にnextafter()を使用します。それはさえ[関連ドキュメント](http://en.cppreference.com/で述べています@mkluwe

template <typename RealType = double> 
auto make_open_real_distribution(RealType a = 0.0, RealType b = 1.0) { 
    return std::uniform_real_distribution<RealType>(
     std::nextafter(a, std::numeric_limits<RealType>::max()), b); 
} 
+0

今* *巧妙なトリック、浮動小数点数の興味深いプロパティを表示する良い方法です。 – mkluwe

+0

2番目の例では、それは 'std :: numeric_limits :: max()'であってはなりませんか? – Quentin

+0

@Quentin下限を除外したいので、更新された回答に感謝します。 – Holt

関連する問題