在 Ruby 中,我需要从具有 mean 的指数分布中得出m
。请告诉我如何快速有效地做到这一点。例如。让我们:
m = 4.2
def exponential_distribution
rand( m * 2 )
end
但当然,这段代码是错误的,而且它只返回整数结果。我今天已经累了,请提示我一个好的解决方案。
在 Ruby 中,我需要从具有 mean 的指数分布中得出m
。请告诉我如何快速有效地做到这一点。例如。让我们:
m = 4.2
def exponential_distribution
rand( m * 2 )
end
但当然,这段代码是错误的,而且它只返回整数结果。我今天已经累了,请提示我一个好的解决方案。
如果你想从头开始,你可以使用inversion。
def exponential(mean)
-mean * Math.log(rand) if mean > 0
end
如果你想用 rate 参数化它lambda
,mean 和 rate 是彼此的倒数。除以-lambda
而不是乘以-mean
。
从技术上讲它应该是log(1.0 - rand)
,但由于1.0 - rand
具有均匀分布,您可以通过使用来节省一个算术运算rand
。
使用宝石怎么distribution
样?这是一个例子:
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
可以在的源代码中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