解决一个有意思的抛硬币问题,计算连续两次正面所需次数的数学期望

文章目录

  • 一、问题与分析
  • 二、基本的数学推导
  • 三、代码示例

🍉 CSDN 叶庭云https://yetingyun.blog.csdn.net/


一、问题与分析

问题:对于质地均匀的硬币,连续两次得到正面所需的次数数学期望是多少?

在这里插入图片描述

关键词:抛硬币、均匀、连续、两次正面

一些分析

  • 这个经典的概率论问题要求我们给出抛掷一枚均匀硬币直到连续两次都出现正面为止,平均需要抛掷多少次。连续两次的概念很关键

  • 这代表了一类问题,它们可以总结为在一连串不断重复的实验中,第一次连续出现 n n n 次成功所需要的平均次数。

  • 解决此问题可采用马尔可夫链(马尔可夫状态转换图,列方程求解)或更简单的递归方法。通过数学推导,还能得到通项公式:平均抛掷 2 ( n + 1 ) − 2 2^{(n+1)} - 2 2(n+1)2 次硬币才会出现 n n n 连正的情况。


二、基本的数学推导

我们可以通过建立一个递归关系来解决这个问题。设 E E E 为得到连续两次正面所需的抛掷次数的期望值。我们可以将问题分解为以下几种情况:

  • 第一次抛掷就得到正面(概率为 1 2 \frac{1}{2} 21),然后我们就处于了一个新的状态,即下一次抛掷如果再次得到正面,游戏结束;否则,我们回到初始状态。设从这个状态开始,直到游戏结束所需的期望抛掷次数为 E 1 E_{1} E1

  • 第一次抛掷得到反面(概率为 1 2 \frac{1}{2} 21),这时我们仍然处于初始状态,因为我们一次正面也没有得到过。设从这个状态开始,直到游戏结束所需的期望抛掷次数为 E 0 E_{0} E0

由于 E 0 = E E_{0} = E E0=E因为它们都代表从游戏开始直到结束的期望抛掷次数),我们可以建立以下等式:

E = 1 2 × ( 1 + E 1 ) + 1 2 × ( 1 + E ) E = \frac{1}{2} \times (1 + E_1) + \frac{1}{2} \times (1 + E) E=21×(1+E1)+21×(1+E)

对于 E 1 E_{1} E1,如果第二次抛掷得到正面(概率为 1 2 \frac{1}{2} 21),游戏结束;如果得到反面(概率为 1 2 \frac{1}{2} 21),则回到初始状态 E E E。因此有:

E 1 = 1 2 × ( 1 ) + 1 2 × ( 1 + E ) E_1 = \frac{1}{2} \times (1) + \frac{1}{2} \times (1 + E) E1=21×(1)+21×(1+E)

联立解这两个方程,我们可以求出 E E E 的值为 6

另一种推导

在这里插入图片描述

E = 1 2 × ( E + 1 ) + 1 4 × ( E + 2 ) + 2 × 1 4 (连续两次正面) E = \frac{1}{2} \times (E+1) + \frac{1}{4} \times (E+2) + 2 \times \frac{1}{4} \tag{连续两次正面} E=21×(E+1)+41×(E+2)+2×41(连续两次正面)
E = 1 2 × ( E + 1 ) + 1 4 × ( E + 2 ) + 1 8 × ( E + 3 ) + 3 × 1 8 (连续三次正面) E = \frac{1}{2}\times (E+1) + \frac{1}{4} \times (E+2) + \frac{1}{8} \times (E+3) + 3 \times \frac{1}{8} \tag{连续三次正面} E=21×(E+1)+41×(E+2)+81×(E+3)+3×81(连续三次正面)

此外,当抛掷的硬币不均匀时,即正面的概率不再是 1 2 \frac{1}{2} 21通项公式为:

p − n − 1 1 − p \frac{p^{-n}-1}{1-p} 1ppn1

代入不同的 n n n要求连续出现的次数)和 p p p正面的概率)就能得到准确结果。


三、代码示例

下面这段代码的主要功能是通过模拟实验来估计在一系列硬币投掷中,得到连续 n n n 次正面的平均所需次数(即数学期望)。这个问题在概率论和统计学中很常见,尤其是在研究随机过程和伯努利试验时。代码通过大量模拟来近似实际的数学期望值,这种方法在理论值难以直接计算时特别有用。

import randomdef simulate_coin_toss(n, p):"""模拟投掷硬币直到出现连续 n 次正面"""# 记录投掷次数和连续正面的次数count, consecutive_heads = 0, 0while consecutive_heads < n:# random() 方法返回一个在 [0,1) 范围内的随机实数if random.random() < p:         # 随机投掷硬币,得到正面的概率为 p。consecutive_heads += 1else:consecutive_heads = 0       # 如果得到反面,重置连续正面的计数。count += 1      # 每次投掷都增加计数return countdef calculate_expected_value(num_simulations, n, p):"""计算得到连续 n 次正面所需次数的数学期望"""# 记录所有模拟的总次数total_count = 0for _ in range(0, num_simulations):total_count += simulate_coin_toss(n, p)return total_count / num_simulations      # 计算平均次数作为数学期望的近似值# 质地均匀的硬币,得到连续两次正面所需次数的数学期望是?
# 示例:模拟 1000000 次投掷
num_simulations = 1000000
# 正面的概率
positive_probability = 0.5
# 连续出现次数
successive_times = 2
expected_value = calculate_expected_value(num_simulations,successive_times,positive_probability)
print(f"经过 {num_simulations} 次模拟,得到连续 {successive_times} 次正面所需次数的数学期望近似为:{expected_value:.2f}")# 程序运行结果如下:
# 经过 1000000 次模拟,得到连续 2 次正面所需次数的数学期望近似为:6.00

代码解释

  • 导入了 Python 的 random 模块,它提供了生成随机数的函数,用于模拟投掷硬币的随机性。

  • 定义模拟函数。这个函数接受两个参数:n 表示连续出现正面的次数目标,p 表示每次投掷得到正面的概率。当达到连续出现指定次数的正面后,函数返回总的投掷次数。

  • 定义计算期望值的函数。这个函数通过多次模拟来计算达到连续两次正面所需次数的平均值(即数学期望)。它接受三个参数:模拟次数 num_simulations、连续出现正面的目标次数 n 和每次投掷得到正面的概率 p。将累加的总投掷次数除以模拟次数,得到平均投掷次数,作为连续两次正面所需次数的近似期望值。

  • 主程序部分。这部分代码设置了模拟参数,并调用 calculate_expected_value 函数进行模拟计算。然后打印出通过大量模拟得到的连续两次正面所需次数的近似期望值。

该算法的时间复杂度O(n),其中 n 是模拟投掷的次数。这是因为我们需要对每次模拟投掷进行计数,直到满足条件为止。空间复杂度O(1),因为我们只使用了固定数量的变量来存储投掷次数和连续正面的计数。

使用通项公式直接计算,其时间复杂度和空间复杂度均为 O(1)。以下是一个代码示例:

def expected_number_of_tosses(n, p):"""计算得到连续 n 次正面所需的抛掷硬币次数的数学期望。Return:float:连续 n 次正面所需的抛掷次数的数学期望。"""return (p ** (-n) - 1) / (1 - p)# 正面的概率
positive_probability = 0.5
# 连续出现次数
successive_times = 2
result = expected_number_of_tosses(successive_times,positive_probability)print(f"得到连续 {successive_times} 次正面所需次数的数学期望是: {result}")# 程序运行结果如下:
# 得到连续 2 次正面所需次数的数学期望是:6.00

📚️ 相关链接:

  • 几道抛硬币问题

  • 抛硬币直到连续若干次正面的概率

  • 一道机器学习岗位面试题:平均要抛多少次硬币,才能出现连续两次正面向上?

  • 不均匀硬币求解两个正面的期望

  • 抛硬币直到出现连续 N 次正面为止的期望

  • 抛硬币次数的期望

  • 抛一枚硬币连续抛出两次正面的概率是多少?同样抛一枚硬币直至连续 2 次出现正面,此时抛的次数期望值为多少?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10天学会kotlin DAY6 继承、类、重载

kotlin 继承与重载 前言 1、open 关键字 2、类型转换 3、Any 超类 4、对象声明 5、对象表达式 6、伴生对象 7、嵌套类和内部类 8、数据类 9、copy 函数 10、运算符重载 11、枚举类定义函数 12、代数数据类型 13、密封类 14、数据类的小结 总结 前言 使用纯代码…

「MySQL」索引事务

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 索引&事务 &#x1f349;索引&#x1f34c;特点&#x1f34c;通过 SQL 操作索引&#x1f34c;底层数据结构 &#x1f349;事务&…

Nginx的反向代理

Nginx的反向代理 location ^~ /aaa {proxy_pass http://192.168.15.78/; } 1. 跨域 2.Nginx 代理服务器缓存 3.Nginx 负载均衡 4. 动静分离 Nginx的跨域 跨源资源共享 (CORS) 是一种机制&#xff0c;它使用额外的 HTTP 标头让用户代理获得访问来自不同来域的服务器上选定资…

3.31学习总结

算法 解题思路 使用dfs,对蛋糕每层可能的高度和半径进行穷举.通过观察我们可以知道第一层的圆面积是它上面所有蛋糕层的圆面积之和,所以我们只要去求每层的侧面积就行了. 因为题目要求Ri > Ri1且Hi > Hi1,所以我们可以求出每层的最小体积和侧面积,用两个数组分别储存起来…

C语言实现猜数字游戏(有提示,限制次数版)

这次的猜数字游戏我添加了新的功能&#xff1a;为玩家添加了提示&#xff0c;以及输入数字的限制次数。 首先&#xff0c;我们的猜数字游戏需要一个菜单&#xff0c;来让玩家可以选择玩游戏还是退出游戏&#xff0c;所以我们需要开始就打印一个菜单&#xff1a; int main() {…

Mac air 个人免费版VMWare Fusion安装及配置教程

Mac air 安装免费版VMWare Fusion教程及问题解决 1、下载VMWare Fusion2、下载wins镜像文件3、开始配置4、出现的问题及解决方法4.1 如何跳过启动时的网络连接4.2 启动后&#xff0c;无法连接网络怎么办4.3 怎么实现将文件拖拽到虚拟机中 当你手上是一台Mac电脑&#xff0c;却需…

VS Code常用前端开发插件和基础配置

VS Code插件安装 VS Code提供了非常丰富的插件功能&#xff0c;根据你的需要&#xff0c;安装对应的插件可以大大提高开发效率。 完成前端开发&#xff0c;常见插件介绍&#xff1a; 1、Chinese (Simplified) Language Pack 适用于 VS Code 的中文&#xff08;简体&#xff…

【原创】基于分位数回归的卷积长短期结合注意力机制的神经网络(CNN-QRLSTM-Attention)回归预测的MATLAB实现

基于分位数回归的卷积长短期结合注意力机制的神经网络&#xff08;CNN-QRLSTM-Attention&#xff09;是一种用于时间序列数据预测的深度学习模型。该模型结合了卷积神经网络&#xff08;CNN&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;和注意力机制&#xff08;A…

C++ 数组 结构编程题

一 求100以内的所有素数 /* * 需要标记2~100 之间的数是否处理 * 用数组&#xff0c;初始为0 表示都是素数&#xff0c;如果 判断为合数则置为1过用 */ #include<stdio.h> #include<math.h> int main() {const int n 100;int isPrim[n 1] { 0 };int i, j;for (…

MAC的Safari浏览器没有声音解决办法

有一段时间没打开电脑&#xff0c;也不知道是系统自动更新或是什么缘故&#xff0c;所有浏览器都无法正常发声。 现象如下&#xff1a; 首先&#xff0c;Safari浏览器无法自动播放声音&#xff0c;下载的360浏览器现象一致&#xff0c;但是播放其他音乐播放软件和视频软件都正…

JavaScript(二)---【js数组、js对象、this指针】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 一.js数组 在js中也有数组的概念&#xff0c;数组使用“[]”定义&#xff0c;其中数组中还可以嵌套数组从而达到多层数组的作用。 访问数组中的某个元素&#xff0c;我们可以直…

pymysql使用记录

最近由于需要来学习一下pymysql。 先来认识一下pymysql&#xff1a; PyMySQL 是 Python 中一个用于连接 MySQL 数据库的库。它允许 Python 程序通过简单的 API 调用来连接、操作和管理 MySQL 数据库。PyMySQL 是在 Python 中使用纯 Python 编写的&#xff0c;因此它可以在几…

MySQL编程实战LeetCode经典考题

文章简介 本文主要收集了LeetCode上关于MySQL的一些经典考题。 后续也会陆续把所有经典考题补充完整。 175.组合两个表 175.组合两个表 解答&#xff1a; select p.FirstName as firstName, p.LastName as lastName,a.City as city, a.State as state from Person p l…

loadbalancer 引入与使用

在消费中pom中引入 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 请求调用加 LoadBalanced 注解 进行服务调用 默认负载均衡是轮训模式 想要切换…

【b站李炎恢】Vue.js Element UI 下 | 十天技能课堂 | 更新中... | 李炎恢

课程地址&#xff1a;【Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢】 https://www.bilibili.com/video/BV1U54y127GB/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 备注&#xff1a;虽然标题声明还在更新中&#xff0c;但是看一些常用…

Python库使用介绍 LivermorE AI Projector for Computed Tomography LEAP

Python库使用介绍 LivermorE AI Projector for Computed Tomography LEAP 前言Projector 用于设定投影参数的类参数解释&#xff1a;其它功能load_param(str filepath)forward(ipt, project_mode"forward") 样例代码后记 前言 github开源代码 python API文档 作为一…

TypeScript-自动编译

1.生成文件 tsc --init 2.修改配置文件 说明&#xff1a;通过CTRLF搜索到以下单词&#xff0c;进行修改。 "strict": true, //是否开启严格模式 "outDir": "./outFile", //表示ts文件最终编译为js文件&#xff0c;js文件存放的位置 3.新…

C++心决之命名空间、重载函数和引用

目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性…

基于spark的大数据分析预测地震受灾情况的系统设计

基于spark的大数据分析预测地震受灾情况的系统设计 在本篇博客中,我们将介绍如何使用Apache Spark框架进行地震受灾情况的预测。我们将结合数据分析、特征工程、模型训练和评估等步骤,最终建立一个预测模型来预测地震造成的破坏程度,同时使用可视化大屏的方式展示数据的分布…

DreamSim技术小结

paperhttps://arxiv.org/abs/2306.09344codehttps://github.com/ssundaram21/dreamsimorgMiT个人博客主页http://myhz0606.com/article/dream_sim 1 Motivation 目前较为成熟度量图片相似性的做法是通过模型将图片转为embedding&#xff0c;再用余弦相似度来度量相似性。虽然…