【问题标题】:C rand() dice issueC rand() 骰子问题
【发布时间】:2017-02-25 15:05:01
【问题描述】:

我是 C 的新手,我正在读一本关于它的书。我刚刚遇到了rand() 函数。该书指出,使用rand() 返回一个从 0 到 32767 的随机数。它还指出,您可以使用%(模运算符)来缩小随机数的范围。
下面是一个例子:下面的表达式将一个从 1 到 6 的随机数放入变量dice

dice = (rand() % 5) + 1;

我无法得到 5 的余数,因为从 0 到 33767 % 5 的任何数字都等于 0 到 4,但绝不是 5。

上述语句中不应该是% 6吗?

例如,如果我随机选择一个介于 0 到 32767 之间的数字,比如 75,那么:

75 % 5 == 0
76 % 5 == 1
77 % 5 == 2
78 % 5 == 3
79 % 5 == 4
80 % 5 == 0
Etc.

所以无论 0 到 32767 之间的随机数是多少,余数永远不会是 5,因此不可能得到 6 的骰子数(根据上面的说法)。

不确定您是否会理解我的意思,但非常感谢您的帮助。

【问题讨论】:

  • 问题是什么?你自己回答了。
  • rand() 不会返回 0 到 32767 之间的数字。请先阅读手册
  • 在 C 中 % 实际上是余数而不是模运算符。
  • 你是对的。这是作者的一个简单错误。

标签: c random modulus


【解决方案1】:

dice = (rand() % 5) + 1;

正如您分析的那样,这将生成一个介于 1 到 5 之间的随机数。书中的% 5 可能只是一个错字。要获得 1 到 6,它需要是 % 6

【讨论】:

    【解决方案2】:

    首先,您必须了解模 (%) 的工作原理。如果您说 10 并将其除以 5,您将得到 2,余数为 0,因此 10 % 5。当您 mod(modulo) 5 时,您可能得到的余数范围是 0 - 4。请记住,可能的余数如果从 0 到 x-1,除以 x 时会得到。因此,在您使用骰子程序的情况下,您需要 1 到 6 范围内的数字(骰子的面),因此您将修改 6 并将该数字加 1 以进行必要的转换。 (rand() % 6) + 1

    【讨论】:

    • 谢谢大家...所以这就是我的想法... % 5 可能是书中的错字。再次感谢您与我确认这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2015-06-29
    • 2012-02-29
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多