关于随机:如何从Ruby中的指数分布中提取?

How to draw from exponential distribution in Ruby?

在Ruby中,我需要从平均m的指数分布中得出。请告诉我如何快速有效地完成。让我们拥有:

1
2
3
4
5
m = 4.2

def exponential_distribution
  rand( m * 2 )
end

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


如果你想从头开始做,你可以使用反转。

1
2
3
def exponential(mean)
  -mean * Math.log(rand) if mean > 0
end

如果要用速率lambda参数化它,则平均值和速率是彼此的反比。除以-lambda,而不是乘以-mean

从技术上讲,应该是log(1.0 - rand),但是由于1.0 - rand有一个统一的分布,您只需使用rand就可以节省一个算术运算。


使用distributiongem怎么样?下面是一个例子:

1
2
3
4
5
6
7
8
9
10
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。下面是一个如何操作的示例:

1
2
3
4
5
6
7
8
9
10
11
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