1.rand函数
C语言提供了一个函数叫rand,这个函数可以生成一个随机数,函数原型如下所示:
int rand (void)
rand函数会返回一个数,这个随机数的范围是在0-RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767
注意rand函数的使用需要包含一个头文件是stdlib.h
让我们来测试一下rand函数
从上图中我们可以发现程序成功生成了10个随机数,那我们再一次运行结果,看看会发生什么?
我们发现第二次运行结果和第一次相同,也就是说其实rand函数生成的随机数其实是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。而rand函数是一个叫种子的基准值进行运算生成的随机数。
之所以前面每次运行程序产生的随机序列是一样的,那是因为rand函数生成随机数的默认种子是1.如果要生成不同的随机数,就要让种子是变化的
2.srand函数
C语言中又提供了一个函数叫srand,用来初始化随机数生成器的,srand原型如下
void srand (unsigned int seed)
程序在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了
也就是说srand的种子如果是随机的,rand函数就能生成随机数,但在生成随机数的时候又需要一个随机数,这就矛盾了
3.time函数
在程序中我们一般是使用程序运行的时间作为种子,因为时间时刻在发生变化
在C语言中有一个函数叫time,就可以获得这个时间,time函数原型如下:
time_t time (time_t* timer)
time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上实际就是32位或者64位的整型类型
time函数的参数timer如果是非NULL指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去
如果time是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做时间戳
time函数使用的时候要包含头文件time.h
我们可以如下改写生成随机数的代码
经过多次运行我们发现每次运行都有差别,符合我们的预期
注意:srand函数是不需要频繁调用的,一个运行的程序只需要调用一次
4.随机数的生成
如果要获得一个0-99的随机数,方法如下:
如果要获得一个1-100的随机数,方法如下
、
如果要获得一个b-c的随机数,方法如下:
5.随机数的应用--猜数字游戏
参考代码如下
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define op 10 //猜数字的次数
int main()
{
int i, number, guess_number;
srand((unsigned int)time(NULL)); //初始化随机数生成器
number = rand() % 100 + 1; //生成一个1-100之间的随机数
printf("please input a number between 1 and 100,you have %d chance\n", op);
for (i = 0; i < op; i++)
{
scanf("%d", &guess_number);
if (guess_number > number)
{
printf("too big,you have %d chance left\n", op - i - 1);
}
else if (guess_number < number)
{
printf("too small,you have %d chance left\n", op - i - 1);
}
else
{
printf("you are right\n");
break;
}
}
if (i == op)
{
printf("game over,the number is %d\n", number);
}
return 0;
}