【问题标题】:rand() produces 1 number too high?rand() 产生 1 个数字太高?
【发布时间】:2017-03-13 15:19:00
【问题描述】:

据我了解,rand() % a + b 将返回 a 和 b 之间的数字,包括 a 和 b。不过我一定是误解了这一点,因为当我运行int r 下面的代码时,将返回 2、3 或 4。当然,我希望它返回 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

【问题讨论】:

  • X%3 在集合 (0,1,2) 中,因此添加 2 将使其在集合 (2,3,4) 中
  • 这就是为什么std::uniform_int_distribution 这么好。
  • 谢谢你,直到你这样说我才明白。我一直看到示例rand() % 100 + 1,只是一直认为是rand () % max + min = random between min and max with both including。我现在完全明白了。非常感谢。

标签: c++ random srand


【解决方案1】:

据我了解,rand() % a + b 将返回介于ab 之间的数字,包括ab

没有。它将产生一个介于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;

【讨论】:

    【解决方案2】:

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

    因此你得到 2 ,3, 4 :

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

    【讨论】:

      【解决方案3】:
      int r = (rand() % 3) + 2;
      

      rand() % 3 将返回一个介于 0 和 2 之间的数字。当您将 t2 添加到每个数字时,这意味着它将返回 2 到 4。rand() % a 函数通常返回一个从 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)。

      【讨论】:

        猜你喜欢
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多