首页 > 编程 > Python > 正文

Python使用random和tertools模块解一些经典概率问题

2020-02-23 06:22:12
字体:
来源:转载
供稿:网友

random 模块中的常用函数
代码如下:
random()
返回一个位于区间 [0,1] 内的实数;
uniform(a, b)
返回一个位于区间 [a,b] 内的实数;
randint(a, b)
返回一个位于区间 [a,b] 内的整数;
choice(sequence)
返回一个位于 sequence 中的元素,其中,sequence 为一个有序序列,如 list、string 或者 tuple 等类型;
randrange([start], stop[, step])
等效于 choice(range([start], stop[, step]));
shuffle(sequence [, random])
无返回值,用于打乱 sequence 中元素的排列顺序;
sample(sequence, n)
返回一个由 n 个 sequence 中的元素组成的分片,其中,sequence 也可以是 set 类型。

利用 itertools 得到排列、组合
代码如下:
permutations(sequence, k))
从序列 sequence 中得到包含 k 个元素的所有排列。

combinations(sequence, k))
从序列 sequence 中得到包含 k 个元素的所有组合。

羊车门问题

有一个抽奖节目,台上有三扇关闭的门,一扇门后面停着汽车,其余门后都是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。问题是:参赛者更换选择后能否增加赢得汽车的机会?

有很多时候,我们并不知道自己的理论分析正确与否,但如果知道概率论中的 大数定律,又碰巧懂一点编程,无疑可以利用计算机重复模拟事件以求解问题。该问题的 Python 3.x 解答程序如下:
代码如下:
from random import *

def once(doors = 3):  # 一次事件的模拟
 car = randrange(doors) # 一扇门后面停着汽车
 man = randrange(doors) # 参赛者预先选择一扇门
 return car == man # 参赛者是否最初就选择到车

h = 0 # 坚持选择赢得汽车的次数                   
c = 0 # 改变选择赢得汽车的次数
times = int(1e6) # 重复实验的次数

for i in range(times):
 if once(): h += 1
 else:  c += 1

print("维持选择:",h/times*100,"%/n改变选择:",c/times*100,"%")

运行结果:

维持选择: 33.268 %
改变选择: 66.732 %

扑克牌问题

概率论给我们带来了很多匪夷所思的反常结果,条件概率尤其如此。譬如:

四个人打扑克,其中一个人说,我手上有一个 A。请问他手上有不止一个 A 的概率是多少?
四个人打扑克,其中一个人说,我手上有一个黑桃 A。请问他手上有不止一个 A 的概率又是多少?
代码如下:
from random import *

cards = [i for i in range(52)]

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表