C语言基础-随机数
随机数
在很多编程场景中,我们都需要用到随机数,例如抽奖程序、游戏机制、测试数据等。在 C 语言中,我们可以使用标准库函数 rand() 来生成随机数。
一、rand():生成随机整数
函数原型:
#include <stdlib.h>
int rand(void);
- 返回一个 [0, RAND_MAX] 之间的整数(
RAND_MAX通常为 32767); - 每次运行程序生成的随机数默认是固定的序列。
示例:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int r = rand();
printf("随机数:%d\n", r);
return 0;
}
多次运行上面的代码,输出结果是一样的 —— 这是因为没有设置“种子”。
二、srand():设置随机数种子
为了让每次程序运行时生成的随机数不同,需要使用 srand() 设置随机种子。
典型用法:
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL)); // 设置种子为当前时间
printf("随机数:%d\n", rand());
return 0;
}
time(NULL)返回当前的时间戳;srand()通常只在程序开始时调用一次;- 使用相同种子,
rand()会生成相同的随机数序列。
三、生成指定范围的随机数
通用公式:
rand() % (max - min + 1) + min;
示例:生成 1 到 100 之间的随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL)); // 初始化种子
int r = rand() % 100 + 1; // [1, 100]
printf("随机数:%d\n", r);
return 0;
}
四、生成浮点随机数
C 标准库不直接支持浮点型随机数,可以手动转化。
示例:生成 [0.0, 1.0) 之间的随机浮点数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
float r = (float)rand() / (RAND_MAX + 1.0f);
printf("随机小数:%f\n", r);
return 0;
}
五、常见用法示例
1. 模拟掷骰子(1~6)
int dice = rand() % 6 + 1;
2. 生成 n 个 0~99 的随机数
for (int i = 0; i < n; i++) {
printf("%d ", rand() % 100);
}
3. 随机选择数组元素
char *colors[] = {"red", "green", "blue"};
int index = rand() % 3;
printf("随机颜色:%s\n", colors[index]);
六、常见误区与注意事项
| 误区/问题 | 原因说明 | 解决方案 |
|---|---|---|
| 每次运行结果都相同 | 没有调用 srand() 设置种子 |
添加 srand(time(NULL)) |
每次循环中都调用 srand |
每次种子相同,导致数值相同 | srand() 只需调用一次 |
rand() % n 非均匀分布 |
rand() 低位不够随机,尤其在非 2^n 的范围内 |
可使用更复杂的算法生成均匀分布(例如 Mersenne Twister) |
七、完整练习示例:生成 10 个 1~50 的随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
printf("生成 10 个 [1, 50] 的随机数:\n");
for (int i = 0; i < 10; i++) {
int r = rand() % 50 + 1;
printf("%d ", r);
}
printf("\n");
return 0;
}
小结
| 函数 | 作用 |
|---|---|
rand() |
生成伪随机整数 |
srand() |
设置随机种子 |
time() |
获取时间戳(常用于种子) |
rand() % n + x |
生成指定范围内的数 |
rand()生成的是伪随机数,安全性不高;- 仅适用于一般用途,不建议用于加密或高强度随机性需求。
本文来自博客园,作者:ffff5,转载请注明原文链接:https://www.cnblogs.com/ffff5/p/19012751

浙公网安备 33010602011771号