rand() 产生 1 个数字太高?

rand() produces 1 number too high?

据我了解,rand() % a + b 将 return a 和 b 之间的数字,包括 a 和 b。不过,我一定是误解了这一点,因为当我 运行 时,下面的代码 int r 将 return 2、3 或 4。我当然希望它成为 return 2 或 3。我在 main 中调用 srand(time(NULL)); 并且我正在使用 #include <time.h>#include <stdlib.h>
我错过了什么吗?

    int r = (rand() % 3) + 2;
    if (r ==2)
        g_fan.draw(r); // skin == 2
    else
        g_fan.draw(1 + r); //skin == 4

It is my understanding that rand() % a + b will return numbers between a and b including both a and b.

没有。它将导致 b(a+b-1) 之间的数字,两者都包括。

rand() % a 的取值范围是 0a-1,两者都包括。

因此,rand() % a + b的取值范围是b(a-1+b),都包括。

要获得介于 ab 之间的随机值,包括两者,请使用:

auto interval = (b-a+1);
auto result = a + rand() % interval;

num 成为您通过调用 rand() 获得的任何数字,如果您对 3 执行 % ,则有可能获得这些数字 0、1、2 之一。

因此你得到 2 ,3, 4 :

 int r = (rand() % 3) + 2;
int r = (rand() % 3) + 2;

rand() % 3 将 return 0 到 2 之间的数字。当您将 t2 添加到每个数字时,这意味着它将 return 2 到 4。 rand() % a 函数通常 return 是一个从 0 到 a - 1 的值。当您执行 rand() % a + b 时,结果值的范围将从 0 + ba - 1 + b

要获得 2 到 3 之间的值,请使用:

int r = (rand() % 2) + 2;

下面的rand()函数给出了一个从02 - 1的数字,即1。当你给每个数字加 2 时,你得到的范围是 0 + 2,即 2,到 2 - 1 + 2,即 3。