我想用rand生成一个随机数,如下所示:
return a + ( rand( ) % n );
Run Code Online (Sandbox Code Playgroud)
其中a是移位值(即,期望的连续整数范围中的第一个数),并且n是缩放因子(即,期望的连续整数范围的宽度).
- C如何编程第6版 - Deitel
我把它写成:
return 1 + ( rand( ) % 1000 );
Run Code Online (Sandbox Code Playgroud)
它的工作原理,但是当我编写代码如下:
return 1000 + ( rand( ) % 1112 );
Run Code Online (Sandbox Code Playgroud)
我最终得到了荒谬的大数字,例如1756年和1877年.那是最后两次输出.
我将值作为整数返回到printf语句中的函数调用,但我对工作语句做了同样的事情,所以我不认为这是我调用函数的方式.
我究竟做错了什么...?
你没有做错任何事.你的期望是什么错.
a是它可以生成的最低可能数,但它可以生成的最高数不是n ... n是范围大小,因此它可以生成的最大数是a + n.重要的不仅仅是复制算法和代码,还要理解它的工作原理.让我们来看看:
return 1000 + ( rand( ) % 1112 );
Run Code Online (Sandbox Code Playgroud)
rand()的范围是多少?0和RAND_MAX之间的任何数字(这是一个非常大的数字.
(rand()%1112)的范围是多少?首先,查看模运算.将正整数除以1112时可能存在的剩余部分是什么?它可能是0(例如,0/1112),或者高达1111 1111/1112的余数为1111)但之后它会循环回来(1112/1112的余数为0,1113/1112的余数为1,等等).
现在,1000 +的范围是什么(0到1111之间的任何数字)?