python中的随机性算法集成了半高斯曲线?

时间:2014-12-07 14:48:01

标签: python random

目前,python有这种集成的随机算法:

  

random.randint(0,x)的

此函数生成从0到x的随机数。到现在为止还挺好。问题是,我希望这个算法以某种方式工作,0有更大的机会下降,然后是1,然后一直到x,就像半高斯曲线,而不是平均值在中心, 0是。我也想到了指数减少而不是线性减少。 python中是否存在这样的算法?

2 个答案:

答案 0 :(得分:3)

scipy.stats模块有很多概率函数可供选择。例如:

import scipy.stats as stats
import matplotlib.pyplot as plt

x = stats.expon.rvs(size=10000)
plt.hist(x, 70, histtype="stepfilled", alpha=.7);

enter image description here

答案 1 :(得分:1)

你应该真正关注scipy.stats @elyase提到,但如果你想要一个纯python解决方案,你可以使用Box-Muller变换从高斯采样,只保留点> = 0你所谓的“demi-gaussian”:

import math
import random

def gaussian():
    # Uses a Box-Muller Transform to sample the standard normal
    # using two random numbers uniformly distributed on [0,1]
    u = random.random() 
    v = random.random()
    r  = (-2*math.log(u))**(.5)
    r *= math.cos(2*math.pi*v)
    return r

def demi_gaussian():
    # Keep sampling until we get a value >= 0
    while True:
        r  = gaussian()
        if r >= 0: 
            return r

import pylab as plt
R = [demi_gaussian() for _ in xrange(100000)]
plt.hist(R,70,histtype="stepfilled",alpha=.7)
plt.show()

enter image description here

@pjs的注释注意到这个解决方案可以加速两倍或四倍,注意Box-Muller变换为每个调用提供两个高斯数,并且一个平均零的高斯对称地居中于原点(所以我们不需要拒绝,只需返回否定)。这些是有效的观点,可以纳入更复杂的答案 - 上述解决方案有意简单地说明如何对您的发行进行抽样。