随机数学习整理

xiaoxiao2021-02-27  273

rand()函数:

rand()的内部实现用的是线性同余法,它不是真的随机数,因其周期特别长,故在一定的范围内可以看成是随机的。这种伪随机数是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)目前,计算机中用来产生随机数的算法基本上都是“线性同余”法。rand()返回一随机数值的范围在0至RAND_MAX之间,其中RAND_MAX的范围是32767到2147483647之间(int型)。0~RAND_MAX每个数字被选中的机率是相同的。用户未设定随机数种子时,系统默认的随机数种子为rand()产生的是伪随机数,它每次执行时基于的为随机数序列是相同的,若要让这个伪随机数列不同的话,就需要用随机数发生函数srand()初始化它,即对随机数种子进行“播种”。

使用随机数生成二人组rand()和srand()来生成随机数

首先调用一次srand函数初始化随机数种子。代码如下: srand((unsigned)time(NULL)); 然后调用rand函数生成随机数。 1.产生一个范围内的随机数:

要取得[a,b)的随机数

a + (int)(b-a)*rand()/(RAND_MAX + 1);

要取得[a,b]的随机数

a + (int)(b-a)*rand()/(RAND_MAX);

要取得[0,1]之间的浮点数

rand()/double(RAND_MAX);

 2.筛选型随机数

如希望取得0~99的随机数,但不能是6或是5的倍数

int x = (int)(100 * rand()/(RAND_MAX + 1.0)); while((x == 6) || (x % 5 == 0)) { x = (int)(100 * rand()/(RAND_MAX + 1.0)); } 3.从一组乱数中取随机数

可以用数组将这些数存储,然后生成一个0~size-1范围内的随机数,以其对数组做下标运算即可实现随机取数。

转载请注明原文地址: https://www.6miu.com/read-3295.html

最新回复(0)