提升C++:在函数中播种随机数
Boost C++: Seeding random numbers in a function
我有一个函数,每次调用一个新的随机指数变量时都应该模拟它:
#include <boost/random.hpp>
//Simulates a single exponential random variable
double generateExponential(double lambda) {
boost::mt19937 rng; //Mersenne Twister Generator
rng.seed(time(0));
boost::variate_generator< boost::mt19937&, boost::exponential_distribution<> > rndm(rng, boost::exponenti
al_distribution<>(lambda));
return rndm();
}
例如
double newExp = generateExponential(10);
但是,每次调用该函数时,它都会生成相同的随机数。我希望每次调用函数时它都会生成一个不同的随机数。我认为"rng.seed(time(0))"可能会修复它,但事实并非如此。我怎样才能让它做到这一点?
如果你不能更改函数的签名,那么你可以使用生成器的static
实例。 无需重新播种。
#include <boost/random.hpp>
typedef boost::mt19937 G;
typedef boost::exponential_distribution D;
double generateExponential(double lambda)
{
static G rng(std::time(0)); // initialized and seeded once
boost::variate_generator<G &, D<> > rndm(rng, D<>(lambda));
return rndm();
}
一般来说,随机数的来源应该是一个资源,其生命周期是整个程序的生命周期,而不是单个函数调用的生命周期。
因此,您需要表示所述随机数源的对象具有适当的生命周期。让它成为函数的局部变量是一个坏主意。它应该是传递到函数中的对象,或者可能是全局对象。
(此外,经常重新设定随机数生成器种子是另一个众所周知的坏主意)
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 随机数生成函数说明
- C++随机数分布传递给函数
- 每次调用函数时,随机数都相同
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- C++ 在函数中生成随机数
- 用于创建高斯随机数的 c++ 函数
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- 为什么这4个不同的随机数生成器函数会产生相同的一系列数字
- 是否有在 c++ 中使用三角分布生成随机数的函数
- 将范围随机数保存到数组而不重复的函数
- 传递参数、参数、交换函数和随机数生成器
- 随机数函数未正确随机化 (C++)
- c++11 子函数中的随机数生成器
- rand()在通过函数调用时生成相同的随机数集(即使在使用srand(time(NULL)进行种子设定之后)
- 函数用于随机数(C++11)
- 提升C++:在函数中播种随机数
- C++循环中调用伪随机数生成器函数 - 常量种子问题