Python 中的 random 与 tertools 模块可以得到伪随机数与排列、组合,下面利用这两个模块求解一些有趣的概率问题。

一、random 与 tertools 模块

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 个元素的所有组合。

二、概率趣题

每当网上有人发布与条件概率悖论相关的帖子时,总会引来无数旁人的围观与争论,五花八门的分析乍看像模像样,实则让人晕头转向。现在我不去理论分析计算,只根据概率论中的 大数定律,利用计算机重复模拟事件,最终求出问题的准确答案(尽管有可能自己并不理解背后的道理)。

1、羊车门问题

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

该问题的 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 %

2、姊妹花

一个家庭中有两个小孩,已知其中一个是女孩,求另一个小孩也是女孩的概率。

from random import * # 0 表示女孩,1 表示男孩

family = (lambda n :[{randrange(2),randrange(2)} for i in range(n)])(int(1e6))

both = family.count({0})                # 都是女孩的家庭数
exist = len(family) - family.count({1}) # 有女孩的家庭数 print(both/exist)

0.33332221770186543

没有那些深奥的分析过程,寥寥数行代码就得到了问题的答案,想必这也是计算机引入数学计算与证明的好处。

3、生日悖论

每个人都有生日,偶尔会遇到与自己同一天过生日的人,但在生活中这种缘分似乎并不常有。我们猜猜看:在 50 个人当中出现这种缘分的概率有多大,是 10%、20% 还是 50%?

from random import *

counter, times = 0, int(1e6)
for i in range(times):
if len({randrange(365) for i in range(50)}) != 50: # 存在同一天生日的人
counter += 1 print('在 50 个人中有相同生日的概率为:',counter/times)

在 50 个人中有相同生日的概率为: 0.970109

在 50 个人中有相同生日的概率高达 97%,这个数字恐怕高出了绝大多数人的意料。我们没有算错,是我们的直觉错了,科学与生活又开了个玩笑。正因为计算结果与日常经验产生了如此明显的矛盾,该问题被称为「生日悖论」,它体现的是理性计算与感性认识的矛盾。

4、扑克牌问题

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

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

cards = [i for i in range(52)]
counter = [0, 0, 0, 0] def once(): # 0 表示黑桃 A
global cards
ace = set(sample(cards, 13)) & {0,1,2,3}
return len(ace), 0 in ace for i in range(int(1e6)):
a, s = once() # a 表示 A 的个数, s 表示是否有黑桃 A
if a:
counter[1] += 1
if s: counter[3] += 1
if a > 1:
counter[0] += 1
if s: counter[2] += 1 print('情况一:', counter[0]/counter[1], '\n情况二:', counter[2]/counter[3])

情况一: 0.3694922900321386
情况二: 0.5613778028656186

有趣的事情出来了:如果这个人宣布了手中 A 的花色,他手中持有多个 A 的概率竟然会大大增加。可这又该如何理解呢?

利用 random 与 tertools 模块解决概率问题的更多相关文章

  1. 利用layui的load模块解决图片上传

    首先肯定要参考layui官网的upload模块文档:http://www.layui.com/doc/modules/upload.html 讲讲思路:在一份添加表单中,我们有个图片上传的模块,然后我 ...

  2. 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题

    async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起 ...

  3. random——伪随机数生成模块

    random——伪随机数生成模块 转自:https://blog.csdn.net/zhtysw/article/details/79978197 该模块包含构造伪随机数生成器的多个方法.对于整数,伪 ...

  4. 利用Python的三元表达式解决Odoo中工资条中城镇、农村保险的问题

    Python中没有像C#中有三元表达式 A?B:C 但在python中可以通过 A if condition else B 的方式来达到同样的效果. 例如 : 1 if True else 0 输出 ...

  5. C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)

    介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...

  6. python 常用模块之random,os,sys 模块

    python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...

  7. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块)   一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...

  8. 关于thinkphp3.1无法加载模块解决办法

    关于thinkphp3.1无法加载模块解决办法 如果没有具体的哪个模块的名字 请注意PHP的版本问题

  9. 利用npm 安装删除模块

    转自 涵一原文 利用npm 安装删除模块 1. npm安装模块 [npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录:[npm install -g xxx]利用npm安 ...

随机推荐

  1. BufferedInputSream和BufferedOutputSream,,,

    package cd.itcast.bufferinputstream; import java.io.BufferedInputStream; import java.io.File; import ...

  2. 在GridControl控件中使用SearchLookUpEdit构建数据快速输入

    较早之前,曾经介绍了一篇文章<使用DataGridView数据窗口控件,构建用户快速输入体验>,介绍了在传统DataGridView中嵌入一个数据窗口进行选择列表,从而实现数据快速录入的操 ...

  3. Android EditText 不弹出输入法

    当第一次进入一个activity的时候  一般是第一个edittext是默认选中的,但是该死的软键盘也一起弹出来了 那是相当的不美观哈!(#‵′)凸.为此, 本大人就去寻找在刚进入这个activity ...

  4. ajax向前台输出二维数组 并解析

    最近在弄一个售后数据统计的功能,里边需要统计特定时期内各种客户.机型的分布比例,单单table来计算并显示很死板(一点也不酷) 于是决定用jquery插件flot并通过ajax传输数据 :flot的折 ...

  5. struts2 s:if标签以及 #,%{},%{#}的使用方法等在资料整理

    <s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session ...

  6. angularjs2 学习笔记(六) Form

    Angular 2 Form表单 在angular2 form表单中我们需要了解表单数据绑定.数据验证.数据提交等内容,在下面的示例中并没有实际提交到后台,这部分内容在今后webapi中加以练习. 表 ...

  7. 自己的php函数库

    //判断数组中是否有元素为空的函数,支持多维数组,相似系统函数in_array(value,array,type) function is_null_array($arr) { if(!is_arra ...

  8. android asmack 注册 登陆 聊天 多人聊天室 文件传输

    XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的 ...

  9. scjp考试准备 - 4 - 关于数组

    好吧这道题我丢脸了,竟然做错了. 如下程序的输出结果是: class Alligator{ public static void main(String[] args){ int[]x[] = {{1 ...

  10. FPGA---ucf文件编写

    摘要:本文主要通过一个实例具体介绍ISE中通过编辑UCF文件来对FPGA设计进行约束,主要涉及到的约束包括时钟约束.群组约束.逻辑管脚约束以及物理属性约束. Xilinx FPGA设计约束的分类 Xi ...