2

在 Ruby 中,我需要从具有 mean 的指数分布中得出m。请告诉我如何快速有效地做到这一点。例如。让我们:

m = 4.2

def exponential_distribution
  rand( m * 2 )
end

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

4

2 回答 2

7

如果你想从头开始,你可以使用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

于 2013-08-18T22:59:51.853 回答
4

使用宝石怎么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
于 2013-08-18T20:16:59.177 回答