Bootstrap

c/c++如何高效生成不重复的随机数?

上结论:srand()+time(NULL)+rand()

srand() 是 C/C++ 编程中用于初始化随机数生成器的函数。它的作用是设置随机数生成器的种子(seed),以便后续调用 rand() 函数时生成不同的随机数序列。

1. 函数组成

  • srand()

    :用于设置随机数生成器的种子。

    • 头文件:<stdlib.h>
    • 原型:void srand(unsigned int seed);
    • 参数:seed 是一个无符号整数,作为随机数生成器的种子。
  • time(NULL)

    :这个函数用于获取当前系统时间(以秒为单位)。

    • 头文件:<time.h>
    • 原型:time_t time(time_t *timer);
    • 参数:NULL 表示不需要存储时间值,直接返回当前时间。
    • 返回值:当前时间(从 1970 年 1 月 1 日至今的秒数)。
    #include <stdio.h>
    #include <time.h>
    int main() {
    	time_t current_time = time(NULL);
    	printf("Current time: %ld\n", current_time);
    	return 0;
    }
    结果如下:
    Current time: 1741538645
    

2. 作用

srand(time(NULL)) 的作用是将当前系统时间作为种子传递给随机数生成器。这样做的目的是确保每次程序运行时生成的随机数序列不同,因为时间在不断变化。

  • 如果不使用 srand(time(NULL)),而是直接调用 rand(),每次程序运行时生成的随机数序列会是相同的。
  • 使用 srand(time(NULL)) 后,每次程序运行时生成的随机数序列都会不同。

3. 工作原理

  • 随机数生成器:C/C++ 中的 rand() 函数是一个伪随机数生成器,它基于一个固定的算法生成随机数序列。
  • 种子srand() 函数通过设置种子来初始化随机数生成器。相同的种子会生成相同的随机数序列。
  • 时间作为种子time(NULL) 返回当前系统时间,这个值每次运行程序时都不同,因此生成的随机数序列也不同。

4. 使用

使用 srand(time(NULL))rand() 生成随机数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    // 设置随机数种子
    srand(time(NULL));

    // 生成 5 个随机数
    for (int i = 0; i < 5; i++) {
        int random_num = rand();
        printf("Random number %d: %d\n", i + 1, random_num);
    }

    return 0;
}

输出

Random number 1: 15362
Random number 2: 8418
Random number 3: 30584
Random number 4: 9994
Random number 5: 30086
  • 每次运行程序时,输出的随机数都会不同。

5. 注意事项

  1. 种子只需设置一次

    • 在程序中只需调用一次 srand(time(NULL)),通常在程序开始时调用。
    • 如果多次调用 srand(),可能会导致随机数序列重复。
  2. time(NULL) 的精度

    • time(NULL) 返回的时间精度是秒级。如果程序在短时间内多次运行,time(NULL) 可能返回相同的值,导致随机数序列相同。
    • 如果需要更高的精度,可以使用 clock() 或其他高精度时间函数。
  3. 随机数范围

    • rand() 生成的随机数范围是 0RAND_MAX(通常是 32767)。

    • 如果需要生成特定范围内的随机数,可以使用取模运算或公式:

      int random_num = rand() % 100; // 生成 0 到 99 的随机数
      

6. 改进

如果需要生成特定范围内的随机数,可以改进代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    // 设置随机数种子
    srand(time(NULL));

    // 生成 5 个 1 到 100 的随机数
    for (int i = 0; i < 5; i++) {
        int random_num = rand() % 100 + 1; // 1 到 100
        printf("Random number %d: %d\n", i + 1, random_num);
    }

    return 0;
}

输出

Random number 1: 92
Random number 2: 85
Random number 3: 40
Random number 4: 16
Random number 5: 11
;