3

このコードを実行すると、forループがハングするだけですが、その理由を説明できますか?

#include<iostream>
#include<random>
#include<ctime>

int main()
{
    using std::cout;
    using std::endl;
    using std::cin;
    using std::mt19937;
    using std::minstd_rand;
    using std::uniform_int;
    using std::normal_distribution;

    // engines
    mt19937 rng;
    minstd_rand gen;

    // distributions
    uniform_int<int> dist(0, 37);
    normal_distribution<short> norm(4, 3);

    // initializaiton
    rng.seed(static_cast<unsigned int>(time(false)));
    gen.seed(static_cast<unsigned short>(time(false)));



    // generate numbers
    for(int i = 0; i < 10; ++i)
        std::cout << dist(rng) << "     " << norm(gen) << endl; // This is as far as this code goes

    cin.get();
    return 0;
}
4

3 に答える 3

7

std::uniform_intC++11ではありません。を使用する必要がありますstd::uniform_int_distribution。また、浮動小数点型(C ++ 11標準26.5.8.5.1)であるstd::normal_distribution<T>必要があります。T

実際、gcc> = 4.5の場合、次のようなエラーが発生するはずです。

/opt/local/include/gcc47/c++/bits/random.h: In instantiation of 'class std::normal_distribution<short int>':
my_random.cpp:21:36:   required from here
/opt/local/include/gcc47/c++/bits/random.h:1982:7: error: static assertion failed: template argument not a floating point type
于 2012-04-29T05:29:49.277 に答える
0

推測できると思います。正規分布ジェネレーターに、0..1の範囲の浮動小数点数を生成するエンジンを与えることになっています。代わりに、それは誤って整数の食事を与えられています。正規分布の一般的なアルゴリズムは、これらの数値をペアで消費し、2空間の点と見なされ、1未満でゼロに等しくないデカルトノルムを持つペアが見つかるまでループします。アルゴリズムには整数しか供給されていないので、それは決して起こりません。しかし、それは決してあきらめません。

于 2012-07-31T16:40:59.880 に答える
0

わたしにはできる。

これらの関数は、からランダムデータを取得しようとしている可能性があり/dev/random、高品質のランダムデータが利用できない場合はブロックされます。これは安価なVPSホスティングプロバイダーでは非常に一般的であることに気づきました。

編集:開発環境の詳細を共有すると、おそらく役立つでしょう。私のために働く:

  • Ubuntu 10.10
  • g ++ 4.4.5
  • ブースト1.40
  • でコンパイルg++ main.cpp -std=c++0x -o tst
于 2012-04-29T05:07:01.927 に答える