-2

我正在尝试使用 rand 生成一个随机数,如下所示:

return a + ( rand( ) % n );

其中 a 是移位值(即,所需连续整数范围内的第一个数字),n 是缩放因子(即,所需连续整数范围的宽度)。

-- C 如何编程第 6 版 - Deitel

我把它写成:

return 1 + ( rand( ) % 1000 );

它可以工作,但是当我编写如下代码时:

return 1000 + ( rand( ) % 1112 );

我最终得到了大得离谱的数字,例如 1756 和 1877。这是最后出现的两个输出。

我将值作为整数返回给 printf 语句中的函数调用,但我对工作语句做同样的事情,所以我不认为它是我调用函数的方式。

我究竟做错了什么...?

4

1 回答 1

5

你没有做错任何事。错的是你的期望。

a 是它可以生成的可能的最小数字,但它可以生成的最大数字不是 n... n 是范围大小,因此它可以生成的最大数字是 a+n。重要的是不仅要复制算法和代码,还要理解它为什么起作用。让我们来看看:

return 1000 + ( rand( ) % 1112 );

rand() 的范围是多少?0 到 RAND_MAX 之间的任何数字(这是一个非常大的数字。

(rand() % 1112) 的范围是多少?首先,查找模运算。当您将正整数除以 1112 时,可能的余数是多少?它可以是 0(例如,0/1112),或高达 1111 1111/1112 的余数为 1111)但之后它会循环返回(1112/1112 的余数为 0,1113/1112 的余数为 1,等等)。

现在,1000 + 的范围是多少(从 0 到 1111 的任何数字)?

于 2013-04-06T00:43:59.417 回答