我想在一个范围内返回统一的随机值。范围和最小值的大小是预先计算的。
我使用广岛大学团队分发的双精度Mersenne Twister的参考实现。我目前正在使用具有以下描述的dsfmt_genrand_close_open()
函数:
"生成并返回一个双精度伪随机数,它在[0,1]和#34;
范围内均匀分布这是功能:
uint64_t gen_addr_in_range (uint64_t range, uint64_t low_addr) {
return (dsfmt_genrand_close_open(&dsfmt) * (range + 1)) + low_addr;
}
此函数的输出是否在给定范围内均匀?
答案 0 :(得分:0)
作为一名非数学家:
连续均匀分布的形式(以编程方式):
if (a <= x <= b)
f(x) = 1/(b-a)
else
f(x) = 0
将此分布乘以常数A将产生:
if (A*a <= x <= A*b)
f(x) = 1/(A*b-A*a)
else
f(x) = 0
这是另一种统一的分布。
同样,按常数c缩放会产生:
if ((a+c) <= x <= (b+c))
f(x) = 1/((b+c)-(a+c))
else
f(x) = 0
这又是一个统一的分布。
我觉得你没事。
答案 1 :(得分:0)
另一种考虑(假设range
限制为32位)是
return( low_addr + arc4random_uniform( range ) );
生成从low_addr
到low_addr + range - 1
的均匀分布值。