如何从Ruby中的指数分布中提取?

时间:2013-08-18 20:11:54

标签: ruby random statistics random-sample

在Ruby中,我需要使用均值为m的指数分布绘制。请告诉我如何快速有效地完成它。例如。我们有:

m = 4.2

def exponential_distribution
  rand( m * 2 )
end

但是,当然,这段代码是错误的,而且,它只返回整数结果。我今天已经累了,请提示我寻求一个好的解决方案。

2 个答案:

答案 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