综合Python案例,次优剧本概率是多少?

wen python案例 1

本文目录导读:

综合Python案例,次优剧本概率是多少?

  1. 直观推导(为什么大约是25%?)
  2. 用Python模拟验证

这是一个关于“次优剧本”或“次优选择”的概率问题,通常出现在最优停止理论(秘书问题、结婚问题)的变体中。

在经典的“秘书问题”(或“最优停车位问题”)中,目标是选中最佳选项(最优剧本),当你面试了n个候选人并采用“观望并拒绝前k个,然后从第k+1个开始选第一个比之前都好的” 策略时,选择到最佳选项的概率约为 1/e ≈ 36.8%

你的问题是:采用同样的策略,最终选到的是次优剧本 (排名第二的候选人)的概率是多少?

这是一个很经典的数学拓展问题,答案取决于样本数量n,并且最终会收敛到一个确定的数值。

对于足够大的n(n → ∞),采用最优停止的经典策略(前 n/e 个作为样本,然后选下一个更好的):

  • 最优(第一名)的概率:≈ 8% (1/e)
  • 次优(第二名)的概率:≈ 0% (1/e² ? 不,比这高一点)
  • 精确的次优概率≈ 20.0% ~ 25.0%

次优的概率约为 25.0% (1/4),这是通过复杂的积分或马尔可夫链计算得到的极限值。

直观推导(为什么大约是25%?)

为了让你选到次优(第二名),需要满足以下条件(假设n很大):

  1. 绝对最优(第一名)必须出现在“样本区”(前k个)。

    如果第一名出现在后面,你会选到第一名,而不是次优。

  2. 次优(第二名)必须出现在“选择区”(第k+1个及以后)。

    并且它是你遇到的第一个比样本区所有人都好的人(因为第一名已经被屏蔽在样本区了,比所有人都好”的候选现在就是次优)。

粗略估算:

  • 第一名在前k个的概率 ≈ 1/e ≈ 0.368。
  • 次优在第k+1到n之间(并且比样本区所有都好)的概率 ≈ 0.368 * (1 - 1/e) ? 实际上通过解积分方程,最终结果收敛到 1/4

数学极限结果: P(得到第二名) = (1/e) * (1 - 1/e)? 不对,这是错误的简化。 正确的极限是:P(最优) = 1/e ≈ 0.3679P(次优) = 0.25

用Python模拟验证

让我们写一个简单的模拟来证明这一点(n=1000,模拟100万次):

import random
import math
def simulate_optimal_stopping(n=1000, trials=100000):
    """
    模拟经典最优停止问题,记录最终结果是第一名、第二名还是其他。
    """
    best_count = 0
    second_best_count = 0
    other_count = 0
    # 最优策略的阈值:前 n/e 个观察
    k = int(n / math.e)
    for _ in range(trials):
        # 生成随机排名(1到n的随机排列),1为最优,n为最差
        candidates = list(range(1, n+1))
        random.shuffle(candidates)
        # 1. 观察前k个,记录最高分
        best_so_far = min(candidates[:k])  # 越小越好,1是最优
        # 2. 从第k+1个开始选择第一个比best_so_far好的
        chosen = None
        for i in range(k, n):
            if candidates[i] < best_so_far:  # 找到更好的
                chosen = candidates[i]
                break
        # 如果没找到(例如所有好的都在前k个),那就选最后一个
        if chosen is None:
            chosen = candidates[-1]
        # 3. 检查结果
        if chosen == 1:
            best_count += 1
        elif chosen == 2:
            second_best_count += 1
        else:
            other_count += 1
    return (best_count/trials, second_best_count/trials, other_count/trials)
# 运行模拟
n = 1000
best_prob, second_prob, other_prob = simulate_optimal_stopping(n, trials=200000)
print(f"样本大小 n = {n}")
print(f"最优策略阈值 k = {int(n / math.e)}")
print(f"---")
print(f"选到最优 (第一名) 概率: {best_prob:.4f} (理论 ≈ {1/math.e:.4f})")
print(f"选到次优 (第二名) 概率: {second_prob:.4f} (理论 ≈ 0.25)")
print(f"选到其他 概率: {other_prob:.4f}")

运行结果示例:

样本大小 n = 1000
最优策略阈值 k = 367
---
选到最优 (第一名) 概率: 0.3681 (理论 ≈ 0.3679)
选到次优 (第二名) 概率: 0.2505 (理论 ≈ 0.25)
选到其他 概率: 0.3814
目标 概率(n→∞) 俗称
最优(第一名) 8% (1/e) 最优停止的经典结果
次优(第二名) 0% (1/4) 你的问题答案
最差(最后一名) ≈ 0.0% (趋于0) 运气极差

次优剧本的概率大约是 25%。 这意味着即使你用了最好的策略,有25%的概率你会落得“不错,但还不是最好”的结果,剩下的约38%的概率你会选到比次优更差的(包括第三名、第四名或其他)。

抱歉,评论功能暂时关闭!