Kir*_*rov 11
你添加1,因为你想要随机数1-10,而不是0-9,%如果没有这个,你会想做什么+1.
例如,10 % 10 == 0和9 % 10 == 9,所以这给你0-9.
添加+1将"移动"此间隔为1-10-> 10 % 10 + 1 == 1和9 % 10 + 1 == 10
编辑:对不起,忘了你的srand问题.
rand()生成相同的数字序列,除非在调用之前调用srand并"种子"具有不同值的随机数生成器rand().因此,这里time(0)使用当前时间为随机数生成器播种,为您提供所有时间的不同值rand()
rand()返回int范围[0,RAND_MAX]中的a.rand() % 10返回int范围为[0,9]的a,因为非负x模k最多为k -1.添加1将范围移至[1,10].
(从结果rand() % k是不保证是均匀分布的,即使你打补丁了,这实在是生成随机数的穷人的方式,不推荐用于生成加密的密钥等.走强RNG库的一部分升压. )
srand(time(0))获取当前时间,希望用户随机执行程序.如果程序在时间t和t + 1s执行,则随机数生成器将确保它返回非常不同的结果.如果你不播种它,你每次都可能得到相同的结果.不过,我不确定C标准对此有何看法.在任何情况下,如果您在运行了很长时间的应用程序中播种一次,rand()最终会重复开始.
(这反过来是穷人为RNG播种的方式.在Linux或BSD上,从特殊文件中读取/dev/random以获得"真正的"随机种子.或者,检查您的操作系统是否能以至少微秒的粒度返回时间.)
当您执行"模数"算术时,您会在分割时得到余数.所以rand()给你一个整数,它rand() % 10是一个0到9之间的数字.加1得到一个1到10范围内的数字
随机数生成器将始终生成相同的数字序列,除非您先将它们播种.srand(time(0))"种子"随机生成器,其数量基于当前时间(以秒为单位).理论上说,你将在不同的时间运行它,因此每次都会以不同的方式播种它,因此每次运行程序时都会得到不同的数字序列.