随机数和随机数种子——学不会找我

文章目录

      • 1.rand()函数的功能是用来产生一个数
      • 2.srand()函数的功能是用来播种随机数种子,能够产生一个随机数
      • 3.时间戳
      • 4.随机数的范围
      • 5.随机数的应用

在实际开发中,我们有时会用到随机数,今天我们来研究一下随机数是如何产生的。

1.rand()函数的功能是用来产生一个数

随机数和随机数种子——学不会找我_第1张图片

rand()的内部实现使用线性同余法(一种非常复杂的算法做的,他不是真的随机数,因为其周期特别长,在一定范围内可看成随机数。rand()返回的随机数值的范围在0~RAND-MAX之间。RAND-MAX的范围最少是在32767之间(两个字节int),用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND-MAX中每个数字出现的概率是相同的。如果未设定随机数种子时,系统默认的随机数种子为1。rand()产生的是伪随机数,每次执行时是相同的,如果想产生一串不同的随机数,则需要用srand()函数初始化它。

2.srand()函数的功能是用来播种随机数种子,能够产生一个随机数

随机数和随机数种子——学不会找我_第2张图片

随机数和随机数种子——学不会找我_第3张图片

srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用time(0)的返回值或NULL来当作seed。如果每次seed设置的值都一样,rand()所产生的随机数值每次都一样。即相同的种子对应相同的数值

3.时间戳

srand()函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数(时间戳)。

随机数和随机数种子——学不会找我_第4张图片

#include
#include
int main()
{
//设置一个随机数种子
	srand((unsigned int)time(NULL));
	for(int i = 0;i<5;i++)
	{
  	  printf("rand = %d\n",rand());
	}
}

随机数和随机数种子——学不会找我_第5张图片

srand((unsigned int)time(NULL))

NULL本质上是空指针,意为不使用time函数的参数,传给它一个空指针

time函数会返回time_t,time_t就是64位整数long long 类型

srand需要unsigned int 类型,我们把他强转为unsigned int 型

1)这里的NULL还可以使用0。类型我们一般都是获取无符号整形,这个获取的随机数也只能是整数。

2)如果time并非空指针的话,此函数也会将返回值存到time指针所指的内存。

3)srand函数不可以放入循环内部,否则(1s以内)产生的一直都是一个数(每一秒都会产生一个随机数)。当然你如果非要这么做,也可以在里面加个延迟函数sleep(1);但是我觉得duck不必搞这么复杂,所以上面的代码是最容易实现随机数的了。

4)srand((unsigned)time(NULL))只需要设置一次就可以了,后面产生的数字在一定范围内是随机的。

4.随机数的范围

//随机数的范围
rand()%num //表示范围是0~num-1
rand()%5 //表示0~4
//若是想要范围在ram_num~num
 rand()%90+10 //表示10~99

随机数和随机数种子——学不会找我_第6张图片

5.随机数的应用

#include 
#include 
#include 
void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play **********\n");
	printf("*********** 0.exit **********\n");
	printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
	int random_num = rand()%100+1;
	int input = 0;
	while(1)
	{
		printf("请输入猜的数字>:");
		scanf("%d", &input);
		if(input > random_num)
		{
			printf("猜大了\n");
		}
		else if(input < random_num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
 { 	
	menu();
	printf("请选择>:");
	scanf("%d", &input);
	switch(input)
	{
	case 1:
		game();
		break;
	case 0:
		break;
	default:
		printf("选择错误,请重新输入!\n");
		break;
	}
}while(input);
return 0;
}

随机数和随机数种子——学不会找我_第7张图片

这是个猜数字的小游戏,大家可以试下。注意不要把srand((unsigned)time(NULL)) 放到game函数里面,因为你每一次猜数字,它都会重新设置一个种子,生成一个随机数。这要是猜中了,那不得是单身十年换来的。

你可能感兴趣的:(C语言,c语言)