在linux系统中,有提供的API来产生随机数:srand初始化随机种子,rand产生随机数。


rand(产生随机数)表头文件: #include<stdlib.h>
定义函数 :int rand(void)
 
函数说明 :
因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的(伪随机数),rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
 
返回值:
返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。
0~RAND_MAX每个数字被选中的机率是相同的。

 

srand(设置随机数种子)
表头文件:#include<stdlib.h>
定义函数:void srand (unsigned int seed);
 
函数说明:srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

 

下面用实例说明两个函数的使用

rand()

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char **argv)
{
	int i = 0, val = 0;
	printf("RAND_MAX = %d.\n", RAND_MAX);		// 2147483647
	val = rand();
	printf("%d ", val);
	printf("\n");	
/*
如果不想要那么多的位数则可以对产生的随机数进行求余
	for (i=0; i<6; i++)
	{
		val = rand();
		printf("%d ", (val % 6));
	}
*/	
	return 0;
}

srand()

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	int i = 0, val = 0;
	
/*	
通过执行函数的时候进行传参获得种子
	if (argc != 2)
	{
		printf("usage: %s num\n", argv[0]);
		return -1;
	}
	srand(atoi(argv[1]));
*/	
	printf("RAND_MAX = %d.\n", RAND_MAX);		// 2147483647
	srand(time(NULL));
	for (i=0; i<6; i++)
	{
		val = rand();
		printf("%d ", (val % 6));
	}
	printf("\n");	
	return 0;
}

使用时间来作为种子,也是有缺陷的,因为当程序运行比较快的时候,产生的随机数就是一样的

所以在真正使用的时候,会根据具体的情况来进行种子的产生,本例中使用时间只是做为一个演示

 

注明:本博客是根据朱有鹏老师的视频所作的总结

 

 

 


 


 

Logo

更多推荐