rand()函数

目录

一、rand()

二、srand()

三、使用rand()和srand()产生指定范围内随机整数的方法


一、rand()

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有关

二、srand()

1.srand()函数原理

由于C语言是利用linear congruential generator作为生成器来生成伪随机数,但是这个生成器生成伪随机数,需要一个“种子”来进行运算。而如果我们仅仅调用rand()函数,而没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1,随机种子相同,每次产生的随机数也会相同,解决办法就是使用srand()函数产生随机种子。

为保证每次产生不同的种子,可以使用time(NULL)getpid(NULL)的返回值作为srand的参数,以产生不同的种子,因为:
(1)time(NULL)得到每次程序运行的时间,每一次运行程序的时间是不同的。
(2)getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。

2.调用方法

(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;

三、使用rand()和srand()产生指定范围内随机整数的方法

“模除+加法”的方法

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;

你可能感兴趣的:(算法)