前言
小时候的小浣熊干脆面里面的水浒108将卡片估计是很多人的痛. 我知道很多小朋友为了收集全108张卡片, 各显神通, 甚至有些小朋友干脆面都扔了, 只留卡片. 但是, 我从来没听说有小朋友真的把108张卡片收集全了. 为什么呢? 我私下认为有些卡片他们根本就没印刷, 至少这些卡片不是均匀分布的. 当然, 这只是我的阴谋论, 没有任何依据.
没想到, 时隔二三十年, 在南半球, 又开始了一次集卡片之旅. Woolworth超市推出了个叫Disney Worlds of Wonder的活动. 每购物满30刀, 就可以拿一包卡片. 每包卡片里面有3张卡片. 同样一共有108张卡片(不知道大家为什么对108这么痴迷). 并且还推出了一个专门的卡片收集册. 这108张卡来自迪斯尼公司的经典人物, 并且迪斯尼当家四大花旦全部出马: 迪斯尼, 皮克斯, 漫威, 星球大战. 这对小朋友的杀伤力简直是无与伦比的. 所以家长们就惨了, 不断地被小朋友们逼着到超市去买东西, 为的就是拿卡片.
谦的答案
何事谦总体来说已经过了对这些东西疯狂迷恋的年纪, 但是因为他周围不少同学朋友都在收集, 所以他也被卷进来了, 我们去超市购物的频率也上来了. 但是对于一个已经15岁的高中生, 收集不能白收集. 得让他学点东西. 我经常跟他说, 一定学好数学, 生活中的很多东西, 例如彩票, 如果你数学好, 你就不会上套. 这就是一个很好的机会看看他的数学. 我的第一个问题, 假设所有的卡都是均匀分布的, 你平均要在超市花多少钱, 你才能收集全108张卡片?
其实这个问题并不是很麻烦. 并不需要很高深的数学知识. 谦的高中水平完全可以解答. 假设你已经收集了\(n\)张卡片, 那么你下一次收集到一张新卡片的概率是\(\frac{108-n} {108}\). 所以你下一次收集到一张新卡片的期望是\(\frac{108} {108-n}\). 所以你收集到所有卡片的期望是:
看着有点熟悉是吧, 这就是调和级数(harmonic numbers), 我记得还是有近似解的. 当然谦的高中教材是不会教这个的, 但是这也不妨碍他自己推导出来.
也就是说, 平均而言, 你只要肯在Woolworths超市花5,685刀 (因为购物30刀送3张卡, 平均10刀一张), 你就能收集到所有的卡片. 问题解决.
实际情况
等一下, 虽然谦的这个计算没什么大问题, 但是其实是不精确的. 为啥呢? 因为跟小浣熊干脆面水浒卡不一样:
- 这个卡是三张一包, 虽然平均每张卡是消费10刀没错, 但是它还有一个隐藏条件, 就是包内的三张卡是绝对不会重复的. 譬如最简单的例子, 你想拿到三张不重复的迪斯尼卡, 那花30块钱, 概率是100%. 但是拿到三张小浣熊卡, 吃三包干脆面, 概率并不是100%, 因为有可能三包干脆面里面的卡片是重复的, 完全不重复的概率不是100%, 而是\(\frac{108-3} {108}\). 这会导致计算结果比实际结果要大.
- 还有就是这个卡片是一包3张一起的, 你不能花10刀, 拿1张, 然后就拿到我想要的了, 就停了. 这会导致计算结果比实际结果要小.
所以, 要精确计算, 还得用复杂的概率知识. 但是, 这个问题就有点太复杂了, 我是不会给出解析解了, 有兴趣的朋友可以自己试试.
但是这不妨碍我们用暴力蒙特卡罗方法来解决这个问题. 也就是说, 我们随机模拟一大堆人, 每个人都在超市花钱买卡片, 看看平均要花多少钱才能收集全108张卡片. 我写了一个简单的Python程序来模拟这个过程:
import random
def complete_card() -> int:
num_pack: int = 0
my_card = set()
while len(my_card) < 108:
new_pack = set(random.sample(range(1, 109), 3))
num_pack += 1
my_card |= new_pack
return num_pack
def main():
print("Disney Worlds of wonder Simulation via Monte Carlo")
TOTAL_SIMULATIONS = 50000
total_packs = 0
for i in range(TOTAL_SIMULATIONS):
num_pack = complete_card()
total_packs += num_pack
print(f"Average amount of spend: {30 * total_packs / TOTAL_SIMULATIONS}")
main()
运行一下, 结果大概是5635刀, 你才能收集到所有的卡片. 略小于谦的计算.
引申问题
这个问题还可以引申出很多问题. 例如, 如果你有n张卡片, 你还需要开多少包, 花多少钱, 你才能收集到所有的卡片?
一个真实的问题是为了收集齐, 我几乎每个周末都会去超市门口蹲点, 期望能跟别人交换手里没有的卡片, 有一个周末, 一个小朋友为了拿我手里的1张卡, 把他刚刚卖萌从超市拿到的6包没开封的, 都给我了. 因为他还缺那张. 我回家之后, 我说我欺负小朋友了. 但是谦说wait, 我帮你算算那个小朋友手里还差几张, 他才会心甘情愿用6包没开的跟你换1张他没有的. 他算了半天, 告诉我那个小朋友手里大概有大于102张卡. 也就是说, 他还差6张. 但是他给了我6包. 我验算了一下, 大概没错. 但是我绝对不相信那个小朋友是通过数学演算来得出这个结论的. 因为按新西兰的数学水平, 他估计连数到十都困难. 前几天我还看到新闻, 讨论五岁的小孩该不该学习数到10:
Should a five-year-old be able to count to 10
所以他跟我换完全是凭直觉.
结语
我终于人生第一次把108张卡都收集全了. 当然, 最后是通过了跟别人Trade, 其实facebook上有个group, 很多人在里面互通有无, 我跟一个五星级酒店的员工, 用2张她需要的卡, 换了最后20张我需要的卡. 展示一下吧:
当然这个纯属是收藏, 集齐了之后没有任何好处. 只是自己的一种成就感.
最后再提一下那个小浣熊干脆面. 据说108张都收集齐之后, 可以找厂商领1000块钱的奖励. 现在网上很难找到证据, 这里算一个吧, 也是别人的博客, 不一定有权威性
那么问题来了, 如果当年的小浣熊水浒卡真的是均匀分布, 那么根据大谦之前的计算, 一块钱一包的干脆面数学期待只要568.5包, 也就是花568.5块钱, 就能收集齐, 然后去换1000块钱, 从数学上来说那厂商简直是在做慈善, 大家白捡钱. 遇上这种好事就应该破釜沉舟all in. 还好我当年只是小学生, 还不会算概率, 所以没冲动. 当然, 人家小浣熊厂商也从来没说108张卡是均匀分布. 甚至你都不知道他们是不是真的印了108种... 迪斯尼这个因为没任何奖励, 所以很容易集齐.