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

时间:2019-04-21 21:27:38

标签: c++ random range codeblocks

我正在为学校创建一个程序,其工作方式如下: 用户想到一个数字,然后计算机尝试猜测它。 计算机会生成一个随机数,询问用户数字是高还是低,然后如果数字高,它将使用该数字并将其设置为随机数范围的最小值(例如,生成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);
}

2 个答案:

答案 0 :(得分:3)

要在C ++ 11或更高版本中生成随机数,请使用C ++随机库。对于任何应用程序,它都应该比C实用程序更可取。

optionsScroll

阅读相关的cppreference page以获得更多信息。

答案 1 :(得分: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);