对不起,如果这是愚蠢的。我是 Boost 新手,很长时间没有使用 C++。这是一个试图回到它的玩具问题。
假设我有n台老虎机,每次运行都支付R。R需要正态分布。每台机器的均值和方差需要不同。我当前的 C++11 代码如下所示:
纳姆.h:
class narm
{
public:
narm(int mean, int var); // Constructor takes mean and variance
double mean; // Local Mean
double variance; // Local Var
static int counter; // Static Counter for the number of objects so far
int num; // Which machine am I
boost::mt19937 random_number_generator;
boost::normal_distribution<> normal;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
};
纳尔姆.cpp
// Static variable
int narm::counter = 0;
// Constructor. Creates the mt19937 generator and normal distribution.
// Then make the generator.
narm::narm(int mean, int var) : random_number_generator(), normal(mean, var), var_nor(random_number_generator, normal)
{
this->mean = mean;
this->variance = var;
num = counter++;
// Seed the generator. The num is also used, as the constructors
// were called so fast that std::time was the same (correct solution?)
var_nor.engine().seed(std::time(NULL) + getpid() + num );
// I'm not entirely sure what this does.
var_nor.distribution().reset();
// Get random number
std::cout << num << " : " << var_nor() << std::endl;
}
我将有一个play()
只返回随机数的函数。
我有几个附带问题。
- 我有点担心我的种子。我确信没有任何种子与构造函数按从 0 到 n-1 的顺序调用相同。所以两者
std::time
都num
在增加。还有什么我需要担心的吗? - 我还没有
mt19937
在初始化程序中播种对象,因为我还num
没有。
主要问题
是否可以拥有所有这些不同的随机数生成器,或者我应该使用在所有对象之间共享的单个随机数生成器?如果共享一个更好,我如何处理每个对象的不同均值/方差值?
谢谢!
更新
以下是基于您的评论/答案的以下更新:
纳尔姆.h
#include<random>
class narm
{
public:
narm(int mean, int var);
int k;
int num;
double mean;
double variance;
static int counter;
static std::random_device rd; // Shared
static std::mt19937 generator; // Shared
std::normal_distribution<> distribution;
};
纳尔姆.cpp
#include "narm.h"
#include <random>
#include <iostream>
int narm::counter = 0;
std::random_device narm::rd;
std::mt19937 narm::generator(rd());
narm::narm(int mean, int var) : k(0), num(counter++), distribution(mean, var)
{
this->mean = mean;
this->variance = var;
std::cout << num << " : " << distribution(generator) << std::endl;
}