我真的需要帮助,因为我陷入了代码的开头。
我被要求创建一个函数来研究直方图上的指数分布。函数是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
答案 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
将被称为