gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:53:13 24 4
gpt4 key购买 nike

在 [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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com