srand(time(0))
和rand()
天生一对,就像英语老师口中心心念念的固定搭配一样。
三个函数
rand
函数就像是调用预设好的一系列数字(模板),它是伪随机数,不能做到真正的随机。我们不妨可以试一下,只调用rand()
函数的话,运行结果永远是41
(C++版本不同可能会有差异)。
# include <bits/stdc++.h>
int main (){
printf("%d", rand());
return 0;
}
41
--------------------------------
Process exited after 0.324 seconds with return value 0
请按任意键继续. . .
为此,就有了srand()
函数,专门负责打乱模板。
可是,算法存在确定性,srand()
函数是需要输入数据的,它会根据输入的数据来打乱模版。但是,给它一个确定的值,最后得出来值还是固定的;我们只有给它输入一个随机数,最后得出来值才是随机数。这就陷入了一个无限死循环,看来得另谋出路。
“光阴似箭,日月如梭。”、“逝者如斯夫,不舍昼夜”、······古人的智慧已经告诉了我们答案——时间是不断变化的。
因此,看上去跟随机数没有一点关系的time()
函数就闪亮登场了。time()
得到的值只与运行时的时间有关,而且,该函数的精度很高,想“卡点”是几乎不可能的。这才是真正的名义上的随机数。
然而,既然time()
函数已经几乎可以100%的做到随机数了,干嘛还要rand()
函数和srand()
函数?好看?高级?其实只是起到加密的作用。想想,如果你运气特别特别特别好,真就卡到点上了,那time()
也就无能为力了。但是,将time()
函数返回的值再输入到srand()
函数里面,rand()
函数再输出一个虽然确定,但却毫无相关的值,不就相当于是起到了加密的作用了吗?而密码本就是模板。
当然,你若不想加密,那也可以只使用time()
函数。因为它确实随机了。
限制随机数范围
想一想,对一个数字进行什么操作(运算),最后得到的值有确定的取值范围的?
这就得跟除法联系在一起了。
余数一定小于除数!
那么,把原随机数放在被除数位置,除数就是我们的限制条件,余数就是最终得到的结果。
比如:想要得到一个0~3之间的随机整数,除数就是3+1=4:
# include <bits/stdc++.h>
int main (){
printf("%d", time(0)%4);
return 0;
}
那么,想要得到一个1~4之间的随机整数呢?余数再加一就好了。
# include <bits/stdc++.h>
int main (){
printf("%d", time(0)%4+1);
return 0;
}
因此,可以总结出公式:
随机数 % 范围大小(最大值 − 最小值) + 最小值 随机数\%范围大小(最大值-最小值)+最小值 随机数%范围大小(最大值−最小值)+最小值
注:中文括号是解释说明的意思。
那么,如果需要的取值范围最大超过了原随机数呢?也很简单,先将原随机数加上任意一个数即可。毕竟,随机数加上一个数后,还是一个随机数。