C 随机数语法
在 C 语言中,我们可以使用 <stdlib.h> 标准库提供的 rand() 函数来生成某个范围内的随机整数。默认情况下,rand() 会返回 0 ~ 32767 之间的随机整数,但我们可以通过一定手段来让它生成想要范围内的随机整数。
1. 生成 0 ~ n 之间的整数(包含 0 和 n)
rand() % (n + 1)取模运算符 “%” 会返回除法的余数。rand() % (n + 1) 将 rand() 的结果除以 n + 1,得到的余数将在 0 到 n 之间(包括 0 和 n)。
2. 生成 m ~ n 之间的整数(包含 m 和 n)
m + rand() % (n + 1 - m)首先,rand() % (n + 1 - m) 生成一个 0 到 n - m 之间的随机数。然后,我们加上 m,将范围平移到 m 到 n 之间。
C 随机数示例
接下来,我们通过几个简单的例子来讲解一下 C 语言是如何求随机数的。
示例 1:C 生成 0 ~ n 的随机数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = rand() % (10 + 1);
printf("%d", n);
return 0;
}运行结果如下。
8分析:
rand() % (10 + 1) 表示生成 0 ~ 10 之间的随机整数。
示例 2:C 生成 m ~ n 的随机数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 12 + rand() % (20 + 1 - 12);
printf("%d", n);
return 0;
}运行结果如下。
15分析:
12 + rand() % (20 + 1 - 12) 表示生成 12 ~ 20 之间的随机整数。其中 rand() % (20 + 1 - 12) 等于 rand() % (8+1),然后 rand() % (8+1) 生成的是 0 ~ 8 之间的随机整数。所以 12 + rand() % (8+1) 就是生成 12 ~ 20 之间的整数了。
C 随机数种子
默认情况下,rand() 函数会使用一个固定的种子值(通常是 1)。也就是说,每次程序运行时,它将生成相同的随机数序列。比如前面的两个例子,不管你运行多少次,其生成的随机数都是一样的。
为了获得不同的随机数序列,我们需要使用 srand() 函数来设置一个不同的种子。一种常用的方法是使用当前时间作为种子,因为每次程序运行的时间通常是不同的。这可以通过 <time.h> 头文件中的 time() 函数来实现。
示例 3:使用 “当前时间” 设置随机数种子
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
// 使用当前时间作为种子
srand(time(NULL));
// 生成随机数
int n = rand() % (10 + 1);
printf("%d", n);
return 0;
}运行结果如下。
6分析:
当我们多次运行上面代码,会发现生成的结果已经变得随机了。
time(NULL) 表示返回当前时间的秒数,我们将其作为 srand() 函数的参数,从而为随机数生成器设置了一个随时间变化的种子。
C 随机数应用
在日常生活中,比如在使用微信登录、网站登录等情况中,我们都会看到各种随机验证码。下面,我们尝试使用 C 语言来实现随机验证码的功能。
示例 4:实现随机验证码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
// 使用当前时间作为种子
srand(time(NULL));
// 生成随机数
char result[5]; // 需要 5 个空间来存 4 个字符 + 1 个结束符
int index; // 下标
char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
int length = strlen(str);
for (int i = 0; i < 4; i++)
{
index = rand() % ((length - 1) + 1);
result[i] = str[index];
}
result[4] = '\0'; // 手动添加结束符
puts(result);
return 0;
}运行结果如下。
P2kA分析:
上面这个例子用于生成一个 4 个字符的随机验证码。其中,每一次的运行结果都是不一样的。
实现思路很简单:首先获取 str 的长度 length,然后每一次随机生成一个 0 ~ length - 1 之间的整数值,这样就可以通过下标的方式来拿到 str 中的任意字符了。接着使用一个只会执行 4 次 for 循环,将每一次生成的随机字符添加到 result 中去。最后得到的 result,就是我们想要的 4 位随机验证码了。
