询问自定义randomDouble函数是否能生成包含3.0的随机值
为什么你的randomDouble函数测试不到3.0?
首先明确:你的函数理论上可以生成等于3.0的随机值,但实际测试中很难命中,原因如下:
1. 概率极低
rand()的返回范围是[0, RAND_MAX],通常RAND_MAX的值是2^31-1(2147483647)。只有当rand()恰好返回RAND_MAX时,你的函数才会计算出3.0:
double(RAND_MAX)/RAND_MAX * (3.0-1.0) + 1.0 = 1.0*2.0 +1.0 =3.0
这个事件发生的概率是1/RAND_MAX,约为4.6e-10。即使你跑10亿次循环,碰到这个情况的概率也只有约46%,没命中完全是概率问题。
2. 浮点数精度的验证
你不用担心浮点数精度导致double(RAND_MAX)/RAND_MAX不等于1.0:因为RAND_MAX(231-1)远小于`double`能精确表示的最大整数(253),所以这个除法的结果可以精确等于1.0,对应的最终结果也会精确等于3.0。
如何快速验证函数能生成3.0?
不用跑海量循环,直接构造rand()返回最大值的场景测试:
// 临时替换rand的返回值(仅测试用) #define rand() RAND_MAX cout << randomDouble(1.0, 3.0) << endl; #undef rand
这段代码会直接输出3.0,证明函数逻辑在理论上是正确的。
额外提醒
虽然你的逻辑没问题,但rand()本身的随机性较差,且RAND_MAX的取值可能因平台不同而变化。如果是生产环境代码,建议使用C++11引入的<random>库中的随机数生成器(比如std::mt19937)。
内容的提问来源于stack exchange,提问作者roundofferror
相关产品推荐
相关产品推荐

