boost::random::variate_generator-构造后更改参数
boost::random::variate_generator - Change parameters after construction
在构造变量生成器后,是否可以更改分布的参数?让我们以这个简单的设置为例
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);
如果我想更改a
和b
,这是否需要一个新的var_gen_type
对象?base_gen
的状态当然不会受到影响,但我想知道是否有一种不那么复杂的方法。
使用dist_type &
作为模板参数不起作用。
从文档中:"请注意,下面描述的所有伪随机数生成器都是CopyConstructable和Assignable。复制或分配生成器将复制其所有内部状态,因此原始生成器和副本将生成相同的随机数序列。"因此,您可以通过放弃新值来重新使用"rng"名称。
虽然没有什么可以用来更改提升分布,但您需要构造新对象。我认为这是由于分布是不同类型的,这反过来又改变了范围生成器的类型。
但如果你想更改分发范围,你可以通过调用来访问它
distribution_type& distribution()
它根据1.58源返回对私人成员的引用
这是非常合理的,因为如果您想使用不同类型的分布,则持有类型声明也将不同。
#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
最后一个例子来自这里的boost随机文档。通过这种方式,您可以将相同的生成器传递给不同的范围分布。
最后的方法不是修改整个分布,而是只更改一个参数(如果分布取决于其以前的值,这可能很有用)。只需交换以下行:
dist_type newdist(0,3);
rng.distribution() = newdist;
到此:
rng.distribution().param(dist_type::param_type(0,3));
希望能有所帮助。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用