在C++编程中,生成随机数是很多场景下的常见需求,比如游戏开发中的随机事件、测试数据的随机生成、抽奖功能的实现等,都可以借助标准库提供的随机数相关函数来完成。

rand函数的基本用法
rand函数是C++标准库<cstdlib>中提供的随机数生成函数,调用该函数可以直接返回一个伪随机整数,返回值范围在0到RAND_MAX之间,RAND_MAX是一个常量,在不同编译器中数值可能不同,通常是32767。
使用rand函数前需要包含对应的头文件,基本使用示例如下:
#include <iostream>
#include <cstdlib> // 包含rand函数声明
int main() {
// 调用rand生成随机数
int random_num = rand();
std::cout << "生成的随机数: " << random_num << std::endl;
return 0;
}
解决rand生成固定序列的问题
直接使用rand函数每次程序运行生成的随机数序列都是相同的,这是因为rand函数生成的是伪随机数,默认的种子是固定的。要解决这个问题,需要配合srand函数设置随机数种子,srand函数同样在<cstdlib>头文件中。
通常我们会使用当前时间作为随机数种子,因为时间每时每刻都在变化,这样就能保证每次运行程序时种子不同,生成不同的随机序列。使用时间作为种子需要包含<ctime>头文件,示例代码如下:
#include <iostream>
#include <cstdlib>
#include <ctime> // 包含time函数声明
int main() {
// 用当前时间设置随机数种子
srand((unsigned int)time(NULL));
int random_num = rand();
std::cout << "生成的随机数: " << random_num << std::endl;
return 0;
}
需要注意,srand函数只需要调用一次即可,不需要放在循环内部重复调用,否则可能会生成相近的随机数。
生成指定范围的随机数
rand函数生成的随机数范围较大,实际使用中往往需要生成某个区间内的随机数,比如生成1到100之间的整数,或者0到1之间的浮点数,这时候可以通过取模运算或者除法运算来实现。
生成指定范围的整数
生成a到b之间的随机整数(包含a和b),可以使用公式:a + rand() % (b - a + 1),示例如下:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand((unsigned int)time(NULL));
// 生成1到100之间的随机整数
int min = 1;
int max = 100;
int random_int = min + rand() % (max - min + 1);
std::cout << "1到100之间的随机数: " << random_int << std::endl;
return 0;
}
生成指定范围的浮点数
生成0到1之间的随机浮点数,可以将rand的返回值除以RAND_MAX,示例如下:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand((unsigned int)time(NULL));
// 生成0到1之间的随机浮点数
double random_double = (double)rand() / RAND_MAX;
std::cout << "0到1之间的随机浮点数: " << random_double << std::endl;
return 0;
}
如果需要生成a到b之间的浮点数,可以基于上面的结果做扩展:a + (double)rand() / RAND_MAX * (b - a)。
rand函数的局限性
rand函数生成的随机数质量不高,分布不够均匀,在对随机数质量要求较高的场景(比如密码学相关、高精度模拟)下并不适用。这时候可以考虑使用C++11之后引入的<random>头文件中的随机数库,比如std::mt19937随机数引擎配合std::uniform_int_distribution分布器来生成更高质量的随机数,不过对于普通的业务场景,rand函数的使用已经足够。