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

2019-08-06 09:25发布

我使用的是uniform_int_distribution在升压1.52生成使用基本样板代码的随机数:

#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()本身就是一个函数调用,或者是一个独立于其他功能? 我无法找到做我问什么其他升压例子。 在此先感谢您的帮助和建议!

Answer 1:

它看起来像......将引入大量的开销。

你可以假设这样做,但实际上,你知道吗? 如果有什么是不实际运行探查或以其他方式基准代码更快或更慢,你不应该做任何假设。 如果你看一下源代码,你可以看到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);
}

声明函数内部变量为静态具有仿佛在那里全球性的,但它只是在函数的范围中可见的变量类似的效果。



文章来源: How to set the parameters of boost::uniform_int_distribution outside of the standard constructor?