1.rand函数
C语言中提供了rand函数来生成伪随机数,并不是真正的随机数,真正的随机数是无法预测下一个值是多少的。rand函数是对⼀个叫“种子”的基准值进行运算⽣成随机数。,默认情况下,rand函数生成随机数时,种子为1。只要种子的值不变,rand函数生成的随机数就不会变化。
2.srand函数
2.1:srand通过参数seed来设置种子的值,只有它的参数seed发生变化,种子的值就会发生变化。
2.2:为什么在一个工程中,调用一次srand函数(将time函数的返回值作为它的参数)就可以多次使用rand函数生成随机数?
因为当srand函数运行一次后,种子的值就确定了(由当时的时间戳决定种子的值),生成的随机数序列就确定了。 比如生成的随机数序列50,10,745…,则第一次调用rand函数生成的随机数就是50,第二次调用生成的随机数就是745,第三次调用生成的随机数就是745。只有当下一次程序运行时(srand函数再次运行时),种子的值才会变化,生成的随机序列也就会发生变化。
3:time函数
3.1:时间戳
1970年1月1日0时0分0秒到当下时间之间经过的秒数就是时间戳。C语言中有⼀个函数叫 time ,用于返回时间戳。
3.2:想要获得真正的随机数,就需要每次程序运行时,srand的参数seed的值发生变化,从而使种子的值发生变化,那么如何使得每次程序运行时seed发生变化呢?C语言中通常是将时间戳传给srand函数。
4、生成真正的随机数
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main()
{
srand((unsigned int)time(NULL));
//将time函数的返回值(时间戳)强制转换为unsigned int类型,将它作为srand函数的参数seed,
//每一次程序运行时的时间戳都不一样,参数seed的值就会变化,导致每次程序运行后,rand函数生成的随机数不一样
printf("%d\n", rand());
return 0;
}
5.设置随机数的范围
6.实现猜数字游戏
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("****************************\n");
printf("*******输入1:开始游戏*******\n");
printf("*******输入0:结束游戏*******\n");
printf("****************************\n");
}
void game()
{
//1.生成随机数
int r = rand() % 100 + 1;
//2.猜数字
int guess = 0, count = 5;
while (count)
{
printf("还有%d次机会,请猜数字:", count);
scanf("%d", &guess);
if (guess > r)
printf("猜大了\n");
else if (guess < r)
printf("猜小了\n");
else
{
//直到猜对了才能退出循环,否则就不停的猜下去
printf("恭喜你,猜对了\n");
break;
}
count--;
}
if (count == 0)
printf("所有的机会用完了,游戏失败,正确的数字是%d\n",r);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
//srand函数在整个工程中只需要调用一次即可,即种子只需要设置一次
do
{
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入的数据有误,请重新输入\n");
break;
}
} while (input);
return 0;
}