<random> 在 C++ 类中使用

Use <random> in a c++ class

本文关键字:lt random gt C++      更新时间:2023-10-16

我想在我的程序中使用<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);
        }
    };

我遇到了"骰子"未定义的问题,尽管它在我的构造函数中。当我把分布定义移到roll函数的开头时,它会起作用,但当我这样做时,每次调用它都会得到相同的数字。

正如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;
    }

这个程序不言自明。如果不是,请告诉我,我可以带你看一遍。

我认为您的问题是每次都生成相同的数字
如果我是你,我会考虑在rand()和time()之外使用srand()

小解释:
如果你想每次生成不同的随机数,除了rand()函数外,你还必须使用srand()函数。为什么?这是因为rand每次都生成相同的伪随机数。

srand()应该接收到每一瞬间都会发生变化的东西,例如时间或PID(进程的id)

在我看来,利用时间非常容易:(以下使用<ctime>的示例可能是解决此问题的一种方法。)

1) 您需要创建一个类型为time_t的辅助变量,它将包含一个取决于time()函数调用的种子。

2) time()函数返回一个指向time_t的指针,因此您可以在稍后的调用中通过引用time()来传递上一个变量。

3) 之后,调用srand()函数,该函数接收一个unsigned类型的种子。因此,您可以传递辅助变量,在传递该变量时,直接在srand()调用上执行类型无符号的强制转换。

#include <cstdlib>
#include <ctime>
time_t seconds;
time(&seconds);
// We create a seed that change each time that we run the code
srand((unsigned)seconds);

最后,只要你想要一个伪随机数,你只需要调用rand()。

注意,rand()可以生成一个不同的伪随机种子,因为我们首先调用了srand(),而之前没有调用srand(()函数,它将是相同的种子。

例如,我们假设你想多次投掷骰子,但你希望这些投掷是随机的,而不是每次都一样:你可以通过使用%math运算来生成骰子,该运算将数字除以其他部分。

关于范围,如果你想包括0或不包括:

int die_throw = rand() % number; 

您将得到一个介于0和数字-1之间的伪随机数如果你不想包括零,你可以在获得种子后添加一个数字

int die_throw = (rand() % number)+1; 
// you generate a seed between 1 and number

有关更多信息,您可以阅读:

rand()函数,包括范围srand()函数

我希望这个答案对你有帮助。干杯