[英]How to reuse and reinitialize c++ discrete_distribution in class?
我正在c ++类中编写离散分布随机数生成器。 要求是:
当前我有两种解决方案,用random_device rd; mt19937 engine;
初始化随机数引擎之后random_device rd; mt19937 engine;
random_device rd; mt19937 engine;
在类中,并且在初始化列表中包含engine(rd())
。
一种方法是使用discrete_distribution<> *d=new discrete_distribution<>(weight_array,weight_array+weight_array_size)
创建离散量分布对象并将指针存储在类中。 每次我调用(* d)(engine)生成一个随机数时,我只需要删除分布并制作一个新值来更新权重数组。
另一种方法是在类中定义discrete_distribution<> d
d=discrete_distribution<>(weight_array,weight_array+weight_array_size)
discrete_distribution<> d
,并使用d=discrete_distribution<>(weight_array,weight_array+weight_array_size)
更新权重数组,这样我们就可以使用d(engine)
生成随机数,而不必担心指针。
但是似乎这两种方式都不是使用c ++对象的经典方式。 他们错了吗? 用这种方式编写代码有什么缺点吗?
谢谢
另一种方法是在类中定义
discrete_distribution<> d
d=discrete_distribution<>(weight_array,weight_array+weight_array_size)
discrete_distribution<> d
,并使用d=discrete_distribution<>(weight_array,weight_array+weight_array_size)
更新权重数组,这样我们就可以使用d(engine)
生成随机数,而不必担心指针。
这是一种很好的通用C ++样式来处理对象实例。
实际上,许多类型没有修饰符成员,因为它们是可分配的。
在这种情况下,您可以使用params()
成员更改权重:
#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();
}
打印类似
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.