algorithm - 如何使用 random()={0..1} 在保持均匀性和密度的情况下生成任意范围内的数字?

标签 algorithm random entropy

在 [x..y] 范围内生成一个随机数,其中 x 和 y 是任意 float 。使用函数 random(),它从 P 个均匀分布的数字(称为“密度”)返回 [0..1] 范围内的随机 float 。必须保持均匀分布,并且 P 也必须缩放。

我认为,对于这样的问题没有简单的解决方案。为了稍微简化一下,我问你如何在间隔 [-0.5 .. 0.5] 中生成一个数字,然后在 [0 .. 2] 中,然后在 [-2 .. 0] 中,保持均匀性和密度?因此,对于 [0 .. 2],它必须从 P*2 个均匀分布的数中生成一个随机数。

明显的简单解决方案 random() * (x - y) + y 不会生成所有可能的数字,因为所有 abs(x-y)>1.0 的密度较低> 案例。许多可能的值将被遗漏。请记住,random() 仅返回 P 个可能数字中的一个数字。然后,如果你将这个数字乘以 Q,它只会给你 P 个可能值中的一个,按 Q 缩放,但你也必须按 Q 缩放密度 P。

最佳答案

如果我很好地理解你的问题,我会为你提供一个解决方案:但我会从范围中排除 1。

N = numbers_in_your_random // [0, 0.2, 0.4, 0.6, 0.8] will be 5

// This turns your random number generator to return integer values between [0..N[;
function randomInt()
{
    return random()*N;
}

// This turns the integer random number generator to return arbitrary
// integer
function getRandomInt(maxValue)
{
    if (maxValue < N)
    {
        return randomInt() % maxValue;
    }
    else
    {
        baseValue = randomInt();
        bRate = maxValue DIV N;
        bMod = maxValue % N;
        if (baseValue < bMod)
        {
            bRate++;
        }
        return N*getRandomInt(bRate) + baseValue;
    }
}

// This will return random number in range [lower, upper[ with the same density as random()
function extendedRandom(lower, upper)
{
    diff = upper - lower;
    ndiff = diff * N;
    baseValue = getRandomInt(ndiff);
    baseValue/=N;
    return lower + baseValue;
}

关于algorithm - 如何使用 random()={0..1} 在保持均匀性和密度的情况下生成任意范围内的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019589/

相关文章:

python - 如何消除两个数据集的 Leibler 分歧

algorithm - 如何有效地连接两个二叉搜索树?

java - 使用 'fib(N) = [Phi^N – phi^N]/Sqrt[5]' 公式计算 Fibonacci 项的时间复杂度是多少?

c++ - 特征值:t 为 1s 的随机二元 vector

c++ - 在具有特定均值的 2 个数字之间获取一组随机数。

java - 如何处理缓慢的 SecureRandom 生成器?

python - 如何在Python中找到连续变量的熵?

确定上周、月份和年份最受欢迎文章的算法?

algorithm - 在范围系列中找到最频繁重复的整数

python - 在圆周上生成随机点(python)