«

C++随机数生成代码解析

点亮灯 发布于 阅读:72 C++


srand(time(0))、rand() % (max - min + 1) + min 的原理与使用

  1. 随机数初始化:srand(time(0))
    作用
    srand() 用于初始化随机数生成器的种子(seed)。

    time(0) 返回当前时间(从1970年1月1日至今的秒数),确保每次运行程序时种子不同,从而生成不同的随机数序列。

    为什么需要 srand(time(0))?
    如果不调用 srand(),rand() 每次运行程序都会生成相同的随机数序列(因为默认种子固定)。

    使用 time(0) 作为种子,可以让程序每次运行时产生不同的随机数。

    示例

    #include <cstdlib>  // for rand(), srand()
    #include <ctime>    // for time()
    int main() {
        srand(time(0));  // 初始化随机种子
        int random_num = rand();  // 生成随机数
        return 0;
    }
  2. 生成指定范围的随机数:rand() % (max - min + 1) + min
    公式

    int random_num = rand() % (max - min + 1) + min;

    生成 [min, max] 之间的随机整数。

    关键点
    rand() % N 的范围是 [0, N-1]

    例如 rand() % 10 生成 [0, 9] 的随机数。

    (max - min + 1) 的作用

    max - min 计算范围大小,但 rand() % (max - min) 只能生成 [0, max - min - 1]。

    +1 是为了让 rand() % (max - min + 1) 的范围变成 [0, max - min],这样 + min 后才能覆盖 [min, max]。

    • min 的作用

    将 [0, max - min] 偏移到 [min, max]。

    示例
    生成 [10, 99] 的随机数:

    int num = rand() % (99 - 10 + 1) + 10;  // rand() % 90 + 10 → [10, 99]

99 - 10 + 1 = 90,所以 rand() % 90 生成 [0, 89]。

    int num = rand() % (99 - 10) + 10;  // rand() % 89 + 10 → [10, 98](漏掉99)

rand() % 89 的范围是 [0, 88],+10 后变成 [10, 98],无法生成 99。

  1. 为什么使用 (max - min + 1) 而不是直接写数字?
    原因
    提高代码可读性

    rand() % (99 - 10 + 1) + 10 比 rand() % 90 + 10 更直观,直接体现范围 [10, 99]。

    便于修改范围

    如果想改成 [20, 50],只需修改参数:

    rand() % (50 - 20 + 1) + 20;  // rand() % 31 + 20 → [20, 50]

而不需要手动计算 50 - 20 + 1 = 31,减少错误。

  1. 完整示例
    生成两个 [10, 99] 的随机数:
    #include <iostream>
    #include <cstdlib>
    #include <ctime>

    int main() {
        srand(time(0));  // 初始化随机种子

        int shu1 = rand() % (99 - 10 + 1) + 10;  // [10, 99]
        int shu2 = rand() % (99 - 10 + 1) + 10;  // [10, 99]

        std::cout << "随机数1: " << shu1 << std::endl;
        std::cout << "随机数2: " << shu2 << std::endl;

        return 0;
    }

输出示例:

    随机数1: 57
    随机数2: 82
  1. 总结
    关键点 说明
    srand(time(0)) 初始化随机种子,确保每次运行程序生成不同的随机数序列。
    rand() % N 生成 [0, N-1] 的随机整数。
    (max - min + 1) 计算范围大小,确保 rand() 能覆盖 [0, max - min]。
    • min 将范围偏移到 [min, max]。
      推荐写法 rand() % (max - min + 1) + min(比直接写数字更易读、易维护)。
      适用场景:随机密码生成、随机算术题、游戏随机事件等。