C++中rand()函数使用*与%运算符的差异及相关疑问
关于rand()两种随机数生成写法的解析
两种rand()的使用方式
取模运算符实现:
int r = rand() % 10;这个写法会生成0到9之间的整数,逻辑很直接:
rand()返回0到RAND_MAX(标准库定义的最大随机值,通常是32767)之间的整数,对10取模后余数范围固定在0-9。乘法+除法实现:
double r = rand() * 101.0 / 100.0;
对第二种写法的疑问解答
1. 取值范围是什么?
rand()的返回值范围是[0, RAND_MAX],代入计算后:
- 当
rand()取0时,结果是0.0 - 当
rand()取RAND_MAX时,结果是RAND_MAX * 1.01
如果RAND_MAX是常见的32767,最大值就是33094.67,所以这个写法生成的是0.0到RAND_MAX*1.01之间的浮点数。
2. 为什么要做除法,而不是直接写double r = rand() * 1.0;?
直接写rand() * 1.0只是把rand()的整数结果转成浮点数,取值范围还是[0.0, RAND_MAX]。而*101.0/100.0是把原随机数的范围放大了1.01倍——把原来的最大值RAND_MAX映射到RAND_MAX*1.01,最小值保持0不变,本质是做了一次线性缩放。
这种写法一般是某些场景需要比原rand()范围稍大一点的浮点数随机值,但不会改变随机数的分布特性。
3. 存在什么限制?
- 依赖
RAND_MAX的具体值:不同编译器或平台的RAND_MAX可能不同,导致最终的最大值不确定 - 浮点数精度问题:当
RAND_MAX很大时,浮点数可能无法精确表示所有中间值,会出现精度丢失 - 分布均匀性影响:如果
RAND_MAX*1.01超出了double的精确整数表示范围,会进一步影响随机数的均匀分布
内容的提问来源于stack exchange,提问作者Jack Hermanson
相关产品推荐
相关产品推荐

