1、srand() 和 rand() 的基本用法
srand(unsigned int seed)
用于初始化随机数生成器,确定随机数序列的起点。如果用相同的种子多次初始化,rand()
会生成相同的序列。rand()
生成伪随机整数,范围在 0
到 RAND_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()
生成的随机数范围是 0
到 RAND_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;
}