4

私は C# でプログラミングを学び、C++ を学び始めました。Visual Studio 2010 IDE を使用しています。で利用可能な分布クラスで乱数を生成しようとしています<random>。たとえば、次のことを試しました。

    #include <random>
std::normal_distribution<double> *normal = new normal_distribution<double>(0.0, 0.0);
std::knuth_b *engine = new knuth_b();
std::variate_generator<knuth_b, normal_distribution<double>> *rnd;  
rnd = new variate_generator<knuth_b, normal_distribution<double>>(engine, normal);

最後の行で次のコンパイラ エラーが発生します。 normal_distribution]" は引数リストに一致します

私の議論は私には問題ないように見えますが、何が間違っていますか? ここで variate_generator クラスがインスタンス化されるとき、次の乱数を取得するためにどのメソッドを呼び出しますか?つまり、.NET の System.Random.Next()?

4

2 に答える 2

4

C ++ 0xにはvariate_generatorはありませんが、std::bindも同様に機能します。以下は、GCC4.5.2およびMSVC2010Expressでコンパイルおよび実行されます。

#include <random>
#include <functional>
#include <iostream>
int main()
{
    std::normal_distribution<> normal(10.0, 3.0); // mean 10, sigma 3
    std::random_device rd;
    std::mt19937 engine(rd()); // knuth_b fails in MSVC2010, but compiles in GCC
    std::function<double()> rnd = std::bind(normal, engine);

    std::cout << rnd() << '\n';
    std::cout << rnd() << '\n';
    std::cout << rnd() << '\n';
    std::cout << rnd() << '\n';
}

PS:newできる限り避けてください。

于 2010-09-14T16:36:12.367 に答える
2

警告: 上記のソリューションは、エンジンへの参照ではなく、エンジンのコピーをバインドすることに注意してください。したがって、次のことも行う場合: std::function rnd2 = std::bind(normal, engine); rndオブジェクトとrnd2オブジェクトはまったく同じ乱数列を生成します。

于 2011-03-08T00:29:51.803 に答える