2017-08-24 29 views
2

私は離散分布乱数ジェネレータをC++クラスに記述しています。要件は次のとおりです。クラスのC++ discrete_distributionを再利用して再初期化する方法は?

  1. 私は、使用するたびにdiscrete_distributionオブジェクトを作成したくありません。私は流通オブジェクトが軽量であることを知っていますが、私の体重アレイは非常に長く、コストはまだ高すぎます。また、このクラスのさまざまな関数で配布オブジェクトを使用する必要があります。私はクラスが

を構築するとき、私は現在、私は後に、2つのソリューションを持って正確な分布(重量配列を)知らない

  • 随時配信(重量配列)を変更する必要が
  • クラス内でrandom_device rd; mt19937 engine;の乱数エンジンを初期化し、初期化リストでengine(rd())を初期化します。

    discrete_distribution<> *d=new discrete_distribution<>(weight_array,weight_array+weight_array_size)でdiscrete_distributionオブジェクトを作成し、そのクラスにポインタを格納します。私は乱数を生成するために(* d)(エンジン)を呼び出すたびに、分布を削除して、ウェイト配列を更新するために新しいものを作成するだけです。

    discrete_distribution<> dをクラスに定義し、ウェイト配列をd=discrete_distribution<>(weight_array,weight_array+weight_array_size)に更新すると、d(engine)の乱数が生成され、ポインタについて心配する必要がなくなります。

    しかし、どちらの方法も古典的な方法ではなく、C++オブジェクトを使用しているようです。彼らは間違っていますか?このようにコードを書くのに欠点はありますか?

    おかげ

  • 答えて

    0

    もう一つの方法は、私たちがd(engine)で乱数を生成することができますし、ポインタを心配する必要がないように、クラスのdiscrete_distribution<> dを定義し、d=discrete_distribution<>(weight_array,weight_array+weight_array_size)で体重配列を更新することです。

    これは、オブジェクトインスタンスを処理するための完全に細かい一般的なC++スタイルです。

    実際、多くのタイプには割り当て可能なため、修飾子メンバーがありません。

    probabilities: 0.2 0.2 0.2 0.2 0.2 
    #1:1 #2:2 #3:0 #4:4 
    probabilities: 0.01 0.99 
    #1:1 #2:1 #3:1 #4:1 
    
    のようなものを印刷

    Live On Coliru

    #include <boost/random.hpp> 
    #include <boost/random/random_device.hpp> 
    #include <boost/range/algorithm/copy.hpp> 
    #include <iostream> 
    
    namespace br = boost::random; 
    
    struct X { 
        using Weight = double; 
        br::mt19937       engine { br::random_device{}() }; 
        br::discrete_distribution<int, Weight> dist { {0.2, 0.2, 0.2, 0.2, 0.2} }; 
    
        void sample() { 
         for (auto i : {1,2,3,4}) 
          std::cout << "#" << i << ":" << dist(engine) << " "; 
         std::cout << "\n"; 
        } 
    
        void show_probabilities() { 
         boost::copy(dist.param().probabilities(), std::ostream_iterator<Weight>(std::cout << "probabilities: ", " ")); 
         std::cout << "\n"; 
        } 
    
        void reprogram(std::initializer_list<Weight> probabilities) { 
         dist.param(probabilities); 
        } 
    }; 
    
    int main() { 
        X x; 
        x.show_probabilities(); 
        x.sample(); 
    
        x.reprogram({0.01, 0.99}); 
    
        x.show_probabilities(); 
        x.sample(); 
    } 
    

    :あなたは、しかし、重みを変更するparams()メンバーを使用することができます。この場合

    関連する問題