C++ C++;多个对象中的Boost正态随机数

C++ C++;多个对象中的Boost正态随机数,c++,boost,c++11,random,normal-distribution,C++,Boost,C++11,Random,Normal Distribution,对不起,如果这是愚蠢的。我是新手,很长时间没有使用C++了。这是一个玩具问题试图回到它 假设我有n老虎机,它们在每次运行时支付RR需要正态分布。每台机器的平均值和方差需要不同。我当前的C++11代码如下所示: narm.h: narm.cpp #包括“narm.h” #包括 #包括 int narm::计数器=0; std::随机_设备narm::rd; std::mt19937 narm::generator(rd()); narm::narm(int-mean,int-var):k(0),n

对不起,如果这是愚蠢的。我是新手,很长时间没有使用C++了。这是一个玩具问题试图回到它

假设我有n老虎机,它们在每次运行时支付RR需要正态分布。每台机器的平均值和方差需要不同。我当前的C++11代码如下所示:

narm.h: narm.cpp
#包括“narm.h”
#包括
#包括
int narm::计数器=0;
std::随机_设备narm::rd;
std::mt19937 narm::generator(rd());
narm::narm(int-mean,int-var):k(0),num(counter++),分布(mean,var)
{
这->平均值=平均值;
这个->方差=var;
标准::cout
我有点担心我的种子

既然您说您使用的是C++11,那么您可以从
std::random_device
中为生成器添加种子,如果可能的话,它将使用真正的随机性源,并(希望)提供良好的伪随机数

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

我还没有在初始值设定项中设置mt19937对象的种子,因为我还没有num

您可以更改成员顺序,以便首先初始化
num
。当然,如果您使用
std::random\u device
,这与此无关

使用所有这些不同的随机数生成器可以吗?还是应该使用一个在所有对象之间共享的随机数生成器

随机性可能不会更糟,但我不是这方面的专家,不能肯定地说。这看起来确实很浪费,因为每个生成器都有几千字节的状态

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

您可以有多个变量生成器,使用不同的发行版,但使用相同的基础生成器

警告:不要在真正的赌博机中使用此功能。如前所述,Mersenne Twister生成器不适用于加密

我有点担心我的种子

既然您说您使用的是C++11,那么您可以从
std::random_device
中为生成器添加种子,如果可能的话,它将使用真正的随机性源,并(希望)提供良好的伪随机数

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

我还没有在初始值设定项中设置mt19937对象的种子,因为我还没有num

您可以更改成员顺序,以便首先初始化
num
。当然,如果您使用
std::random\u device
,这与此无关

使用所有这些不同的随机数生成器可以吗?还是应该使用一个在所有对象之间共享的随机数生成器

随机性可能不会更糟,但我不是这方面的专家,不能肯定地说。这看起来确实很浪费,因为每个生成器都有几千字节的状态

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

您可以有多个变量生成器,使用不同的发行版,但使用相同的基础生成器


警告:不要在真正的赌博机中使用此选项。如前所述,Mersenne Twister生成器不适用于加密。

您可以从
std::random_设备
中为生成器设定种子,如果可能,该设备将使用真正的随机性源,并给出(希望如此)好的伪随机数。Mike上面的评论是种子的首选方式。对于更一般的初始化器主题:你可以在那里有任意表达式。没有理由你不能说
num(计数器++),random\u number\u生成器(num)在初始化列表中,例如,您只需要确保初始化器与类本身中出现的顺序相同,因为这是C++命令将调用它们。您可以从<代码> STD::RealthyDebug < /C> >中生成生成器,如果可能的话,它将使用真正随机性的来源,并给出(希望)好的伪随机数。Mike上面的评论是种子的首选方式。对于更一般的初始化器主题:你可以在那里有任意表达式。没有理由你不能说
num(计数器++),random\u number\u生成器(num)在初始化列表中,例如,你只需要确保初始化器的顺序与它们在类本身中的顺序相同,因为这是C++命令将调用它们。我甚至没有意识到它都在C++ 11中:D,所以我最初使用了不同的生成器,因为我不知道共享了多少,它们是否是WOLL。d基于不同的分布相互干扰。(ps…,谢谢!)谢谢你的警告。我将要做关于强化学习的博士研究。NARM(N Armed Bandit)在RL中是一个很好的入门玩具问题,这是我需要随机性的唯一原因。我甚至没有意识到它在C++11:D中的全部,所以我最初使用了不同的生成器,因为我不确定共享了多少,以及它们是否会基于不同的分布相互干扰。(ps…,谢谢!)谢谢你的警告。我将要做关于强化学习的博士研究。NARM(N Armed Bandit)是RL中一个很好的入门玩具问题,这是我需要随机性的唯一原因。
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;
};
// 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;
}
#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;
};
#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;
}