c#-函数返回指数范围为(a,b)的随机双精度数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-函数返回指数范围为(a,b)的随机双精度数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1719字,纯文字阅读大概需要3分钟。
内容图文
![c#-函数返回指数范围为(a,b)的随机双精度数](/upload/InfoBanner/zyjiaocheng/682/e39ef8c430ab41d389c5098e15adf575.jpg)
我想从a到b生成一个随机数.问题是,该数字必须以指数分布给出.
这是我的代码:
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之间,因此结果将不在a和b之间.有人可以帮忙吗?提前致谢!
解决方法:
我在第一个答案中误解了您的问题:)您已经在使用反转采样.
要将一个范围映射到另一个范围,有一种典型的数学方法:
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;如果为x输入max,则结果为b.)
现在的问题:指数分布的最大值为inf.因此,您不能使用此方程式,因为它总是www / inf 0-等于0.
因此,唯一正确的答案是:两个固定数字之间没有指数分布,因为您无法映射[0,inf]->. [a,b]
因此,您需要进行某种权衡,以使结果尽可能地呈指数级.
出于好奇,我把头放在了各种可能性上,我发现您无法在:P上超越数学
但是,我使用Excel和140万条随机记录进行了一些测试:
我选择一个随机数作为“极限”(10),并将计算结果四舍五入到小数点后一位. (0、0.1、0.2,依此类推)我使用此数字执行线性转换,最大为10,所有大于1的结果都归为整数.
在140万次计算中(生成10-20次),仅生成了7-10个大于1的随机数:
(概率密度函数,在映射值之后:列100:= 1,列0:= 0)
所以:
>使用上述线性方法将值映射到[0,1],并假设最多进行10个转换.
>如果遇到值>转换后为1-只需绘制另一个随机数,直到值< 1.
>在140万次测试中只有7到10次出现,这应该足够接近,因为重新绘制的数字将再次是伪指数分布的.
>如果您要建造一艘太空船,而导航取决于0到1之间的完全指数分布的数字-不要这样做,否则您应该很好.
>(如果您想作弊:如果遇到数字> 1,只需找到与期望值相差最大的记录(即Max(occurrences<期望出现次数)),然后假定该值:P )
内容总结
以上是互联网集市为您收集整理的c#-函数返回指数范围为(a,b)的随机双精度数全部内容,希望文章能够帮你解决c#-函数返回指数范围为(a,b)的随机双精度数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。