rand()
是C/C++标准库(stdlib.h)中提供的伪随机数生成函数,它生成的是一个伪随机数序列,而不是真正的随机数。
是的,rand()
函数在默认情况下总是会给出相同的序列,这是因为:
rand()
使用的是确定性算法,给定相同的种子(seed),就会产生相同的序列。srand()
设置种子,rand()
会使用默认种子1,因此每次程序运行时都会产生相同的序列。#include <stdio.h>
#include <stdlib.h>
int main() {
// 不设置种子,每次运行输出相同的序列
printf("Default sequence (first 5 numbers):\n");
for(int i = 0; i < 5; i++) {
printf("%d ", rand());
}
printf("\n");
return 0;
}
要获得不同的随机序列,应该在程序开始时用srand()
设置不同的种子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 使用当前时间作为种子
srand(time(0));
printf("Random sequence (first 5 numbers):\n");
for(int i = 0; i < 5; i++) {
printf("%d ", rand());
}
printf("\n");
return 0;
}
time(0)
),但在快速连续启动程序时可能不够随机。rand()
和srand()
不是线程安全的,多线程环境下应考虑使用线程安全的替代方案。rand()
的实现质量参差不齐,对随机性要求高的应用应考虑使用更现代的随机数库。rand()
生成的序列是可预测的,不适用于安全敏感场景。在C++11及更高版本中,推荐使用<random>
头文件中的随机数生成设施:
#include <iostream>
#include <random>
int main() {
std::random_device rd; // 真随机数生成器(如果可用)
std::mt19937 gen(rd()); // 使用Mersenne Twister引擎
std::uniform_int_distribution<> dis(1, 100); // 均匀分布
for(int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
这种方案提供了更好的随机性和更多的分布选择。