ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-函数返回指数范围为(a,b)的随机双精度数

2019-10-27 19:09:29  阅读:274  来源: 互联网

标签:exponential distribution c


我想从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)
enter image description here

所以:

>使用上述线性方法将值映射到[0,1],并假设最多进行10个转换.
>如果遇到值>转换后为1-只需绘制另一个随机数,直到值< 1.
>在140万次测试中只有7到10次出现,这应该足够接近,因为重新绘制的数字将再次是伪指数分布的.
>如果您要建造一艘太空船,而导航取决于0到1之间的完全指数分布的数字-不要这样做,否则您应该很好.
>(如果您想作弊:如果遇到数字> 1,只需找到与期望值相差最大的记录(即Max(occurrences<期望出现次数)),然后假定该值:P )

标签:exponential,distribution,c
来源: https://codeday.me/bug/20191027/1946568.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有