这个函数会返回均匀分布的随机值吗?

时间:2014-03-14 00:30:06

标签: c random statistics probability mersenne-twister

我想在一个范围内返回统一的随机值。范围和最小值的大小是预先计算的。

我使用广岛大学团队分发的双精度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;
}

此函数的输出是否在给定范围内均匀?

2 个答案:

答案 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_addrlow_addr + range - 1的均匀分布值。