生成一个随机数

利用time.h函数生成一个随机数

生成一个”随机数”:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h> // 包含rand()、srand()的头文件
int main() {
int num;
num = rand();
printf("%d", num);
return 0;
}
//直接运行,得到41
//再次运行,得到41
//再再再次运行,还是得到41

会发现这个随机数有个蛋用!!!

问题根源

rand() 函数本身是伪随机数生成器,它的输出是基于一个“种子(seed)”的固定序列:

  • 默认情况下, rand() 的种子是固定值(通常是 1 ),所以每次运行程序,都会生成相同的随机数序列。

解决方法

需要通过 srand() 函数设置随机种子,通常用“当前时间”作为种子(因为时间是持续变化的),步骤如下:

  1. 包含头文件 <stdlib.h><time.h>(获取当前时间的函数);
  2. 在调用 rand() 之前,用 time(NULL) 作为参数调用srand() 设置动态种子

修正后的代码

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h> // 包含rand()、srand()的头文件
#include <time.h> // 包含time()的头文件

int main() {
int num; // 设置随机种子(用当前时间,确保每次运行种子不同)
srand((unsigned int)time(NULL));
num = rand();
printf("%d", num);
return 0;
}
  1. unsigned int 的基本含义
  • unsigned 表示“无符号”,即该类型的变量只能存储非负整数(取值范围是 0 到 2^位数 - 1 ,例如 unsigned int 通常占4字节,范围是 0 ~ 4294967295 );
  • 与之相对的,是普通的 int (有符号整型),可以存储正、负整数和0。
  1. 这里用 unsigned int 的原因

​ 代码中 srand((unsigned int)time(NULL)) 是将 time(NULL) 的返回值( time_t 类型,通常是有符号整数)强制转换为 srand() 要求的unsigned int 类型

  • time(NULL) 返回当前系统时间的“时间戳”(从1970年1月1日至今的秒数),是一个整数
  • 强制转换为 unsigned int 是为了匹配 srand() 的参数类型,避免类型不匹配的警告/错误。

简单说: unsigned int 是“无符号的整数类型”,这里用来适配 srand() 的参数要求。

补充说明

  • rand() 生成的是0到 RAND_MAX (通常是 32767 )之间的整数;
  • 若需要指定范围的随机数(比如 [a, b] ),可以用公式: rand() % (b - a + 1) + a 。
生成一个范围在【0,100】的随机数:
1
2
3
4
//简化
srand(time(NULL));
a = rand()%100 + 1 ;


生成一个随机数
http://example.com/2025/11/05/生成一个随机数/
作者
王柏森
发布于
2025年11月5日
许可协议