C++11 如何使用c++;11大型应用程序中的随机库?

C++11 如何使用c++;11大型应用程序中的随机库?,c++11,random,syntax,C++11,Random,Syntax,有几个很好的答案可以提供一个简洁的随机应用程序,但我很难将其扩展到更大应用程序的一小部分 以下是我正在做的: #include <random> class RandomFP16 { public: static RandomFP16* GetInstance(); int GetRandom(); private: static RandomFP16* singleton; RandomFP16(); std::mt19937 mt;

有几个很好的答案可以提供一个简洁的随机应用程序,但我很难将其扩展到更大应用程序的一小部分

以下是我正在做的:

#include <random>

class RandomFP16
{
public:
    static RandomFP16* GetInstance();
    int GetRandom();
private:
    static RandomFP16* singleton;
    RandomFP16();
    std::mt19937 mt;
    std::uniform_int_distribution<int> dist;
};

RandomFP16* RandomFP16::GetInstance()
{
    if(singleton == 0)
    {
        singleton = new RandomFP16();
    }
    return singleton;
}

RandomFP16::RandomFP16()
{
    std::random_device rd;
    //next two lines have errors
    mt(rd());
    dist(0x00000000, 0x00010000);   //fixed-point 16.16
}

int RandomFP16::GetRandom()
{
    return dist(mt);
}
#包括
第16类
{
公众:
静态随机fp16*GetInstance();
int GetRandom();
私人:
静态随机FP16*单态;
随机FP16();
标准:MT19937MT;
标准:均匀分布区;
};
RandomFP16*RandomFP16::GetInstance()
{
如果(单例==0)
{
singleton=新随机数fp16();
}
返回单身;
}
RandomFP16::RandomFP16()
{
std::随机_装置rd;
//接下来的两行有错误
mt(rd());
dist(0x00000000,0x00010000);//定点16.16
}
int RandomFP16::GetRandom()
{
返回区(mt);
}
所以基本上,我想要一个共享的随机生成器,可以在任何时间、任何地点使用……随机。:-)从embedded C和Windows C#中,我看到这里使用了一些奇怪的语法,因此我不确定如何构造东西来消除这些错误:

error: no match for call to '(std::mt19937 {aka std::mersenne_twister_engine<unsigned int, 32u, 624u, 397u, 31u, 2567483615u, 11u, 4294967295u, 7u, 2636928640u, 15u, 4022730752u, 18u, 1812433253u>}) (std::random_device::result_type)'
     mt(rd());
            ^
错误:调用(std::mt19937{aka std::mersenne_twister_engine})(std::random_device::result_type)不匹配
mt(rd());
^

错误:对“(std::uniform_int_distribution)(int,int)”的调用不匹配
距离(0x00000000,0x00010000);
^

好的,我知道了。无论如何都要发布以节省某人的工作


#包括
第16类
{
公众:
静态随机fp16*GetInstance();
int GetRandom();
私人:
静态随机FP16*单态;
随机FP16(标准::随机设备::结果类型种子);
标准:MT19937MT;
标准:均匀分布区;
};
RandomFP16*RandomFP16::singleton=0;
RandomFP16*RandomFP16::GetInstance()
{
如果(单例==0)
{
std::随机_装置rd;
singleton=new RandomFP16(rd());
}
返回单身;
}
RandomFP16::RandomFP16(标准::随机\设备::结果\类型种子)
:mt(seed),dist(0x00000000,0x00010000)//定点16.16
{
}
int RandomFP16::GetRandom()
{
返回区(mt);
}
结果证明类定义是正确的;这些问题都存在于实施过程中:

  • 静态变量需要在类定义之外再次声明。(不知道为什么)
  • 带有构造函数的局部变量(不是指针)必须像这样初始化。
    • 这为这个构造函数添加了一个参数,然后必须从GetInstance()提供参数
error: no match for call to '(std::uniform_int_distribution<int>) (int, int)'
 dist(0x00000000, 0x00010000);
                            ^
#include <random>

class RandomFP16
{
public:
    static RandomFP16* GetInstance();
    int GetRandom();
private:
    static RandomFP16* singleton;
    RandomFP16(std::random_device::result_type seed);
    std::mt19937 mt;
    std::uniform_int_distribution<int> dist;
};

RandomFP16* RandomFP16::singleton = 0;

RandomFP16* RandomFP16::GetInstance()
{
    if(singleton == 0)
    {
        std::random_device rd;
        singleton = new RandomFP16(rd());
    }
    return singleton;
}

RandomFP16::RandomFP16(std::random_device::result_type seed)
    : mt(seed), dist(0x00000000, 0x00010000)    //fixed-point 16.16
{
}

int RandomFP16::GetRandom()
{
    return dist(mt);
}