根据二项式和指数分布生成数字

时间:2015-04-06 13:52:32

标签: python

我想根据

在[0,1]之间生成N(1000)个数字

1)。二项分布:对于二项式分布,如果我使用s=np.random.binomial(10,0.5,1000),那么我得到1到10之间的数字。我有什么方法可以将它们限制在[0,1]

2)。指数分布:对于指数,如果我使用:x=np.random.exponential(1,1000)那么我也无法获得[0,1]之间的数字

根据二项式和指数分布,我是否可以通过某种方式在python中的[0,1]之间生成浮点数。

2 个答案:

答案 0 :(得分:1)

二项分布:

vcnt = 10    
s=np.random.binomial(vcnt,0.5,1000)
s = [elem/float(vcnt) for elem in s]

或者你可以这样做:

vcnt = 10    
s=np.random.binomial(vcnt,0.5,1000)/float(vcnt)

您可以使用以下方法检查结果:

print(max(s))
print(min(s))

对于指数分布,这更复杂,因为指数分布的随机变量可以采用无限大(和小)值。

答案 1 :(得分:0)

1)无法在0和1之间生成二项式分布式浮点数。为什么?因为在二项分布中,随机变量N =成功的次数,因此每个定义是一个整数。你能做的是:

s = np.random.binomial(100, 0.5, size=1000)/100.

编辑:或者等效形式:

 s = np.random.binomial(100, 0.5, size=1000)/float(100)

确保您使用浮点而不是整数。

这将根据缩放的二项分布给出75x形式的浮点数,其中n(=试验次数)= 100,p = 0.5。你对这段代码有什么看法?对于绘制的每个随机变量,您每次翻转一个硬币100次,并在每次显示头部时添加1到一个计数器(或尾部,因为您选择p为0.5,所以不重要)。由于长度为100的任何头部和尾部序列具有相同的概率(即p ^ 100),因此您最终会根据所有可能的组合数量进行分配:

http://en.wikipedia.org/wiki/Combination

除以100所做的是你定义你的随机变量,当头部显示时不加1,而是1/100。尝试将n增加到1000或10000,您将越来越接近可以通过正态分布近似的东西:

http://en.wikipedia.org/wiki/Binomial_distribution#Normal_approximation

http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html#numpy.random.normal

请注意,对于此近似值,p不应接近0或1。

2)在这里你可能想要像泊松分布这样的东西:

http://en.wikipedia.org/wiki/Binomial_distribution#Poisson_approximation

http://en.wikipedia.org/wiki/Poisson_distribution

https://stats.stackexchange.com/questions/2092/relationship-between-poisson-and-exponential-distribution