2016-03-29 13 views
2

Değişken jeneratör oluşturulduktan sonra dağıtım parametrelerini değiştirmek mümkün mü? bu yeni var_gen_type nesnesi gerekir, ben a değiştirmek istiyorsa en Örneğin bu basit kurulumboost :: random :: variate_generator - İnşaat sonrası parametreleri değiştirin

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); 

alalım ve b? base_gen'un durumu elbette etkilenmeyecek ama daha az karmaşık bir yol olup olmadığını merak ediyorum.

dist_type & şablon parametresi olarak çalışmadı.

cevap

0

Belgelerden: "Aşağıda açıklanan tüm rastgele sayı üreteçlerinin CopyConstructible ve Assignable olduğunu unutmayın. Bir jeneratörü kopyalamak veya atamak tüm dahili durumunu kopyalar, böylece orijinal ve kopya rasgele sayıların aynı dizisini oluşturur ." Böylece "rng" adını yeni değerden istifade ederek tekrar kullanabilirsiniz.

Yükseltme dağıtımını değiştirmek için kullanabileceğiniz hiçbir şey yok, ancak yeni nesneyi oluşturmanız gerekir. Bunun nedeni, dağılımın tür jeneratörünün türünü değiştiren farklı tipte olmasından kaynaklandığını düşünüyorum. Eğer dağıtım aralığını değiştirmek isterseniz

Ama aradığınız üzerinden erişebilirsiniz: Özel üyesine başvuru verir

distribution_type& distribution() 

Bu çok anlamlı olarak yapar 1,58 source

göre Farklı dağıtım tipini kullanmak istiyorsanız, tutma tipi beyanı da farklı olacaktır.

#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; 
    } 

} 

bu üretir:

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

Yani bu aralık için atanan dağılımını değiştirmek için bir yoldur.

o yüzden belki pointer tarafından saklanmaz gerçek türü böyle farklı dağılımlar ile jeneratör çağırarak yoluyladır kullanmak daha iyi bir yol değişen açısından

:

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 

son örneği rastgele baskının olduğu dokümantasyon here. Bu şekilde aynı jeneratörü farklı aralık dağılımlarına geçirebilirsiniz. Buna

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

:

nihai yolu sadece bu hatlar takas dağılımının tamamını değiştirmek ancak bunun için (dağıtım önceki değerlerine bağlıdır eğer yararlı olabilir) sadece parametreleri değiştirmek değildir:

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

Yardım edin.