我正在尝试使用现代方法在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);
}
答案 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);
}