我正在为学校创建一个程序如下:用户想到一个数字,计算机试图猜测它。计算机生成一个随机数,询问用户是否数字更高或更低,然后如果数字更高,则取该数字并将其设置为随机数范围的最小值(例如,生成47,然后只生成数字47-100)。如果数字较低,则采用生成的随机数并使其成为最小值。
我的问题是随机数发生器和范围。我可以通过在开始播种它来生成随机数{srand(time(NULL));}然后生成一个数字{rand_num = rand()%100;生成1-100之间的数字。但我无法弄清楚如何在一个范围内生成一个数字(例如47-89)。以为它是{rand_num = rand()%89 + 47},但这似乎不起作用。
Github:https://gist.github.com/EthanA2020/e121b27ab80fa6e2d32df1396e62b632
{
srand(time(NULL));
do {
rand_num=rand()%47+89;
cout << rand_num << endl;
cout << "enter: "; cin >> userquitval;
}while (userquitval!=7);
}
要在C ++ 11或更高版本中生成随机数,请使用C ++随机库。对于任何应用程序,这应该比C实用程序更受欢迎。
#include <random>
#include <iostream>
int main() {
std::random_device seed;
std::mt19937 gen{seed()}; // seed the generator
std::uniform_int_distribution<int> dist;
dist.param({47, 89}); // set min and max
int guess = dist(gen); // generate number
std::cout << “Computer guess: “ << guess << ‘\n’;
}
阅读相关的cppreference page了解更多信息。
在模运算符中,您必须使用您想要值的区间长度。
rand_num=rand()%(90-47)+47;
正如Jesper所提到的,这引入了偏见。要理解它,想想如果你想要一个等于0或1的数字会发生什么,并且rand的范围是[0,1,2]。使用上面的公式,得到0的概率是0.66,得到1的概率是0.33。
要解决此问题,您可以使用以下公式将随机数缩放为[0,1]间隔中的浮点数,然后使用该公式生成所需的数字。
(double) uniform = (double) rand() / (double) RAND_MAX;
rand_num = (int) ((90.0 - 47.0)*uniform) + 47);