目前,python有这种集成的随机算法:
random.randint(0,x)的
此函数生成从0到x的随机数。到现在为止还挺好。问题是,我希望这个算法以某种方式工作,0有更大的机会下降,然后是1,然后一直到x,就像半高斯曲线,而不是平均值在中心, 0是。我也想到了指数减少而不是线性减少。 python中是否存在这样的算法?
答案 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);
答案 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()
@pjs的注释注意到这个解决方案可以加速两倍或四倍,注意Box-Muller变换为每个调用提供两个高斯数,并且一个平均零的高斯对称地居中于原点(所以我们不需要拒绝,只需返回否定)。这些是有效的观点,可以纳入更复杂的答案 - 上述解决方案有意简单地说明如何对您的发行进行抽样。