繁体   English   中英

采用 <random> 在C ++类中

[英]Use <random> in a c++ class

我想在程序中使用<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)所指出的那样,骰子是变量中的局部变量。 您需要使它在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()。

请注意,由于我们首先调用srand(),因此rand()可以生成不同的伪随机种子,而无需事先调用srand()函数,它将是相同的种子。

例如,我们假设您想掷骰一次,但您希望这些掷是随机的,而不是每次都不相同:您可以通过使用%数学运算来生成它,剩下的就是除数其他。

关于范围,如果要不包括0:

int die_throw = rand() % number; 

您将获得一个介于0和1之间的伪随机数。如果您不想包含零,则可以执行以下操作:在获得种子后添加一个数字

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

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

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

希望这个答案对您有所帮助。 干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM