0

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

我正在使用广岛大学团队分发的双精度 Mersenne Twister 的参考实现。我目前正在使用dsfmt_genrand_close_open()具有以下描述的功能:

“生成并返回一个在 [0, 1) 范围内均匀分布的双精度伪随机数”

这是功能:

uint64_t gen_addr_in_range (uint64_t range, uint64_t low_addr) {
    return (dsfmt_genrand_close_open(&dsfmt) * (range + 1)) + low_addr;
}

此函数的输出在给定范围内是否一致?

4

2 回答 2

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

这又是一个均匀分布。

我觉得你很好。

于 2014-03-14T00:47:49.883 回答
0

要考虑的替代方案(假设range限制为 32 位)是

return( low_addr + arc4random_uniform( range ) );

low_addr它从到生成一个均匀分布的值low_addr + range - 1

于 2014-03-14T00:48:10.503 回答