python中的指数随机生成器(日志函数)?

时间:2016-10-25 16:00:19

标签: python random distribution exponential

我真的需要帮助,因为我陷入了代码的开头。

我被要求创建一个函数来研究直方图上的指数分布。函数是x = -log(1-y)/λ。 λ是一个常数,我把它称为代码中的lamdr并简单地给它10.我给了N(随机数的数量)10然后运行代码但结果和生成的随机数给了我完全不同的结果;下面你可以找到代码,我不知道出了什么问题,希望你们能帮助我! (我使用python 2)

import random
import math

N = raw_input('How many random numbers you request?: ')
N = int(N)
lamdr = raw_input('Enter a value:')
lamdr = int(lamdr)

def exprand(lamdr):
    y = []
    for i in range(N):
        y.append(random.uniform(0,1))
    return y
y = exprand(lamdr)
print 'Randomly generated numbers:', (y)

x = []
for w in y:
    x.append((math.log((1 - w) / lamdr)) * -1)
print 'Results:', x

2 个答案:

答案 0 :(得分:4)

查看您提供的代码后,看起来您拥有所需的部分,但不是将它们放在一起。

您被要求使用指定的公式编写函数exprand(lambdr)。 Python已经提供了一个名为random.expovariate(lambd)的函数来生成指数,但是到底是什么,我们仍然可以创建自己的指数。您的公式需要y的“随机”值,该值在0和1之间具有均匀分布。 The documentation for the random module告诉我们random.random()会给我们一个统一的(0,1)分布。所以我们所要做的就是用该函数调用替换公式中的y,我们正在开展业务:

def exprand(lambdr):
    return -math.log(1.0 - random.random()) / lambdr

历史记录:数学上,如果y具有统一(0,1)分布,那么1-y也是如此。该算法的实现可以追溯到1950年代,通常会利用这一事实将计算简化为-math.log(random.random()) / lambdr。数学上这给出了分布正确的结果,因为对于任何连续的随机变量X和常数c,P {X = c} = 0,但是计算上它会在Python中爆发为1/2 in 64 发生的地方来自random.random()的零。这样做的一个历史基础是,当计算机比现在慢许多个数量级时,放弃一个额外的算术运算被认为是值得的微小风险。另一个原因是当时流行的Prime Modulus Multiplicative PRNG从未产生零。这些天它主要是历史兴趣,也是数学和计算有时分歧的有趣例子。

回到手头的问题。现在你只需调用该函数N次并将结果存储在某处。可能的候选人是循环或列表理解。以下是后者的一个例子:

abuncha_exponentials = [exprand(0.2) for _ in range(5)]

这将创建一个5个指数的列表,其中λ= 0.2。将0.2和5替换为用户提供的合适值,您就可以开展业务了。打印列表,制作直方图,将其用作其他内容的输入......

在列表推导中用exporand替换expovariate应该使用Python的内置指数生成器产生相同的结果。这就是函数作为抽象的美妙,一旦有人写下它们,你就可以将它们用于你的内心。

请注意,由于使用了随机性,每次运行时都会产生不同的结果,除非您每次都将随机生成器“播种”为相同的值。

答案 1 :(得分:2)

WHp @pjs所写的是真实的。虽然声明Polygon似乎是正确的,但使用mathematically, if y has a uniform(0,1) distribution, so does 1-y替换代码的建议是错误的。为什么?因为Python -math.log(random.random()) / lambdr模块在​​[0,1]范围内提供了U(0,1)(如前面提到的here),因此这种替换是非等价的。

在更常规的术语中,如果您的random实际上在[0,1]范围内生成数字,那么代码

U(0,1)

是正确的,但代码

import random
def exprand(lambda):
    return -math.log(1.0 - random.random()) / lambda

错误,它有时会生成NaN /异常,因为import random def exprand(lambda): return -math.log(random.random()) / lambda 将被称为