1

对不起,如果这是愚蠢的。我是 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()只返回随机数的函数。

我有几个附带问题。

  1. 我有点担心我的种子。我确信没有任何种子与构造函数按从 0 到 n-1 的顺序调用相同。所以两者std::timenum在增加。还有什么我需要担心的吗?
  2. 我还没有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;
}
4

1 回答 1

1

我有点担心我的种子。

既然您说您使用的是 C++11,您可以从 为生成器播种,std::random_device如果可能,它将使用真正的随机源,否则(希望)提供良好的伪随机数。

(顺便说一句,如果您使用的是 C++11,那么所有这些现在都在标准<random>库中,因此不需要 Boost)。

我还没有在初始化程序中播种 mt19937 对象,因为我还没有 num。

您可以更改成员顺序,以便num首先初始化。当然,如果你使用std::random_device.

是否可以拥有所有这些不同的随机数生成器,或者我应该使用在所有对象之间共享的单个随机数生成器?

随机性可能不会更糟,但我还不足以肯定地说这些事情的专家。这似乎相当浪费,因为每个生成器都有几千字节的状态。

如果共享一个更好,我如何处理每个对象的不同均值/方差值?

您可以拥有多个变量生成器,它们使用不同的分布,但使用相同的底层生成器。

警告:不要在真正的赌博机上使用它。Mersenne Twister 生成器不适用于密码学,如此所述。

于 2013-11-13T14:08:08.350 回答