在 C++ 类中使用 <random>

Sha*_*y77 3 c++ random

我想<random>在我的程序中使用这个库,我将拥有不同分布的类,我想在我的程序中的不同时间生成一个数字。目前我的头文件中有以下内容

    #include <random>
    #include <time.h>

    class enemy {
    private:
        int max_roll;
        typedef std::mt19937 MyRng;
        MyRng rng;

    public:
        enemy(int MR){
            max_roll = MR;
            rng.seed(time(NULL));
            std::uniform_int_distribution<int> dice(1, max_roll);
        }

        int roll() {
            return dice(rng);
        }
    };
Run Code Online (Sandbox Code Playgroud)

我遇到了“骰子”未定义的问题,即使它在我的构造函数中。当我将分布定义移到 roll 函数的开头时,它会起作用,但是当我这样做时,每次调用它时都会得到相同的数字。我试过按照这个问题的答案,但我无法解决。

小智 7

正如 drescherjm 指出的那样,dice 是 ctor 中的一个局部变量。您需要使其在 ctor 范围之外可访问。我已尝试在此处重新编写您的程序。我想你想要的是一个随机数生成器,它生成从 0 到 MR 的整数值?如果是这种情况,您可以使用以下重新设计的程序:

 #include <random>
 #include <time.h>
 #include <iostream>
    class enemy {
    private:
        std::random_device rd;
        int max_roll;
        typedef std::mt19937 MyRng;
        MyRng rng;
       std::uniform_int_distribution<int> dice;
    public:
       enemy(int MR) : max_roll(MR), rng(rd()), dice(std::uniform_int_distribution<>(1, MR)){
        rng.seed(::time(NULL));
        }

        int roll() {
            return dice(rng);
        }
    };

    int main()
    {
      enemy en(6);
      std::cout << "Roll dice produced : " << en.roll() << std::endl;
      return 0;
    }
Run Code Online (Sandbox Code Playgroud)

该程序是不言自明的。如果不是,请告诉我,我可以带您完成。