C语言 srand()只能在程序中调用一次的问题

C语言中,srand() 用于设置伪随机数生成器的种子(seed)。通常在程序开始时调用一次,并使用 time(NULL) 或其他不易重复的值作为种子。通常在程序开始时调用一次,并使用 time(NULL) 或其他不易重复的值作为种子。

1、srand() 和 rand() 的基本用法

srand(unsigned int seed) 用于初始化随机数生成器,确定随机数序列的起点。如果用相同的种子多次初始化,rand() 会生成相同的序列。rand() 生成伪随机整数,范围在 0RAND_MAX 之间。srand(time(NULL)) 用当前时间来初始化随机数生成器。每次运行程序时,因为时间不同,生成的随机数序列也会不同。

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

int main() {
    srand(time(NULL));  // 使用当前时间作为种子,只调用一次

    printf("Random number 1: %d\n", rand());
    printf("Random number 2: %d\n", rand());

    return 0;
}

2、srand() 只应该调用一次的原因

rand(),特别是使用 time(NULL) 作为种子,并且这些调用之间的时间差很短,可能会导致相同的随机数序列。只调用一次可以免重复初始化导致相同的随机数序列。

1)错误地多次调用 srand() 可能导致重复序列

如果循环执行得很快,多次调用 srand(time(NULL)) 可能会使用相同的时间戳作为种子,导致相同的随机数序列。

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

int main() {
    for (int i = 0; i < 5; i++) {
        srand(time(NULL));  // 不应在每次生成随机数时调用
        printf("Random number: %d\n", rand());
    }

    return 0;
}

2) 提高随机数的质量

如果 srand() 只在程序开始时调用一次,rand() 每次生成的随机数都会基于上一次的状态,确保随机序列的连续性和质量。

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

int main() {
    srand(time(NULL));  // 初始化种子,只调用一次

    for (int i = 0; i < 5; i++) {
        printf("Random number %d: %d\n", i + 1, rand());
    }

    return 0;
}

3、srand()的使用

srand() 函数用于设置伪随机数生成器的种子。通过初始化种子,rand() 函数会生成一个可预测的或随机的数列。

1)使用时间作为种子

通过 time(NULL) 获取当前时间,并将其作为种子传递给 srand()。这能确保每次运行程序时,生成的随机数序列都不同。

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

int main() {
    srand(time(NULL));  // 使用当前时间作为种子

    printf("Random number 1: %d\n", rand());
    printf("Random number 2: %d\n", rand());
    printf("Random number 3: %d\n", rand());

    return 0;
}

2)使用固定种子(生成可重复的随机序列)

每次生成的随机数序列都相同时,可以使用固定的种子。每次运行程序时,由于种子是固定的,生成的随机数序列不会变化。

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

int main() {
    srand(42);  // 使用固定种子

    printf("Random number 1: %d\n", rand());
    printf("Random number 2: %d\n", rand());
    printf("Random number 3: %d\n", rand());

    return 0;
}

3)生成范围内的随机数

默认情况下,rand() 生成的随机数范围是 0RAND_MAX。如果需要生成特定范围内的随机数,比如 1 到 100,可以通过取模操作实现。

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

int main() {
    srand(time(NULL));  // 使用时间作为种子

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

    return 0;
}

4)生成浮点型随机数

rand() 只能生成整数。如果需要生成 0.0 到 1.0 之间的浮点型随机数,可以将 rand() 的结果转换为浮点数,并除以 RAND_MAX

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

int main() {
    srand(time(NULL));  // 使用时间作为种子

    for (int i = 0; i < 5; i++) {
        float random_number = (float)rand() / RAND_MAX;
        printf("Random float %d: %f\n", i + 1, random_number);
    }

    return 0;
}

推荐阅读
cjavapy编程之路首页