量化面试绿皮书:23. 醉酒乘客

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

23. 醉酒乘客

100名乘客排队登机,每人持有一张对应座位的机票(第n位乘客的座位号为n)。
第一位乘客喝醉后随机选择了一个座位(每个座位被选中的概率相等)。
其他乘客清醒时会按票就座,但若自己的座位已被占,则会随机选择一个空座位。

Q: 假设你是第100位乘客,求你坐到座位100的概率。

A: 在100名乘客登机的问题中,第一位乘客随机选择一个座位(每个座位被选中的概率相等),后续乘客如果发现自己的座位空闲则按票就座,否则随机选择一个空闲座位。目标是求第100位乘客坐到座位100的概率。

通过分析,发现无论乘客总数 n n n 是多少( n ≥ 2 n \geq 2 n2),最后一位乘客坐到自己的座位的概率始终为 1 2 \frac{1}{2} 21。这一结论可以通过以下关键观察得出:

  • 座位 1 1 1(第一位乘客的座位)和座位 n n n(最后一位乘客的座位)在随机选择过程中扮演对称角色。
  • 当有乘客被迫随机选择座位时(即发现自己的座位被占用),空座位集合包括座位1、座位 n n n和其他一些座位。
  • 在随机选择过程中,座位 1 1 1和座位 n n n被选中的概率相等。
  • 如果座位 1 1 1在座位 n n n之前被选中,则后续所有乘客(包括第 n n n位)都能坐到自己的座位,因此第 n n n位乘客坐到座位 n n n
  • 如果座位 n n n在座位 1 1 1之前被选中,则座位 n n n被提前占用,第 n n n位乘客无法坐到座位 n n n
  • 由于在每一步随机选择中,座位 1 1 1和座位 n n n被选中的概率相同,因此座位 1 1 1在座位 n n n之前被选中的概率为 1 2 \frac{1}{2} 21,这意味着第 n n n位乘客坐到座位 n n n的概率为 1 2 \frac{1}{2} 21

对于 n = 100 n = 100 n=100,这一概率同样适用。

因此,第100位乘客坐到座位100的概率为:

1 2 \boxed{\dfrac{1}{2}} 21

Python 实现

以下是使用Python实现的代码,通过模拟登机过程计算第100位乘客坐到座位100的概率,并验证理论值1/2:

import random
from typing import Setdef simulate_boarding(n: int, num_simulations: int) -> float:"""模拟乘客登机过程,计算最后一位乘客坐到正确座位的概率。根据概率理论,无论总乘客数多少(n≥2),最后一位乘客坐到正确座位的概率恒为1/2。本函数通过蒙特卡洛模拟验证该理论。Args:n (int): 乘客总数(座位总数),要求n≥2num_simulations (int): 模拟实验次数Raises:ValueError: 如果n < 2Returns:float: 最后一位乘客坐到正确座位的概率估计值"""# 参数校验if n < 2:raise ValueError("乘客总数n必须至少为2")success_count = 0  # 记录成功次数(最后一位坐到正确座位)for _ in range(num_simulations):# 初始化座位状态:用集合跟踪剩余空座位available_seats: Set[int] = set(range(n))# 第一位乘客随机选座(0~n-1均匀分布)first_passenger_choice = random.choice(list(available_seats))available_seats.remove(first_passenger_choice)# 中间乘客(第2位到第99位)登机for passenger in range(1, n - 1):  # 乘客索引1到n-2(共n-2位)# 如果自己的座位空闲,直接入座if passenger in available_seats:available_seats.remove(passenger)# 座位被占则随机选择空座位else:chosen_seat = random.choice(list(available_seats))available_seats.remove(chosen_seat)# 最后一位乘客(第100位)登机:检查唯一剩余座位last_seat = available_seats.pop()if last_seat == n - 1:  # 检查是否是正确座位(索引n-1对应座位100)success_count += 1return success_count / num_simulations# 参数设置
PASSENGERS = 100  # 乘客总数
SIMULATIONS = 100_000  # 模拟次数# 执行模拟并打印结果
probability = simulate_boarding(n=PASSENGERS, num_simulations=SIMULATIONS)
print(f"模拟次数: {SIMULATIONS:,}")
print(f"第{PASSENGERS}位乘客坐到正确座位的概率: {probability:.6f}")
print(f"理论概率值: 0.500000")
print(f"绝对误差: {abs(probability - 0.5):.6f}")

代码说明

  1. 强类型规范

    • 所有变量和返回值均使用类型注解(如Set[int]
    • 函数参数明确标注类型(n: int
    • 添加了详细的文档字符串(docstring),包含参数说明和返回值解释
  2. 核心逻辑

    • 初始化:创建座位集合available_seats(0~99)
    • 第一位乘客:随机选择任意座位
    • 中间乘客
      • 若自己座位空闲则入座
      • 若被占则随机选择空座位
    • 最后一位乘客:检查剩余的唯一座位是否是99号(对应座位100)
  3. 概率计算

    • 通过success_count统计成功次数
    • 返回成功频率作为概率估计值
  4. 理论验证

    • 打印理论值0.5作为参照
    • 显示绝对误差验证准确性

输出示例

模拟次数: 100,000
第100位乘客坐到正确座位的概率: 0.502590
理论概率值: 0.500000
绝对误差: 0.002590

算法分析

  • 时间复杂度 O ( num_simulations × n ) O(\text{num\_simulations} \times n) O(num_simulations×n),单次模拟需处理 n n n 位乘客
  • 空间复杂度 O ( n ) O(n) O(n),维护座位集合
  • 准确性:10万次模拟可使误差小于0.01(95%置信度)

这道面试题的本质是考察候选人将复杂随机过程抽象为概率模型的能力利用递归与对称性进行问题降维的思维,这类能力直接对应量化金融中高频交易撮合、信用风险传染建模以及衍生品路径依赖定价的核心挑战。

🔑 核心知识点

  1. 随机过程建模
    • 登机过程本质是带吸收态的马尔可夫链:座位占用状态转移具有无后效性
  2. 递归问题分解
    • 当第 k k k 位乘客发现座位被占时,问题规模递归降为 n − k + 1 n-k+1 nk+1 的子问题
  3. 概率不变性原理
    • 关键洞察:最后一位乘客的成功概率恒为 1 2 \frac{1}{2} 21 n ≥ 2 n \ge 2 n2),与总人数无关
  4. 吸收态分析
    • 座位 1 1 1 和座位 n n n 构成双吸收态,其被占顺序决定最终结果

📊 面试评估维度

考察维度具体表现要求本题对应点
随机建模能力将现实场景转化为概率模型识别座位占用过程的马尔可夫链特性
递归思维建立自相似问题结构当乘客随机选座时,问题规模递归减小
对称性洞察发现系统隐含的不变量证明座位1和n的对称性导致 P ( n ) = 1 2 P(n) = \frac{1}{2} P(n)=21
金融映射能力关联抽象模型与金融场景类比信用违约链式反应(一家机构违约引发随机传染)或交易所订单流拥堵问题

🧩 典型回答框架

  1. 定义关键事件

    • 事件A:第 1 1 1 位乘客直接坐自己座位(概率 1 n \frac{1}{n} n1)→ 第 n n n 位必然坐对
    • 事件B:第 1 1 1 位乘客坐第n位座位(概率 1 n \frac{1}{n} n1)→ 第 n n n 位必然坐错
    • 事件C:第 1 1 1 位坐第 k k k 位座位( 2 ≤ k ≤ n − 1 2 \le k \le n - 1 2kn1, 概率 n − 2 n \frac{n-2}{n} nn2
  2. 递归分解

    P n = 1 n × 1 + 1 n × 0 + 1 n ∑ k = 2 n − 1 P n − k + 1 P_n = \frac{1}{n} \times 1 + \frac{1}{n} \times 0 + \frac{1}{n} \sum_{k=2}^{n-1} P_{n-k+1} Pn=n1×1+n1×0+n1k=2n1Pnk+1

    • 当第1位占 1 1 1 座时,第 21 21 21 k − 1 k-1 k1 位正常入座,问题退化为 n − k + 1 n-k+1 nk+1 人子问题
  3. 数学归纳证明

    • 基准情形: n = 2 n=2 n=2 P 2 = 1 2 P_2 = \frac{1}{2} P2=21
    • 假设 P m = 1 2 P_m = \frac{1}{2} Pm=21 对所有 m < n m < n m<n成立
    • 代入递归式得 P n = 1 n + n − 2 n ⋅ 1 2 = 1 2 P_n = \frac{1}{n} + \frac{n-2}{n} \cdot \frac{1}{2} = \frac{1}{2} Pn=n1+nn221=21
  4. 对称性论证

    • 在整个过程中,座位1和座位 n n n 被随机选中的概率始终相等
    • n n n 位坐对当且仅当座位 n n n 比座位 1 1 1 更晚被占用

💡 核心洞察

  1. 系统鲁棒性

    • 无论乘客规模 n n n 如何增大( n ≥ 2 n \ge 2 n2),系统最终收敛到相同概率,反映复杂系统中的相变现象
  2. 金融场景隐喻

    • 风险传染:类比首个机构违约后,风险在金融网络中随机扩散至特定机构的概率
    • 订单流分析:高频交易中单一错误订单引发交易所撮合系统连锁反应的建模
  3. 模型扩展方向

    • 若加入乘客选座偏好(如总是优先选择靠窗座位),模型可延伸至行为金融场景
    • 若醉汉乘客数增加,可建模系统性风险压力测试的临界阈值

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。

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

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

相关文章

AntV G6入门教程

以下教程聚焦于 AntV G6 的 数据操作 API,详细介绍各个方法的用途、参数以及完整的使用示例,帮助你在图实例上精细地读取、修改和管理节点/边/组合等数据。文中示例代码均基于 G6 v5.0.47 官方文档 ([g6.antv.antgroup.com][1])。 一、获取完整图数据 1.1 graph.getData() …

67、数据访问-crud实验-分页数据展示

67、数据访问-crud实验-分页数据展示 分页数据展示是数据访问中常见的功能&#xff0c;用于将大量数据分割成多个页面显示&#xff0c;提升用户体验和系统性能。以下是分页数据展示的相关介绍&#xff1a; #### 基本原理 1. **确定每页显示数量**&#xff1a;设定每页显示的数…

常见 Web 服务器

Web 服务器有很多种&#xff0c;功能和用途略有不同&#xff0c;下面我会分类介绍主流的 Web 服务器&#xff08;包含静态/动态/反向代理支持&#xff09;并重点说明类似 Tomcat 的 Java 支持型。 常见 Web 服务器分类 类型名称描述与特点&#x1f310; 静态资源服务器Nginx高…

【MacOS】M3 Pro芯片MacBook极速搭建Kubernetes

M3 Pro 芯片 MacBook 2023上使用 Colima 安装 Kubernetes。 Colima 轻量、高效&#xff0c;并且在 Apple Silicon 架构上表现出色。 下面是详细的、一步一步的安装和配置指南。 核心思路 我们将通过以下步骤完成整个过程&#xff1a; 准备工作: 安装必要的工具&#xff0c;…

import { Add, Dongdong, UserAdd } from ‘@nutui/icons-react‘ 使用图标导入库报错

import { Add } from "nutui/icons-react-taro"; 官网的导入的库名字不全&#xff0c;后面要加-taro&#xff0c;就行了

猿人学js逆向比赛第一届第七题

分析响应 看到响应体里面的data是个字体加密&#xff0c;于是这里可以看到woff文件也给返回了&#xff0c;这里现分析这个文件。 打开可以看到这里a351对应的是3和页面中的3是对应的&#xff0c;于是用ddddocr动态识别字体文件中的字体&#xff0c;然后对应对应的字体替换是不…

股票心理学习篇:交易的人性弱点 - 频繁交易

以下内容为学习时的笔记整理&#xff0c;视频作者来自B站&#xff1a;老猫与指标 视频链接&#xff1a;频繁交易必死&#xff1f;底层逻辑深度剖析&#xff0c;老猫的的破局心法与实战策略分享 交易的人性弱点 - 频繁交易 主讲人&#xff1a; 老猫 1. 引言&#xff1a;问题的…

WPF入门 #1 WPF布局基础、WPF样式基础、WPF数据模板、WPF绑定

WPF当中有许多的布局容器控件&#xff0c;例如<Grid>、<StackPanel>、<WrapPanel>、<DockPanel>、<UniformGrid>。接下来分别介绍一下各个布局容器控件。 布局基础 Grid <Grid><Grid.RowDefinitions><RowDefinition Height&qu…

开源大型语言模型的文本记忆新突破!

在现代科技的推动下&#xff0c;人工智能领域正在不断地突破人类认知的极限。今年&#xff0c;由斯坦福大学、康奈尔大学和西弗吉尼亚大学的计算机科学家们&#xff0c;与法律学者共同展开了一项引人入胜的研究&#xff0c;聚焦于开源大型语言模型的文本记忆表现。这项研究不仅…

LeetCode 3090.每个字符最多出现两次的最长子字符串

题目链接 https://leetcode.cn/problems/maximum-length-substring-with-two-occurrences/ 题目描述 给定一个字符串 s&#xff0c;找出满足每个字符最多出现两次的最长子字符串&#xff0c;并返回其长度。 示例 输入&#xff1a;s "aabba" 输出&#xff1a;5解…

使用开源NVIDIA cuOpt加速决策优化

使用开源NVIDIA cuOpt加速决策优化 文章目录 使用开源NVIDIA cuOpt加速决策优化决策优化的现实挑战供应链优化的复杂性实时决策的挑战计算复杂性的挑战 NVIDIA cuOpt&#xff1a;GPU加速的决策优化解决方案cuOpt的核心技术架构支持的优化问题类型性能优势分析 实际应用案例&…

【JVM 09-垃圾回收】

垃圾回收 笔记记录 1. 如何判断对象可以回收1.1 引用计数法1.1.1 缺点 1.2 可达性分析算法1.2.1 可达分析、根对象1.2.2 优缺点 1.3 四种引用(强软弱虚)1.3.1 软引用的实际使用案例1.3.2 软引用-引用队列1.3.3 弱引用的实际使用案例 2. 垃圾回收算法2.1 标记清除算法2.2 标记整…

《二叉搜索树》

引言&#xff1a; 上次我们结束了类和对象的收尾&#xff0c;之后我们就要学习一些高级的数据结构&#xff0c;今天我们先来看一个数据结构-- 二叉搜索树。 一&#xff1a; 二叉搜索树的概念(性质) 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是…

【Redis】Sentinel哨兵

&#x1f6e1;️ 深入理解 Redis Sentinel&#xff1a;高可用架构的守护者 在实际开发中&#xff0c;我们常用 Redis 构建缓存系统或数据中间件。然而&#xff0c;主从复制虽然能实现数据同步&#xff0c;但无法自动故障转移&#xff08;failover&#xff09;&#xff0c;这就…

Shell脚本应用及实战演练

文章目录 一、Shell脚本语言的基本结构1、Shell脚本的用途&#xff1a;2、 Shell脚本基本结构&#xff1a;3、 创建Shell脚本过程4、 脚本注释规范 二、Shell脚本语言的变量用法详解位置与预定义变量 三、 Shell字符串详解1、Shell字符串拼接2、Shell字符串截取3、 Shell的格式…

软件工程瀑布模型学习指南

软件工程瀑布模型学习指南 一、瀑布模型核心概念 1.1 定义与特点 瀑布模型是一种经典的软件开发流程,将项目划分为顺序性的阶段,每个阶段有明确的输入和输出,如同瀑布流水般单向推进。其特点包括: 阶段间具有明确的顺序性和依赖性强调文档驱动和阶段评审适合需求明确、稳…

获取gitlab上项目分支版本(二)

获取gitlab上项目分支版本_gitlab代码分支版本在哪-CSDN博客 原先写过一版&#xff0c;但是这次想更新一下项目的分支信息时&#xff0c;提示我 git服务器上的Python版本是2.7.3&#xff0c;这个错误表明当前Python环境中没有安装requests库&#xff0c;服务器也没有连接外网&…

主流防火墙策略绕过漏洞的修复方案与加固实践

主流防火墙策略绕过漏洞的修复方案与加固实践 流量关键点分析&#xff08;攻击手法&#xff09; 攻击者通过精心构造的TCP序列号攻击和恶意标志组合绕过防火墙DPI检测&#xff0c;核心手法如下&#xff1a; TCP连接建立&#xff08;正常握手&#xff09; 1049&#xff1a;客户…

泛微OAe9-后端二开常见数据库操作

泛微OAe9-后端二开常见数据库操作 文章目录 泛微OAe9-后端二开常见数据库操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存储过程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 适用于操作 OA 自己的库。OA 数据库…

【数据分析八:hypothesis testing】假设检验

本节我们讲述假设检验和抽样方法 有关假设检验的详细内容&#xff0c;可以参考我以往的博客 概率论与数理统计总复习_概率论与数理统计复习-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞33次&#xff0c;收藏23次。中科大使用的教辅《概率论和数理统计》&#xff0c;带大家复…