练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)


Python 官网 https://www.python.org/


  这里,才 python 前沿。可惜是英文原版。所以,我要练习英文阅读。🧐🧐


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。

            —— 华罗庚


练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)


  1. 题目
  2. 填空
  3. 概率定义
  4. 蒙特卡洛法
  5. 代码运行效果
  6. 完整代码

回首页

题目
在这里插入图片描述


回首页

关于概率probability 和蒙特卡洛随机模拟法

  如果您您熟知概率和蒙特卡洛之术,请点击<font size=5)跳过,直接阅读后面的内容。
概率(统计学术语)——“科普中国”科学百科词条:

  概率,亦称“或然率”,它是反映随机事件出现的可能性大小。随机事件是指在相同条件下,可能出现也可能不出现的事件。例如,从一批有正品和次品的商品中,随意抽取一件,“抽得的是正品”就是一个随机事件。设对某一随机现象进行了n次试验与观察,其中A事件出现了m次,即其出现的频率为m/n。经过大量反复试验,常有m/n越来越接近于某个确定的常数(此论断证明详见伯努利大数定律)。该常数即为事件A出现的概率,常用 P (A) 表示。


中文名:概率
外文名:probability


  第一个系统地推算概率的人是16世纪的卡尔达诺。记载在他的著作《Liber de Ludo Aleae》中。书中关于概率的内容是由Gould从拉丁文翻译出来的。
  卡尔达诺的数学著作中有很多给赌徒的建议。这些建议都写成短文。然而,首次提出系统研究概率的是在帕斯卡和费马来往的一系列信件中。这些通信最初是由帕斯卡提出的,他想找费马请教几个关于由Chevvalier de Mere提出的问题。Chevvalier de Mere是一知名作家,路易十四宫廷的显要,也是一名狂热的赌徒。问题主要是两个:掷骰子问题和比赛奖金分配问题。
  概率是度量偶然事件发生可能性的数值。假如经过多次重复试验(用X代表),偶然事件(用A代表)出现了若干次(用Y代表)。以X作分母,Y作分子,形成了数值(用P代表)。在多次试验中,P相对稳定在某一数值上,P就称为A出现的概率。如偶然事件的概率是通过长期观察或大量重复试验来确定,则这种概率为统计概率或经验概率。
  研究支配偶然事件的内在规律的学科叫概率论。属于数学上的一个分支。概率论揭示了偶然现象所包含的内部规律的表现形式。所以,概率,对人们认识自然现象和社会现象有重要的作用。比如,社会产品在分配给个人消费以前要进行扣除,需扣除多少,积累应在国民收入中占多大比重等,就需要运用概率论来确定。


来源


  概率(Probability)一词来源于拉丁语“probabilitas”,又可以解释为 probity.Probity的意思是“正直、诚实”,在欧洲probity用来表示法庭案例中证人证词的权威性,且通常与证人的声誉相关。总之与现代意义上的概率“可能性”含义不同。

古典定义

如果一个试验满足两条:
(1)试验只有有限个基本结果;
(2)试验的每个基本结果出现的可能性是一样的。
  这样的试验便是古典试验。
  对于古典试验中的事件A,它的概率定义为:P(A)=,其中n表示该试验中所有可能出现的基本结果的总数目。m表示事件A包含的试验基本结果数。这种定义概率的方法称为概率的古典定义。


频率定义


  随着人们遇到问题的复杂程度的增加,等可能性逐渐暴露出它的弱点,特别是对于同一事件,可以从不同的等可能性角度算出不同的概率,从而产生了种种悖论。另一方面,随着经验的积累,人们逐渐认识到,在做大量重复试验时,随着试验次数的增加,一个事件出现的频率,总在一个固定数的附近摆动,显示一定的稳定性。R.von米泽斯把这个固定数定义为该事件的概率,这就是概率的频率定义。从理论上讲,概率的频率定义是不够严谨的。


统计定义


  在一定条件下,重复做n次试验,nA为n次试验中事件A发生的次数,如果随着n逐渐增大,频率nA/n逐渐稳定在某一数值p附近,则数值p称为事件A在该条件下发生的概率,记做P(A)=p。这个定义称为概率的统计定义。
  在历史上,第一个对“当试验次数n逐渐增大,频率nA稳定在其概率p上”这一论断给以严格的意义和数学证明的是雅各布·伯努利(Jacob Bernoulli) 。
  从概率的统计定义可以看到,数值p就是在该条件下刻画事件A发生可能性大小的一个数量指标。
  由于频率总是介于0和1之间,从概率的统计定义可知,对任意事件A,皆有0≤P(A)≤1,P(Ω)=1,P(Φ)=0。其中Ω、Φ分别表示必然事件(在一定条件下必然发生的事件)和不可能事件(在一定条件下必然不发生的事件)。


公理化定义


  柯尔莫哥洛夫于1933年给出了概率的公理化定义,如下:
  设E是随机试验,S是它的样本空间。对于E的每一事件A赋于一个实数,记为P(A),称为事件A的概率。这里P(A)是一个集合函数,P(A)要满足下列条件:
(1)非负性:对于每一个事件A,有P(A)≥0;
(2)规范性:对于必然事件,有P(Ω)=1;
(3)可列可加性:设A1,A2……是两两互不相容的事件,即对于i≠j,Ai∩Aj=φ,(i,j=1,2……),则有P(A1∪A2∪……)=P(A1)+P(A2)+……


回首页

蒙特卡罗法

  蒙特卡罗法又称随机抽样技巧法统计试验法,在目前结构可靠度计算中,它被认为是一种相对精确法。其基本原理如下:由概率定义知,某事件的概率可以用大量试验中该事件发生的频率来估算,当样本容量足够大时,可以认为该事件的发生频率即为其概率。因此,可以先对影响其可靠度的随机变量进行大量的随机抽样,然后把这些抽样值一组一组地代入功能函数式,确定结构是否失效,最后从中求得结构的失效概率。蒙特卡罗法正是基于此思路进行分析的。


  从蒙特卡罗方法的思路可看出,该方法回避了结构可靠度分析中的数学困难,不管状态函数是否非线性、随机变量是否非正态,只要模拟的次数足够多,就可得到一个比较精确的失效概率和可靠度指标。特别在岩土体分析中,变异系数往往较大,与JC法计算的可靠指标相比,结果更为精确,并且由于思路简单易于编制程序


  蒙特卡洛随机模拟法的原理是当问题或对象本身具有概率特征时,可以用计算机模拟的方法产生抽样结果,根据抽样计算统计量或者参数的值;随着模拟次数的增多,可以通过对各次统计量或参数的估计值求平均的方法得到稳定结论


回首页

  1. append
birthday_lst = [] # 本次实验全班生日列表。
    for i in range(class_size): # random 模拟全班生日。
        birthday_lst.append(random.randint(0, 364))

  1. ix +1

  2. count += 1

for ix in range(class_size): # 遍历本次实验全班生日,计算有相同生日实验次数。
    if birthday_lst[ix] in birthday_lst[ix+1:]: # True,当前生日在本次实验的全班生日中有相同的。(在当前生日之后的生日列表切片副本中,有当前生日——即生日相同。)
        count += 1 # 生日相同计算器加1。
        break # 找到相同生日,即为有相同生日,不用继续遍历。

回首页

在这里插入图片描述

在这里插入图片描述


回首页

完整 Python 代码


  我的解题思路,已融入代码注释,博文中就不再赘述。

(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)

#!/sur/bin/env python
# coding: utf-8

'''
filename: /sdcard/qpython/tem.py
梦幻精灵_cq的炼码场

'''


from mypythontools import color, wait, cut_line # 从自码工具模块加载需用代码模块中要使用的函数。
import random # 加载随机数模块

class_size = 50 # 班级人数。
tries = 1000 # 蒙特卡洛实验次数蒙特卡洛随机模拟法的原理是当问题或对象本身具有概率特征时,可以用计算机模拟的方法产生抽样结果,根据抽样计算统计量或者参数的值;随着模拟次数的增多,可以通过对各次统计量或参数的估计值求平均的方法得到稳定结论。
count = 0 # 有生日相同的实验次数。
for test in range(tries): # 遍历设定的实验次数。
    birthday_lst = [] # 本次实验全班生日列表。
    for i in range(class_size): # random 模拟全班生日。
        birthday_lst.append(random.randint(0, 364))
    
    for ix in range(class_size): # 遍历本次实验全班生日,计算有相同生日实验次数。
        if birthday_lst[ix] in birthday_lst[ix+1:]: # True,当前生日在本次实验的全班生日中有相同的。(在当前生日之后的生日列表切片副本中,有当前生日——即生日相同。)
            count += 1 # 生日相同计算器加1。
            break # 找到相同生日,即为有相同生日,不用继续遍历。

print(f"\n\n{' ':>4}在班容量这{color(class_size, 'f_green')}的情况下,一共模拟了{color(tries, 'f_green')}次实验。\
\n{' ':>4}生日相同的情况出现{color(count, 'f_green')}个,概率为{color(round(count/tries, 4) * 100, 'f_green')}%。")


wait() 

回首页

上一篇:求偶数和、阈值分割和求差( list 对象的两个基础小题 )

下一篇:均衡办公室人数


我的HOT博:
推荐条件 点阅破千

回首页


老齐漫画头像

精品文章:

来源:老齐教室


回首页

Python 入门指南【Python 3.6.3】

好文力荐:

CSDN实用技巧博文:


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值