用rand()生成基本随机数
在C语言里,最常用的随机数函数是rand(),它定义在<stdlib.h>头文件中。每次调用rand(),会返回一个0到RAND_MAX之间的整数。这个值通常是32767,具体取决于编译器。
比如你想模拟掷骰子,取1到6之间的随机数,可以这样写:
#include <stdio.h>
#include <stdlib.h>
int main() {
int dice = rand() % 6 + 1;
printf("你掷出的点数是:%d\n", dice);
return 0;
}这里用% 6得到0到5,再加1就变成1到6,正好对应骰子的六个面。
为什么每次运行结果都一样?
如果你多次运行上面的程序,会发现每次输出的“随机数”其实是一样的。这是因为rand()生成的是伪随机数,它依赖一个叫“种子”的初始值。默认情况下,种子是固定的,所以结果也固定。
这就像是每次打开同一个游戏,怪物刷新的位置总是一样——不是真随机,而是按固定套路走。
用srand()设置随机种子
要让每次程序运行时产生不同的随机序列,得用srand()函数重新设置种子。最常见的做法是结合time()函数,把当前时间作为种子。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
int num = rand() % 100 + 1;
printf("随机生成的数字是:%d\n", num);
return 0;
}time(NULL)返回当前时间的秒数,每秒都在变,所以种子不同,生成的随机数也就不同。只要不是在同一秒内连续运行两次,结果就不会重复。
生成指定范围内的随机数
想生成[a, b]区间内的随机整数,通用公式是:rand() % (b - a + 1) + a。比如生成10到20之间的数:
int random_num = rand() % 11 + 10;这里11是范围长度(20-10+1),加上起始值10,就能覆盖10到20的所有整数。
避免常见坑:别频繁调用srand()
有些人觉得既然srand()能让随机性更强,那就多调几次。其实在一个程序里,srand()只需要调用一次,通常放在main()开头。如果在循环里反复调用srand(time(NULL)),由于time()精度是秒,在同一秒内多次调用会导致种子相同,反而生成一串重复的“随机数”。
实际应用场景举例
写个小程序模拟抽奖,从10个人中随机选3个获奖者。可以用数组存编号,然后随机打乱顺序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int people[10] = {1,2,3,4,5,6,7,8,9,10};
srand(time(NULL));
// 随机打乱数组
for (int i = 9; i > 0; i--) {
int j = rand() % (i + 1);
int temp = people[i];
people[i] = people[j];
people[j] = temp;
}
printf("获奖者是:%d, %d, %d\n", people[0], people[1], people[2]);
return 0;
}这种洗牌算法简单有效,很多小游戏里的抽卡、发牌逻辑都是这么实现的。