gpt4 book ai didi

c# - 函数返回范围 (a,b) 内呈指数分布的随机 double 值

转载 作者:行者123 更新时间:2023-11-30 14:51:46 26 4
gpt4 key购买 nike

我想生成一个从ab的随机数。问题是,这个数字必须服从指数分布。

这是我的代码:

public double getDouble(double low, double high)
{
double r;
(..some stuff..)
r = rand.NextDouble();
if (r == 0) r += 0.00001;
return (1 / -0.9) * Math.Log(1 - r) * (high - low) + low;
}

问题是 (1/-0.9) * Math.Log(1 - r) 不在 0 和 1 之间,所以结果不会在 ab 之间。有人可以帮忙吗?提前致谢!

最佳答案

我在第一个答案中误解了你的问题:)你已经在使用反演采样了。

要将一个范围映射到另一个范围, 有一种典型的数学方法:

f(x) = (b-a)(x - min)/(max-min) + a

在哪里

b = upper bound of target
a = lower bound of target
min = lower bound of source
max = upper bound of source
x = the value to map

(这是线性缩放,所以分布会被保留)

(您可以验证:如果您为 x 输入 min,则结果为 a,如果您输入 max 对于 x,你会得到 b。)

现在的问题:指数分布的最大值为 inf。所以,你不能使用这个等式,因为它总是 whatever/inf + 0 - 所以 0。 (这在数学上是有道理的,但不符合您的需求)

因此,唯一正确的答案是: 两个固定数字之间不可能存在指数分布,因为您无法映射 [0,inf] -> [a,b]

因此,您需要进行某种权衡,以使您的结果尽可能指数

出于好奇,我全神贯注于不同的可能性,我发现你在这方面无法战胜数学:P

但是,我用 Excel 和 140 万条随机记录做了一些测试:我选择了一个随机数作为“极限”(10)并将计算结果四舍五入到小数点后一位。 (0, 0.1, 0.2 and so on) 这个数我用来做最大为10的线性变换,忽略任何大于1的结果。

在 140 万次计算中(生成 10-20 次),只生成了 7-10 个大于 1 的随机数:

(概率密度函数,映射值后:第 100 列:= 1,第 0 列:= 0) enter image description here

所以:

  • 使用上述线性方法将值映射到 [0,1],假设转换的最大值为 10。
  • 如果在转换后遇到大于 1 的值 - 只需再抽取一个随机数,直到该值小于 1。

  • 在 140 万次测试中只有 7-10 次出现,这应该足够接近了,因为重新绘制的数字将再次伪指数分布

  • 如果你想 build 一艘宇宙飞船,其中导航取决于 0 到 1 之间的完美指数分布的数字 - 不要这样做,否则你应该做得很好。
  • (如果你想作弊:如果你遇到一个大于 1 的数字,只需从它的预期值中找到具有最大方差(即 Max(occurrences < expected occurrences))的记录 - 然后假设该值 :P )

关于c# - 函数返回范围 (a,b) 内呈指数分布的随机 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575496/

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