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

python中集成半高斯曲线的随机性算法?,python,random,Python,Random,目前,python有这样一个集成的随机算法: random.randint(0,x) 此函数生成从0到x的随机数。到现在为止,一直都还不错。问题是,我希望这个算法在某种程度上起作用,0下降的几率更大,然后是1,然后一直上升到x,就像一条半高斯曲线,而不是平均值在中心,0是。我也在考虑指数下降而不是线性下降。python中是否存在此类算法?该模块有许多概率函数可供选择。例如: import scipy.stats as stats import matplotlib.pyplot as plt

目前,python有这样一个集成的随机算法:

random.randint(0,x)

此函数生成从0到x的随机数。到现在为止,一直都还不错。问题是,我希望这个算法在某种程度上起作用,0下降的几率更大,然后是1,然后一直上升到x,就像一条半高斯曲线,而不是平均值在中心,0是。我也在考虑指数下降而不是线性下降。python中是否存在此类算法?

该模块有许多概率函数可供选择。例如:

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

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

模块有许多概率函数可供选择。例如:

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

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

您应该认真研究@elyase提到的
scipy.stats
,但是如果您想要一个纯python解决方案,您可以使用Box-Muller变换从高斯采样,并仅保持点>=0,以获得所谓的“半高斯”:


@pjs的评论指出,通过注意Box-Muller变换为每个调用提供两个高斯数,并且平均值为零的高斯数对称地以原点为中心(因此我们不需要拒绝,只需返回负数),可以将此解决方案的速度提高两到四倍。这些都是有效的观点,可以合并到一个更复杂的答案中——上面的解决方案旨在简单地说明如何对分布进行采样

正如@elyase所提到的,您应该认真研究
scipy.stats
,但是如果您想要一个纯python解决方案,您可以使用Box-Muller变换从高斯采样,并且只保持点>=0,以获得所谓的“半高斯”:


@pjs的评论指出,通过注意Box-Muller变换为每个调用提供两个高斯数,并且平均值为零的高斯数对称地以原点为中心(因此我们不需要拒绝,只需返回负数),可以将此解决方案的速度提高两到四倍。这些都是有效的观点,可以合并到一个更复杂的答案中——上面的解决方案旨在简单地说明如何对分布进行采样

这是蒙特卡罗抽样中非常常见的事情。每个分布都可以用它的概率密度函数(PDF)来描述,例如高斯分布,但它也有一个累积密度函数。使用,您可以在
0
1
之间随机取样,然后从所需的分布中取样。希望这足以让你开始谷歌搜索,因为覆盖所有这些内容太广了,无法在堆栈溢出答案中覆盖。您可以使用参数
p
指定每个值的概率。这是蒙特卡罗采样中非常常见的事情。每个分布都可以用它的概率密度函数(PDF)来描述,例如高斯分布,但它也有一个累积密度函数。使用,您可以在
0
1
之间随机取样,然后从所需的分布中取样。希望这足以让你开始谷歌搜索,因为覆盖所有这些内容太广了,无法在堆栈溢出答案中覆盖。你可以用参数
p
来指定每个值的概率。鬼鬼祟祟的忍者在里面导入seaborn,让你的图看起来更好看一些。:)@上钩,有罪,:-)。顺便说一句,这是一个不错的纯python解决方案。鬼鬼祟祟的忍者在那里导入seaborn,让你的情节看起来更好一些。:)@上钩,有罪,:-)。顺便说一句,你的纯python解决方案很不错。你的解决方案有几个缺点。1) 使用
math.pi
而不是键入的有限精度文字。2) Box-Muller使用两种均匀性,通过计算随机生成的角度的余弦和正弦来生成两个独立的高斯。如果不返回一个元组,就浪费了一半的潜在值。3) 在
demi_gaussian
函数中,如果得到负高斯分布,则无需拒绝和循环-因为高斯分布是对称的,您只需返回绝对值即可。@pjs所有有效点-这是一个快速演示解决方案的例子。1] 我同意,我会改变的。2] 我意识到我扔掉了一半的计算,这是出于教学的原因,这样OP就可以看到单一输出的清晰链条。3] 这仅适用于对称函数约为零的情况。虽然这里是真的,但我觉得我应该说明拒绝的一般蒙特卡罗方法。谢谢你的意见!你的解决方案有几个小毛病要挑。1) 使用
math.pi
而不是键入的有限精度文字。2) Box-Muller使用两种均匀性,通过计算随机生成的角度的余弦和正弦来生成两个独立的高斯。如果不返回一个元组,就浪费了一半的潜在值。3) 在
demi_gaussian
函数中,如果得到负高斯分布,则无需拒绝和循环-因为高斯分布是对称的,您只需返回绝对值即可。@pjs所有有效点-这是一个快速演示解决方案的例子。1] 我同意,我会改变的。2] 我意识到我扔掉了一半的计算,这是出于教学的原因,这样OP就可以看到单一输出的清晰链条。3] 这仅适用于对称函数约为零的情况。虽然这里是真的,但我觉得我应该说明拒绝的一般蒙特卡罗方法。谢谢你的意见!