Numpy随机数(一):超几何分布

超几何分布

产品抽样检查中经常遇到一类实际问题,假定在N件产品中有M件不合格品,即不合格率
在产品中随机抽n件做检查,发现k件不合格品的概率
,k=0,1,2,...,min{n,M}。

Numpy中的超几何分布

Numpy的random包中提供了产生超几何分布结果的函数:

  numpy.random.hyermetric(ngoog,nbad,nsample,size=None)

https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.hypergeometric.html

  • ngood: 做出好的选择的数量,相当于上面的N件产品中的合格品,即N-M;
  • nbad:做出坏的选择的数量,相当于上面的M件合格品;
  • nsample:每次的采样数;
  • size:采样的组数,即试验组数.

上面的hypermetric()函数返回一组size大小的数组,数组中的每个数是在一组采样中合格产品的数量,即上面的k.

下面我们用一个具体的做游戏的例子来说明这个函数的用法:

一个袋子中有20个球,其中有1个黑球,别的都是红球.从袋子中每次取3个球,如果3个都是红球加1分,如果其中有一个黑球就减4分.我们用程序来模拟100次试验以后的得分情况,并绘制出得分的变化图.

(为了方便,以下代码是在ipython -pylab运行的)

1 使用hypermetric()初始化100组试验的结果,并初始化一个分数数组.

# 初始化一个计分板
points = zeros(100)
# 使用超几何分布初始化每次实验结果
# outcomes数组中的每一个项都是一次试验中取得红球的个数
# 注意第一个参数是红球个数,即为19而不是20
outcomes = random.hypermetric(19,1,3,size = len(points))

2 根据每一次模拟试验的结果来设置分数

for i in range(len(points)):
    if outcomes[i] == 3:
        points[i] = points[i-1] + 1
    elif outcomes[i] == 2:
        points[i] = points[i-1] - 4
    else:
        print(outcomes[i])

3 利用matplotlib绘制分数变化的曲线

plt.plot(np.arange(len(points)),points)
plt.title("Game SImulation")
plt.xlabel('# Rounds')
plt.ylabel('Score')
plt.grid()
plt.show()

4 分数变化的曲线如下

 

posted @ 2018-04-01 15:44  weller  阅读(1671)  评论(0编辑  收藏  举报