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

Joe*_*Joe 0 c++ random constructor boost

我在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;     
}
Run Code Online (Sandbox Code Playgroud)

我在一个更大的项目中实现了其中的一部分,并且效果很好。这是我的问题。

在上面的函数中,似乎dist对象是该函数的本地对象。如果您多次调用roll_die(),似乎dist()对于函数而言是本地的,这会带来很多开销。

我认为最好一次设置此对象的min和max参数,然后在更大的对象或其他对象中仅包含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.
Run Code Online (Sandbox Code Playgroud)

您实际上如何使用它?.param()本身是要调用的函数,还是其他函数的替代者?我找不到另一个能满足我要求的增强示例。预先感谢您的协助和建议!

let*_*tar 5

似乎……会带来很多开销。

您可能会认为确实如此,但是您实际上知道吗?如果没有实际运行分析器或以其他某种方式对代码进行基准测试,则不应做任何假设,以决定是更快还是更慢。如果您查看源代码,则可以看到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);
Run Code Online (Sandbox Code Playgroud)

这样,您可以根据需要多次重新配置单个分发对象。但是“开销”可能与构造新的分发对象相同。

确保对象仅创建一次的另一种方法:

int roll_die()
{
    static boost::random::uniform_int_distribution<> dist(1, 6);
    return dist(gen);
}
Run Code Online (Sandbox Code Playgroud)

将函数内部的变量声明为静态具有与全局变量相同的效果,但是仅在函数范围内可见。