C++知识碎片整理(8)——生成随机数

关于生成随机数,做一记录

通常,使用如下方式生成随机数。

生成[start,end]的整随机数

srand((unsigned)time(NULL));
cout<<(rand() % (end-start+1)) + start<

产生一定范围随机数的通用表示公式
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

然而需要深入研究的是:生成随机数是否真的随机:
仔细想一下,这个结果是随机的吗(当然,我们不考虑rand()函数的伪随机性)?
不是的,因为rand()的上限是RAND_MAX,而一般情况下,RAND_MAX并不是N的整数倍,那么如果RAND_MAX % = r,则0——r之间的数值的概率就要大一些,而r+1——N-1之间的数值的概率就要小一些。还有,如果N > RAND_MAX,那该怎么办?

未完待续

参考文献:
http://blog.sina.com.cn/s/blog_79ab4be10100uzrj.html
http://www.bianceng.cn/Programming/cplus/201009/19202.htm

2017/2/3批注:
Java随机数使用Math.random()静态方法会返回一个[0.0,1.0]双闭区间的双精度浮点数,然后可以通过强制类型转换转为整数(去尾)。例如生成1到50的整数:int x=1+(int)(Math.random()*50)

你可能感兴趣的:(c语言,C++)