0

我在 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() 本身是要调用的函数,还是另一个函数的替身?我找不到另一个可以满足我要求的提升示例。提前感谢您的帮助和建议!

4

1 回答 1

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);

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

另一种可以确保对象只创建一次的方法:

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

将函数内部的变量声明为 static 与全局变量具有类似的效果,但它仅在函数的范围内可见。

于 2013-01-10T22:16:43.853 回答