我正在尝试使用rand生成一个随机数,如下所示:
return a + ( rand( ) % n );
其中a是移位值(即所需连续整数范围内的第一个数字),n是比例因子(即所需连续整数范围的宽度)。
- C如何编程第6版 - Deitel
我把它写成:
return 1 + ( rand( ) % 1000 );
它可以工作,但是当我按如下方式编写代码时:
return 1000 + ( rand( ) % 1112 );
我最终得到了荒谬的大数字,例如1756年和1877年。那是最后两次输出。
我将值作为整数返回到printf语句中的函数调用,但我对工作语句也是如此,所以我不认为这是我调用函数的方式。
我做错了什么......?
答案 0 :(得分: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之间的任何数字)的范围是多少?