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

时间:2015-11-19 04:48:44

标签: c++11 random syntax

有几个好的答案like this提供了一个简洁的随机应用程序,但是我很难从那个应用程序扩展到较大的应用程序的一小部分。

这就是我正在做的事情:

#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);
}

所以基本上,我想要一个可以随时随地使用的共享随机生成器......随机。 :-)来自嵌入式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());
            ^

error: no match for call to '(std::uniform_int_distribution<int>) (int, int)'
 dist(0x00000000, 0x00010000);
                            ^

1 个答案:

答案 0 :(得分:0)

好的,我明白了。无论如何要张贴以保存某人的工作。

#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);
}

结果是班级定义是正确的;问题都在实施中:

  • 需要在类定义之外再次声明静态变量。 (不知道为什么)
  • 必须像这样初始化带有构造函数的局部变量(不是指针)。
    • 这为这个构造函数添加了一个参数,然后必须从GetInstance()
    • 中提供