如何让<cstdlib>库的rand()函数生成超过32767的随机数
问题原因
C/C++标准规定rand()函数的返回值范围是0 ~ RAND_MAX,绝大多数编译器的默认实现中RAND_MAX的值为32767(即2^15 - 1),所以你对rand()返回值取模500000的操作没有实际效果,返回结果自然不可能超过32767。
解决方案
方案1:拼接两次rand()的返回值扩展范围
如果必须基于rand()实现,可以将两次rand()的返回值按位拼接,获得更大的取值范围:
#include <cstdlib> #include <iostream> using namespace std; // 拼接两次rand(),获得最大为 (32767<<15)|32767 = 1073741823 的取值范围 int big_rand() { return (rand() << 15) | rand(); } int main() { srand(9439); for(int i = 0; i < 15; i++){ cout << 1 + (big_rand() % 500000) << endl; } return 0; }
注意:该方案获得的随机数继承了rand()本身的所有缺陷,包括分布不均匀、周期短等,仅适合对随机数质量要求极低的兼容场景使用。
方案2:使用C++11引入的库(推荐)
C++11之后标准库提供了专业的随机数生成组件,支持自定义范围、更高的随机质量,是生产环境的首选方案:
#include <iostream> #include <random> using namespace std; int main() { // 初始化梅森旋转随机数生成器,填入固定种子可复现结果 mt19937 gen(9439); // 定义1~500000的均匀整数分布 uniform_int_distribution<int> dist(1, 500000); for(int i = 0; i < 15; i++){ cout << dist(gen) << endl; } return 0; }
该方案生成的随机数分布均匀,不存在取模偏差问题,取值范围可以任意自定义,完全满足需求。
内容的提问来源于stack exchange,提问作者CatWayRoad
相关产品推荐
相关产品推荐

