rand函数
c语言提供了rand函数来产生随机数,它包含在<stdlib.h>头文件中。
函数原型为
它产生的随机数范围在0~RAND_MAX,RAND_MAX是依赖编译器实现的,在大部分的编译器上RAND_MAX为32767。但是rand产生的随机数是一个伪随机数。我们通过例子来理解
多组数据输出并多次运行后我们得到的结果都是一样的:
因为rand的产生的随机数是通过某种算法来实现的,它对一个叫“种子”的基准值进行运算,最后产生一个伪随机数。这个种子的默认值为:1。
所以这里我们需要通过调用srand函数来更改这个种子的值。
srand函数
c语言提供了一个srand函数来初始化随机数的生成器,或者说“用来改变随机数生成器的初始状态”。srand的函数原型为:
void srand(unsigned int seed);
通过srand的参数seed来设置rand函数生成随机数时的种子。只要种子发生了变化,那产生的随机数也就会发生变化。
只要seed是一个随机数,那么rand函数的种子也是一个随机数,最后生成的数也必定是个随机数,但是在生成随机数的时候又需要一个随机数,这不就矛盾了吗?
所以这里要我们需要用到time函数。
time函数
c语言提供了一个time函数用来获取程序运行的时间,包含在头文件<time.h>中,它的函数原型为:
time_t time (time_t* timer);
time函数会返回一个从1970年1⽉1⽇0时0分0秒到当先日历时间的时间差,也叫做时间戳。我们往time函数里传入一个空值NULL,那么它返回的值就只是这个时间差。
time(NULL);
随机数猜数游戏
代码其实很简单,不知道的点可能就是前面讲的函数,因为可能没有接触过。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("*********************************\n");
printf("************1. paly ************\n");
printf("************0. exit ************\n");
printf("*********************************\n");
}
void game()
{
int guess = rand()%100+1;//控制随机数的范围在0~100之间
int input = 0;
int count = 7;
while(count)
{
printf("请输入你猜的数: ");
scanf("%d", &input);
if (input > guess)
{
printf("猜大了\n");
}
else if (input < guess)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了!\n");
break;
}
count--;//猜错一次,次数减一;
}
if (count == 0)
{
printf("没机会了 ");
system("shutdown -s 0-t 60");//60秒后关机
}
}
int main()
{
srand((unsigned int)time(NULL));//讲时间戳强转为unsigned int类型
int n;
do {
menu();
scanf("%d",&n);
switch (n)
{
case 1:printf("开始游戏"); game(); break;
case 0:printf("游戏结束"); break;
default:printf("请重新输入:");
break;
}
} while (n);
return 0;
}