有趣的rand()和srand()函数
最近陶醉于重新回味C/C++的学习过程,比如发现了一些好玩的游戏,通过对这些小函数的思考,也过得挺开心的。
最近一直萦绕在怀的是rand()和srand()函数,别小看这两个函数,他们可是随机数的产生者,不过话说回来,他们不是真的随机数,我们姑且叫他们“随机数”吧。
其实rand()和srand()函数产生的随机数是伪随机数,其实就是传入一个参数,然后通过某种算法,产生一些足够杂乱的“随机数”。当我还没有了解到C语言还有产生随机数的函数时,针对随机数我的思考方向就是利用一个杂乱的算法得到一些杂乱的数。(不信,不信就拿一个固定的种子试试,结果是每次产生的随机数是相同的。)
然而系统对于随机数的要求并不高,只要看上去是随机的即可。而我感兴趣的是为什么rand()和srand()总是形影不离。只要出现了rand()的地方,它的前面一定埋了一粒“种子”。大概srand()就是得名于seed of random 吧。
MSDN这样用
void main(); { int i; srand((unsigned int)time(NULL)); for(i=0;i<5;i++) {cout<<rand()<<endl; } } |
查看srand()和rand()的使用知道srand函数返回值为空,但是需要传入一个int参数,而rand函数恰好相反。于是我有点怀疑,为什么C语言的缔造者不把它们两个合为一体,变成int rand(int i) ?
如果有哪位“大虾”级的人物知道,麻烦告诉小弟一声。
这两个函数还有很经典的用法:
1、产生介于a和b之间的随机数
2、产生介于0-1的随机数
呵呵上面两条可谓经典呀,一个是用小的加上它们的差(因为值域为最小值加最小值到最大值加最大值)
比如:rand()%5+5 产生介于5 到10 之间的随机数 |
产生介于0-1的随机数
比如:(double)rand() / (RAND_MAX + 1) * (range_max - range_min) |
算法这个东西,用的好就可以省去很多功夫。: D
转载于:https://blog.51cto.com/bibodeng/517202