目录
一、rand()
二、srand()
三、使用rand()和srand()产生指定范围内随机整数的方法
rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的
rand()会返回一个范围在0~RAND_MAX(至少是32767)之间的伪随机数(整数)
在调用rand()函数之前,可以使用srand()函数设置随机数种子,rand()函数在调用时,自动设置随机数种子为1,随机种子相同,每次产生的随机数也会相同
rand()函数需要的头文件是:
rand()函数原型:int rand(void)
使用rand()函数产生1~100以内的随机函数:int number 1 = rand() % 100 + 1 ;
使用rand()函数产生一个(a,b)区间的数num,可以使用以下两种方式:
(1)num=a+(b-a+1)*rand()/(RAND-MAX+1.0);
(2)a+rand() %(b-a+1);
例如,随机产生1-10的数:
(1)
#include
#include
int main()
{
int i, j;
for (i = 0; i < 10; i++)
{
j = 1 + ((int)(10 * rand() / (RAND_MAX + 1.0)));
printf("%d ", j);
}
return 0;
}
(2)
#include
#include
int main()
{
int i, j;
for(i = 0; i < 10; i++)
{
j = 1 + rand() % 10;
printf("%d ", j);
}
return 0;
}
多次运行,结果相同,原因与下面的srand有关
由于C语言是利用linear congruential generator作为生成器来生成伪随机数,但是这个生成器生成伪随机数,需要一个“种子”来进行运算。而如果我们仅仅调用rand()函数,而没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1,随机种子相同,每次产生的随机数也会相同,解决办法就是使用srand()函数产生随机种子。
为保证每次产生不同的种子,可以使用time(NULL)和getpid(NULL)的返回值作为srand的参数,以产生不同的种子,因为:
(1)time(NULL)得到每次程序运行的时间,每一次运行程序的时间是不同的。
(2)getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
(1)time()函数法:添加srand(time(NULL))语句,注意1不要将该语句放到循环中,否则每次执行会出现10个相同的数
#include
#include
int main()
{
int i, j;
srand(time(NULL));
for (i = 0; i < 10; i++)
{
//j = 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0));
j = 1 + (int)rand()%10;
printf("%d", j);
}
return 0;
}
(2)getpid()函数法:添加srand(getpid(NULL))语句,注意1不要将该语句放到循环中,否则每次执行会出现10个相同的数
#include
#include
int main()
{
int i, j;
srand(getpid(NULL));
for (i = 0; i < 10; i++)
{
//j = 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0));
j = 1 + (int)rand()%10;
printf("%d", j);
}
return 0;
}
srand()函数需要的头文件仍然是:
srand()函数原型:void srand ( unsigned int seed ) ;
srand()用来设置rand()产生随机数时的随机数种子,初始化随机数的生成,参数seed是整数,通常可以利用 time(0)或getpid(0)的返回值作为seed ,程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数时的种子,只要种子在变化,每次生成的随机数序列也就变化起来了
使用srand()和rand()产生1~100以内的随机整数:
srand(time(0));
int number 1 = rand() % 100 + 1;
“模除+加法”的方法
because,对于任意数,0 <= rand () % (n-m+1) <= n - m
so,0+m <= rand() % (n-m+1) + m <=n-m+m
so,如果要产生[m,n]范围内的随机数num,可用:
int num=rand() % (n-m+1) + m;
其中的rand() % (n-m+1) + m算是一个公式,记录一下方便以后查询
比如产生10~30的随机整数:
srand(time(0));
int a = rand() % (21) + 10;