在Ruby中,我需要使用均值为m
的指数分布绘制。请告诉我如何快速有效地完成它。例如。我们有:
m = 4.2
def exponential_distribution
rand( m * 2 )
end
但是,当然,这段代码是错误的,而且,它只返回整数结果。我今天已经累了,请提示我寻求一个好的解决方案。
答案 0 :(得分:7)
如果您想从头开始,可以使用inversion。
def exponential(mean)
-mean * Math.log(rand) if mean > 0
end
如果您想使用费率lambda
对其进行参数化,则平均值和费率是相互反转的。除以-lambda
,而不是乘以-mean
。
从技术上讲,它应该是log(1.0 - rand)
,但由于1.0 - rand
具有统一分布,因此只需使用rand
即可保存一个算术运算。
答案 1 :(得分:4)
如何使用the distribution
gem?这是一个例子:
require 'distribution'
mean = 4.2
lambda = mean**-1
# generate a rng with exponential distribution
rng = Distribution::Exponential.rng(lambda)
# sample a value
sample = rng.call
如果您需要经常更改lambda
的值,直接使用p_value
方法可能会有用。可以在the source code for Distribution::Exponential#rng
中找到一个好的示例,它基本上只在内部使用p_value
。以下是如何执行此操作的示例:
require 'distribution'
# use the same rng for each call
rng = Random
1.step(5, 0.1) do |mean|
lambda = mean**-1
# sample a value
sample = Distribution::Exponential.p_value(rng.rand, lambda)
end