在c ++中生成随机整数

时间:2018-04-21 09:25:26

标签: c++

我正在尝试使用现代方法在c ++中生成一个随机数。但是每次调用函数时我都会得到相同的随机数

int getRandomPixel() {
    std::random_device rd; // obtain a random number from hardware
    std::mt19937 eng(rd()); // seed the generator
    std::uniform_int_distribution<> distr(0, 255); // define the range
    return distr(eng);
}

2 个答案:

答案 0 :(得分:-1)

您的std::random_device是PRNG,如on cppreference所述:

  

std::random_device可以用来实现   实现定义的伪随机数引擎,如果a   非确定性源(例如硬件设备)不可用   实施。 在这种情况下,每个std::random_device对象都可以   生成相同的数字序列。

getRandomPixel()的每次调用中,您重新创建rd,然后每次生成相同的第一个种子,当mt19937播种该值时,该种子将生成相同的值因为它也被重新创建,因此具有相同的初始状态。

每次通话都不应重新创建它们:

int getRandomPixel() {
    static std::random_device rd; // obtain a random number from hardware
    static std::mt19937 eng(rd()); // seed the generator
    static std::uniform_int_distribution<> distr(0, 255); // define the range
    return distr(eng);
}

答案 1 :(得分:-1)

以下解决了这个问题。我认为问题是我在每次通话中重新创建设备和发电机

using u16  = unsigned short int;
u16 getRandomPixel() {
    static std::random_device rd; // obtain a random number from hardware
    static std::mt19937 eng(rd()); // seed the generator
    std::uniform_int_distribution<u16> distr(0, 255); // define the range
    return distr(eng);
}