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

return a + ( rand( ) % n );



  其中a是移位值(即连续整数所需范围内的第一个数字),n是缩放因子(即连续整数所需范围内的宽度)。
  
  -C如何编程第六版-Deitel


我写为:

return 1 + ( rand( ) % 1000 );


并且它有效,但是当我编写代码时,如下所示:

return 1000 + ( rand( ) % 1112 );


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

我将整数值返回给printf语句中的函数调用,但是我对工作语句进行了相同的操作,因此我不认为它是调用函数的方式。

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

最佳答案

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

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之间的任何数字)的范围是多少?

10-04 13:28