std::uniform_real_distribution
には、組み込みのない浮動小数点のような型がいくつかあります。 half_float::half
またはboost::multiprecision::float128
。しかし、私が得るものは、g ++ 5.2からのホイールを改造することなく、カスタムタイプのために均一に分布するランダム実数を生成する方法は?
/opt/gcc-5.2/include/c++/5.2.0/bits/random.h:1868:7: error: static assertion failed: template argument not a floating point type
です。ここでは例のプログラムは、(g++ -std=c++11 -fext-numeric-literals test.cpp -o test
でコンパイルする)です:
#include <random>
#include <boost/multiprecision/float128.hpp>
#include <half.hpp>
template<typename Float>
void test()
{
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<Float> rnd(Float(1),Float(10));
}
int main()
{
test<float>();
test<double>();
test<long double>();
test<boost::multiprecision::float128>(); // doesn't compile
test<half_float::half>(); // doesn't compile
}
、どのように1は、このようなカスタム型のために一様に分布する乱数の実数を生成することになっていますか?車輪を再発明せずに行く方法はありますか?
1からnまで浮動し、お気に入りのフロートタイプを返す関数を定義することはどうですか?次に、デフォルトの引数として、入力としてランダムな浮動小数点数を持つ。 – lorro
@lorro float型を組み込み型から必要な型に変換する関数を意味しますか?しかし、それは流通を統一させたままにしません。 – Ruslan
私は、数学上の意味で「関数」を意味します:カスタムフロートの要素とN標準の浮動小数点の要素の間の1対1のマッピングです(浮動小数点が標準浮動小数点より小さい場合は逆もあります)。 intを使って説明する方が簡単です:擬似コード: 'int64_t getint64(int32_t a、int32_t b){return int64_t(a)<< 32 + b; } '。そのような関数は、(おそらく、最も重要なものからいくつかのビットを無視することによって)すべての型に対して作成することができます。 – lorro