浅析C++语言中的随机数的应用

2017-06-01 23:57孙灵杰赵晓东方欢
电脑知识与技术 2017年8期
关键词:种子

孙灵杰 赵晓东 方欢

摘要:该文针对C++语言中的随机数生成以及使用方法进行分析和探讨,主要对各种随机数的生成算法进行设计。在C++中,随机数的生成主要通过函数文件中的ramt()和srand()函数。首先,阐述rarut()和srand()两种函数共同的使用方法和模式,并分析了各自的缺点,然后以现实中的问题和实际的题目为例,通过实际编程来阐释随机数生成函数的使用方法,实现了不同概率的随机数的产生、不连续的随机数的产生等方法。

关键词:随机数;伪随机数;种子;随机数生成器

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)08-0098-03

1概述

经过对C++语言的学习,笔者发现书中对于随机函数的使用只是一概而过,没有进行深入的阐释和联想。文献是到“其实计算机不会产生绝对随机的随机数,只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,计算机只能生成相对的随机数,即伪随机数。实际上,系统是将0~32767之间的整数“随意”地排成了一个“随机数表”,程序第一次调用rand()函数是取“随机数表”中的第一个,第二次调用rand()函数是取“随机数表”的第二个,由此类推。即使我们运行了多次,但都是在同一个系统上,而同一个系统产生的“随机数表”又始终是相同的,因此每一次运行的结果都是一样的。”现有文献大都集中在介绍随机函数的用法,本文从实际应用出发,分析和研究各种不同类型随机数的生成算法,并进行实验分析。

2随机数的生成的原理(C++框架下)

2.1C++中随机数的定义

C++语言中使用cstdlib中的函数rand()进行生成,但生成的只是伪随机数。因为rand()的内部实现是用线性同余法做成的,生成随机数时,需要指定一个种子,用srand()来设置rand()产生随机数时的随机数种子,如果每次srand()都设相同值,rand()所产生的随机数值每次就会一样。通常可以利用time(0)的返回值或NULL来当做seed,这样可以输出不同的随机数。

2.2随机数随机重现试验

线性同余法产生对随机数是伪随机数,下面进行试验,测试具体伪随机数的特点。

通过图1的实验结果,可以发现当给予相同的随机数函数种子时,他会输出相同的数字,这就是“伪随机数”名字的来历。为了设计出不同的随机函数,C++引入函数time(0)(电脑上确切的时间),用time(0)作为种子,可以实现随机数函数每次的种子都不同,从而产生出不同的随机数,让数字的产生更加接近随机。

2.3验证伪随机数是否足够随机的实验

通过图2,由此看出0-9的各个数字,当随机数数量足够多时,产生概率是近似相同的,因此Fang()函数产生的伪随机数是可以近似看作随机数的。

3随机数常见的使用方法

3.1随机数小数(不考虑进位)的产生

随机数产生器rand()是根据其后%n中的n来确定产生的数字的,会产生出所有小于n的整形数字(包括0),由于c++语言中%(取余函数)只能输出整数,所以随机小数是不能直接产生的,必须运用其他方式。

从图3可以看出,虽然rand()函数只能输出整数,但通过除法运算,可以输出小数,再加上整数就可以输出具有大于1的随机小数,通过实验结果可以证明算法的正确性。

3.2随机数小数(考虑进位)的产生

通过对rand()函数产生数据的数字类型变换从而为浮点数创造了可能,/10可以制造出一位小数,/100可以制造出两位小数,如果想随机输出3-5之间的小数只需要将%n中的n改为大于10的数字,通过小数点进位的方式来进行。例如:

图4这为小数随机数(跨位数)的生成算法。

分析:关于进位,可以看做是大于1的小数和整数的相加,通过rand()随机输出0-20的随机数,除以10后,便成为随机输出0.0-2.0之间的随机小数,加上3后成为随机输出3.0-5.0之间的随机数,根据实验结果,这种算法正确。

3.3任意数的随机输出

C++中rand()只能通过取余函数来进行模拟,如果要随机出特定的随机数,譬如1、4、5、9这四个随机数,我们可以通过if来进行筛选。

分析:随机数只能连续输出,如果要输出特定的数字只能依靠if判断语句,进行随机数的筛选,如果是特定的数字就输出,不是就继续随机输出下一个数字。通过图实验结果证明这种算法正确。

3.4不同比例随机数输出

在实际生活中随机数的输出概率并不均等,那么依靠c++语言中,运用rand()函数仍可以进行输出,例如0、1、2、3、4、5、6这些数字,而0、1、2、3这三个数字比其他数字更容易输出50%。

分析:第一個for循环按等比例输出随机数,第二个for循环通过再次随机输出特定相同数字相同的次数,通过判断语句,只打印比例多出来的数字,从而使特定数字多出50%的概率输出,通过实验结果,得出这种算法是正确的。

3.5任意0、1串的输出

在实际编程操作中,很多时候都要运用0、1串的输出。

分析:运用for()循环进行具体次数的输出使字符串的输出更加方便。

4小结

我们在生活中也会遇到很多有关随机数的问题,如随机抽奖,随机点名等等。本文介绍了c++中随机数的使用以及产生带小数的随机数,进位的随机小数,随机输出不连续的数字,输出不同概率的随机数以及一种可以解微积分的方法,对一些实例进行了较为详细的解释,并对结果进行了分析,有助于更好的使用随机数函数,为现实生活中解决随机数函数问题打下现实基础。

猜你喜欢
种子
种子的归处
桃种子
可怜的种子