我们在使用或者说创造变量的时候都是自己赋值初始化,但是有的时候我们需要随机数。
随机数顾名思义:由电脑随机产生的数字。
在C语言中,提供了一个函数rand,该函数可以产生随机数。
int rand(void);
rand
:函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767。
注意:rand函数的使⽤需要包含⼀个头⽂件是:
stdlib.h
我们利用rand 产生随机数看一看,多产生几个看看。

既然是随机数,那么每次产生的数字都应该不一样,我们在重新运行一次看看。

我们发现两次产生的随机数都是一样的,这和我们所说的随机不久冲突了?
为什么?
这就要介绍rand的原理:
其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正 的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函 数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦。
通俗一点:rand就像我们种下一个种子产生慢慢成长,但是种子是固定的所产生的东西也就是相对固定的,就不会是随机的,而是
伪随机
。
我们就需要产生随机的种子。恰好就有一个随机种子的创造者————
srand:
⽤来初始化随机数的⽣成器的,也就是产生种子。
srand函数原型如下:
void srand(unsigned int seed);
我们在程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随 机数
,这就又发生矛盾了,就像我之前闲暇时间看到的一个发明:光照手电筒:需要光产生电,从而产生光?我们目的是光,我们却为了光而创造光,自相矛盾。
我也不理解,所以我们还需要产生一个srand的随机数赋给他,他才能给rand创造随机数。
所以我们怎么产生呢?
在c语言的里面,
我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
介绍一个新函数——time
函数类型如下:
time_t time (time_t* timer);
介绍:
time 函数会返回当前的⽇历时间,其实返回的是
1970年1⽉1⽇0时0分0秒到
现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类 型,但是这种为了方便都是重定义,
*所以我们要么重定义要么自己类型转化
。
time函数的参数
ti timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。我们可以定义一个地址存放但一般这个数据没有多少意义我们一般用 NULL,如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做
:
时间戳
。
百度搜时间戳可以搜到详细工具:

这样就可以产生随机数了。
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
}
我们连续产生两次看看是不是随机数
我们可以观察到两次产生数字完全随机。
接下来讲一下
设置随机数范围:
假设我们需要产生0~99的随机数我们怎么办?
这时候就需要用%,这样无论这个给数多大操作完以后都会在0~99内。
rand() %100;//余数的范围是0~99
如果是1~100呢?我们只需要在上面产生的范围边界都加1就可以了。
rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100
简单写一下看看;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n", rand()% 100 + 1);//%100的余数是0~99,0~99的数字+1,范围是1~100);
printf("%d\n", rand() % 100 + 1);
printf("%d\n", rand() % 100 + 1);
printf("%d\n", rand() % 100 + 1);
printf("%d\n", rand() % 100 + 1);
}
我们可以观察一下:
产生的数字都在1~100之间。
那么复杂一点点?
100到200随机数:
100 + rand()%(200-100+1)
//余数的范围是0~100,加100后就是100~200
推广一下可以得到:如果要⽣成m~n的随机数,⽅法如下:
n + rand()%(m-n+1)
接下来是一个简单应用猜数字游戏:
#define _CRT_SECURE_NO_WARNINGS 1
/*猜数字大小游戏*/
/*增添了一些小东西*/
#include<stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
void menu()//主菜单
{
printf("********************\n");
printf("* 菜单 *\n");
printf(" 1.play \n");
printf(" 2.exit \n");
printf("*********************\n");
}
void game()//游戏界面;
{
int ret = rand()%100 + 1;
int count = 5;//设置最多猜5次机会
int guess = 0;
//printf("%d", ret);查看本次随机值;
printf("注意你只有5次机会\n");
printf("游戏开始,请输入你猜的数字:\n");
while (1)
{
scanf("%d", &guess);
if (guess < ret)
{
printf("你猜的数太小了\n");
}
else if (guess > ret)
{
printf("你怎么猜那么大!\n");
}
else if(guess==ret)
{
printf("可算猜对了,正确答案就是 %d\n", ret);
heart();
break;
}
count--;
if (count<=0)
{
printf("游戏失败!\n");
//system("shutdown -s -t 6");//关机代码,慎重
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
system("color 09");
do
{
menu();
printf("请选择:->_");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误!重新选择\n");
break;
}
} while (input);
}
这就是随机数产生的介绍。