2016-03-29 12 views
2

バリエーションジェネレータが構築された後に、分布のパラメータを変更することは可能ですか?私はabを変更したい場合は のは、例えば、このシンプルなセットアップboost :: random :: variate_generator - 構築後にパラメータを変更する

typedef boost::mt19937 base_gen_type; 
typedef boost::uniform_int<int> dist_type; 
typedef boost::variate_generator<base_gen_type &, dist_type> var_gen_type; 

unsigned seed = 1337; 
int a = 0, b = 42; 

base_gen_type base_gen(seed); 
dist_type dist(a, b); 
var_gen_type rng(base_gen, dist); 

を見てみましょう、これは新しいvar_gen_typeオブジェクトが必要でしょうか? base_genの状態はもちろん影響を受けませんが、それほど複雑ではない方法があるのだろうかと思います。

dist_type &をテンプレートパラメータとして使用すると機能しませんでした。

答えて

0

以下のすべての擬似乱数ジェネレータはCopyConstructibleとAssignableであることに注意してください。ジェネレータのコピーまたは割り当ては内部状態をすべてコピーするので、オリジナルとコピーは同じ乱数シーケンスを生成します"だから、新しい価値を辞めることによって、 "rng"という名前を再利用することができます。

ブーストディストリビューションの変更には何も使用できませんが、新しいオブジェクトを構築する必要があります。これは分布が異なるタイプであることが原因で、これがレンジジェネレータのタイプを変更するためだと思います。

しかし、あなたは、分布の範囲を変更したい場合は、呼び出し経由でアクセスすることができます。プライベートメンバーへの参照を返します

distribution_type& distribution() 

は1.58 source

によるとこれは、完璧な理にかなっています異なるタイプの分布を使用する場合は、保持タイプの宣言も異なります。

#include <boost/random.hpp> 
#include <iostream> 

typedef boost::mt19937 base_gen_type; 
typedef boost::uniform_int<int> dist_type; 
typedef boost::variate_generator<base_gen_type &, dist_type> var_gen_type; 

int main(){ 
unsigned seed = 1337; 
int a = 0, b = 1; 

    base_gen_type base_gen(seed); 
    dist_type dist(a, b); 
    var_gen_type rng(base_gen, dist); 
    for(int i = 0; i < 10 ; i++) { 
    std::cout << rng() << " " << std::endl; 
    } 

    dist_type newdist(0,3); 
    rng.distribution() = newdist; 

    for(int i = 0; i < 10 ; i++) { 
    std::cout << rng() << " " << std::endl; 
    } 

} 

これは生産:

0 
1 
0 
0 
0 
1 
0 
0 
0 
0 
2 
2 
1 
1 
3 
1 
2 
1 
0 
3 

はだから範囲に割り当てられた配分を変更する方法です。

それはポインタで保存されていない実際の型を変更するという点で

ので、多分それを使用するより良い方法は、このような異なる分布と発電機を呼び出す経由で:

boost::random::mt19937 rng;   // produces randomness out of thin air 
            // see pseudo-random number generators 
boost::random::uniform_int_distribution<> six(1,6); 
            // distribution that maps to 1..6 
            // see random number distributions 
int x = six(rng);     // simulate rolling a die 

最後の例は、ブーストからランダムで文書here。 この方法で、同じジェネレータを異なる範囲の分布に渡すことができます。これ

dist_type newdist(0,3); 
rng.distribution() = newdist; 

最終的な方法は、ちょうどこのラインスワップ全体の分布を変更するが、このため(分布は、その前の値に依存している場合、それは有用であるかもしれない)だけパラメータ変更することはありません。

rng.distribution().param(dist_type::param_type(0,3)); 

希望します。

関連する問題