如何生成范围内的随机数?

问题描述 投票:-1回答:2

我正在为学校创建一个程序如下:用户想到一个数字,计算机试图猜测它。计算机生成一个随机数,询问用户是否数字更高或更低,然后如果数字更高,则取该数字并将其设置为随机数范围的最小值(例如,生成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++ random range codeblocks
2个回答
3
投票

要在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了解更多信息。


1
投票

在模运算符中,您必须使用您想要值的区间长度。

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);
© www.soinside.com 2019 - 2024. All rights reserved.