7
星期一
2020年06月
闰四月十六
考试必过!
Pass!
为什么我的随机数不随机?
在不同的编程语言中,往往有不同的产生随机数的方法。但是这些或多或少都不是真正的随机数,多次运行产生的结果均相同或是有规律。这是因为随机数生产的算法是固定的。随机数的产生都要依靠一个“种子”,在这个种子上进行计算后便可生成随机数。
例如我们最常用的rand()函数,它的内部实现就是用线性同余法做的,在一定的范围(0~32767)内可以看做是随机的伪随机数。
接下来,我们来看一下几种真·随机数的产生方法:
使用rand()函数
首先,我们要包含头文件cstdlib.h。
然后,在调用rand()函数前,我们可以先调用srand()函数来重置种子。种子应作为参数传递给srand()函数。因此我们要保证每次运行程序是种子都是不一样的。为此,我们可以利用C++中的time()函数,在每次运行程序时将当前时间作为变量传给srand()。
注意:只能在程序开始时调用一次srand()函数!多次调用会对随机数产生造成不利影响!
随后,通过取模运算,我们就可以产生一个一定范围的随机数了。比如:
r = (rand() % 10) + 1;
可以产生一个范围1~10的随机数。
使用random库
C++11中引入了random库。它提供给了我们更多的选项,而其中任何一个选项都比来自C的rand()这个过时的函数要好。
random库中还包含有常见的概率分布函数。
要使用random库生成随机数。首先要新建一个生成器(generator),然后需要新建一个分布类(distribution),利用它来产生一个符合概率分布的随机数。
废话不多说(说不过来),下面直接上代码:
产生0~99的随机整型数:
一个高性能,灵活且线程安全的模板:
亿点点拓展
事实上,rand()是一个具有严重缺陷的函数,应当能不用尽量不用。2013年,微软的首席软件工程师Stephan T. Lavavej在Going Native活动上发表了演说,详细解释了为什么rand()函数是“有害的”,并介绍了应当如何正确使用random库。
视频链接:
http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
自习室榜单
图文:胡杨
排版:胡杨
审核:刘海伦老师