C 随机数

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 位随机验证码了。

上一篇: C 平方根

下一篇: C 数字转换为字符串

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号