Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在一个范围内生成随机数?_C++_Random_Range_Codeblocks - Fatal编程技术网

C++ 如何在一个范围内生成随机数?

C++ 如何在一个范围内生成随机数?,c++,random,range,codeblocks,C++,Random,Range,Codeblocks,我正在为学校创建一个项目,工作如下: 用户想到一个数字,计算机试图猜测它。 计算机生成一个随机数,询问用户该数字是高还是低,然后如果该数字更高,则取该数字并将其设置为随机数范围的最小值(例如,生成47,则只生成47-100之间的数字)。 如果数值较低,则取生成的随机数,并使其成为最小值 我的问题是随机数生成器和范围。 我可以通过在开始{srand(time(NULL));}处设定种子来生成随机数,然后生成一个数字{rand_num=rand()%100;}生成一个介于1-100之间的数字。但我不

我正在为学校创建一个项目,工作如下: 用户想到一个数字,计算机试图猜测它。 计算机生成一个随机数,询问用户该数字是高还是低,然后如果该数字更高,则取该数字并将其设置为随机数范围的最小值(例如,生成47,则只生成47-100之间的数字)。 如果数值较低,则取生成的随机数,并使其成为最小值

我的问题是随机数生成器和范围。 我可以通过在开始{srand(time(NULL));}处设定种子来生成随机数,然后生成一个数字{rand_num=rand()%100;}生成一个介于1-100之间的数字。但我不知道如何生成一个范围内的数字(示例47-89)。本以为是{rand_num=rand()%89+47},但这似乎不起作用

Github:

{
srand(时间(空));
做{
rand_num=rand()%47+89;

cout在模运算符中,您必须使用希望取值的间隔长度

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);

< >在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 dist{47, 89}; // set min and max
  int guess = dist(gen); // generate number
  std::cout << "Computer guess: " << guess << '\n';
}
#包括
#包括
int main(){
std::随机_设备种子;
std::mt19937 gen{seed()};//为生成器设置种子
std::uniform_int_distribution dist{47,89};//设置最小值和最大值
int guess=dist(gen);//生成数字

std::您能澄清一下吗。“介于1到100之间”可以表示除端点以外的任何数字。您是指“从1到100”吗?我还建议检查代码的极限,看看它是否生成您期望的范围。@doug From 1-99…然后
rand_num=rand()%1 99 + 1;< /C>从1-99产生数字。这个问题被标记为C++。为什么不使用C++随机库?我同意@ Waly。随机库看起来比在读文档时更复杂。这是你应该使用的。你是指代码> RANDNUM=RAND()%(8947 + 1)。+47;
生成47到89之间的数字当然,这取决于是否要将89作为可能性。我编辑了答案以反映这一点。这个模(
%
)引入偏差,因为输入范围不能被输出范围平均整除。更好的解决方案是使用
std::uniform_int_distribution
@JesperJuhl,这是真的。如果范围很小,偏差确实很小,但它确实不是空的。我将对此添加注释。
#include <random>
#include <iostream>

int main() {
  std::random_device seed;
  std::mt19937 gen{seed()}; // seed the generator
  std::uniform_int_distribution dist{47, 89}; // set min and max
  int guess = dist(gen); // generate number
  std::cout << "Computer guess: " << guess << '\n';
}