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范围内的随机数,以其对数组做下标运算即可实现随机取数。