如何在标准构造函数之外设置boost::uniform_int_distribution的参数

How to set the parameters of boost::uniform_int_distribution outside of the standard constructor?

本文关键字:int uniform distribution 参数 boost 设置 标准 构造函数 外设      更新时间:2023-10-16

我在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的构造函数仅仅分配了最小值和最大值—这应该是非常微不足道的开销。特别是如果你考虑到实际的随机数生成将是一个比两次赋值复杂得多的操作。所以我建议你保持代码不变,如果你的程序太慢了,你总是可以分析然后优化。

引用Djikstra的话:"过早的优化是万恶之源"。程序员经常编写比实际需要更复杂的代码,仅仅是因为他们认为这样会更快。不要这样做——只有在速度出现问题时才开始优化。

无论如何,回答你的问题: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);
}

将函数内部的变量声明为静态具有与全局变量相似的效果,但它仅在函数的作用域中可见。