3.3 概率计算

将理想状态绝对无误差的10个同样的小球从1~10标号,然后随机从中选出1个小球。如果选取的次数足够多,就可以计算各个小球被选取出来的概率。编写一个Python程序来算一算,看看老天偏爱哪个数。

3.3.1 Project分析

这是一个随机数的问题。Python有个random模块,专门用来解决这类问题。据说Python用random选取出来的随机数都是伪随机数。不过也没关系,只需要算出大致的结果就可以了。没计算之前,个人认为每个球被选取出来的概率都一样。下面就来算算看。

3.3.2 Project实施

【示例3-3】编写ball.py,打开Putty连接到Linux,执行命令:

     cd code/crawler
     vi ball.py

ball.py的代码如下:

     1 #!/usr/bin/env python3
     2 #-*- coding: utf-8 -*-
     3 __author__ = 'hstking hst_king@hotmail.com'
     4
     5 import random
     6
     7 class SelectBall(object):
     8     def __init__(self):
     9         self.run()
     10
     11     def run(self):
     12         while True:
     13             numStr = input('输入测试的次数:')
     14             try:
     15                 num = int(numStr)
     16             except ValueError as e:
     17                 print('要求输入一个整数')
     18                 continue
     19             else:
     20                 break
     21         ball = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
     22         for i in range(num):
     23             n = random.randint(1,10)
     24             ball[n-1] += 1
     25         for i in range(1,11):
     26             print('获取第%d号球的概率为%f' %(i, ball[i-1]*1.0/num))
     27
     28
     29 if __name__ == '__main__':
     30     SB = SelectBall()

执行命令:

     python3 ball.py

得到的结果如图3-3所示。

图3-3 选球概率

果然如此,每个球选取的概率差不多。选取的次数越多,这个趋势就越明显。也就是说,在理想状态下,所有球被选取的概率是一样的。

提示

这种选取小球概率的计算方法只是一种理想状态的算法。类似于丢硬币出现正反面的概率,理论上应该是一半对一半,但实际上由于硬币材质的缘故,丢硬币的次数越多,正反面出现的概率差距就越大。