如何在标准构造函数之外设置boost::uniform_int_distribution的参数
How to set the parameters of boost::uniform_int_distribution outside of the standard constructor?
我在Boost 1.52中使用uniform_int_distribution来使用基本样板代码生成随机数:
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
boost::random::mt19937 gen;
int roll_die()
{
boost::random::uniform_int_distribution<> dist(1, 6);
return dist(gen);
}
int main()
{
for (int i = 0; i < 10; i++) std::cout << roll_die() << std::endl;
}
我在一个更大的项目中实现了其中的一部分,并且效果很好。这是我的问题。
在上面的函数中,dist对象似乎是函数的局部对象。如果多次调用roll_die(),似乎将dist()置于函数的局部会引入大量开销。
我认为最好设置这个对象的最小和最大参数一次,然后在一个更大的对象或其他东西中只有一个dist实例。如何做到这一点呢?我试图理解类模板的"公共成员函数"部分:http://www.boost.org/doc/libs/1_47_0/doc/html/boost/random/uniform_int_distribution.html#id744736-bb,但它超出了我的头脑。在该文档中我看到:
void param(const param_type & param); //Sets the parameters of the distribution.
你实际如何使用这个?.param()本身是一个要调用的函数,还是它是另一个函数的替身?我找不到另一个boost的例子来满足我的要求。提前感谢您的帮助和建议!
似乎……会带来很多开销。
你可能认为它是,但你真的知道吗?在没有实际运行分析器或以其他方式对代码进行基准测试之前,您不应该做出任何更快或更慢的假设。如果您查看源代码,您可以看到uniform_int_distribution
的构造函数仅仅分配了最小值和最大值—这应该是非常微不足道的开销。特别是如果你考虑到实际的随机数生成将是一个比两次赋值复杂得多的操作。所以我建议你保持代码不变,如果你的程序太慢了,你总是可以分析然后优化。
无论如何,回答你的问题:param()
是uniform_int_distribution
的成员。它接受uniform_int_distribution::param_type
类型的对象。你可以这样使用:
using namespace boost::random;
// Create an uniform_int_distribution object
uniform_int_distribution<> dist(1, 6);
// Create a params object
uniform_int_distribution::param_type newParams(10, 500);
// The following will reconfigure dist to have 10 and 500 as
// min and max value
dist.param(newParams);
通过这种方式,您可以随时重新配置单个分发对象。但是"开销"可能与构造一个新的分布对象相同。
另一种方法可以确保对象只创建一次:
int roll_die()
{
static boost::random::uniform_int_distribution<> dist(1, 6);
return dist(gen);
}
将函数内部的变量声明为静态具有与全局变量相似的效果,但它仅在函数的作用域中可见。
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)