C rand()骰子问题

时间:2016-10-16 16:38:22

标签: c random modulus

我是C的新手,我正在读一本关于它的书。我刚刚遇到rand()函数。该书指出,使用rand()会返回0到32767之间的随机数。它还说明您可以使用%(模数运算符)来缩小随机数。
下面是一个示例:以下表达式在变量dice

中放置1到6的随机数
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个数字(根据上述说法)。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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