《神秘的程序员们》漫画:31、32、34

jopen 9年前

关于未来程序员将变得不再紧缺的预言或报道,从来没有停止过。但与此同时,所有人不得不面对的一个事实是:你招聘不到程序员。

《神秘的程序员们》漫画:31、32、34

《神秘的程序员们》漫画:31、32、34

32 年会上的程序员们……  

女优?艳舞?鼓励师?反串表演?NO,NO,NO, 一个有许多程序员的年会是这样的……

《神秘的程序员们》漫画:31、32、34

《神秘的程序员们》漫画:31、32、34

《神秘的程序员们》漫画:31、32、34

《神秘的程序员们》漫画:31、32、34

《神秘的程序员们》漫画:31、32、34

注1:Random.org 通过大气噪音 (Atmospheric Noise)生成真随机数,由爱尔兰都柏林三一学院 Mads Haahr 博士于 1998 创建。它有免费和收费两种 API 供开发者使用,相对于计算机产生的伪随机数,使用 Random.org API 用于博彩、抽奖之类的应用是非常严肃的。

注2:这个年会故事的灵感来自于一条朋友圈。如果是真的,这应该是一家技术主导的互联网公司,有读者知道是哪家,透个底给我?

《神秘的程序员们》漫画:31、32、34

34 摔!这个春节期间最凶残的一期漫画  

点开它这个假期你就有事干了

《神秘的程序员们》漫画:31、32、34

“一次抽出 50 个数和抽 50 次(每次 1 个)在概率上难道不是相等的吗?”

《神秘的程序员们》漫画:31、32、34

这个问题需要分两步来回答。

1、如何抽出 50 个数。正确的设计是先将全部有效工号 list 的索引生成随机序列,再取序列的前 50 位为中奖者。如果你的随机序列算法没有太奇怪的话,可以保证每个人的中奖率是公平的。如果你刷了不少面试题,大概还记得 洗牌算法(ShuffleArray)吧,也知道它有各种错误实现。实现这个算法要用到随机数,于是又有了伪随机数的问题,所以原文我们没有自己实现这个算法,我们用了 random.org 提供的随机序列(见原文中被 review 的代码,就是 http 调用 api 取随机序列的)。

2、在抽奖程序中 “抽 50 次”的隐含前提是每抽出一个号码后会公布,然后从奖池中移走。所以让我们假设有效工号是 51 个,每次抽出一个工号、公布、移走。再抽取下一个、公布,移走……直到 50 个中奖名额都取完。很显然进行第一次抽取(公布前),奖池中每个人的中奖概率是1/51;但进行第 50 次抽取(未公布前),奖池中每个人的中奖概率是1/2。所以用抽 50 次的方法,每次抽取时,奖池里剩下的人的获奖概率是不平等的。。

还会有人问:所谓的生成随机序列,生成的时候难道不也是一个一个地取号码?但在序列生成完成前,只要这 50 个号码还未公布。奖池里所有人的人仍然拥有相同的概率。

但从群众的情绪角度出发,人们肯定更愿意看系统一个一个地抽出下一位获奖者,而不是更在乎什么概率上绝对公平。

《神秘的程序员们》漫画:31、32、34

如果要兼顾公平和现场气氛,理想的做法是抽出一次 50 个工号后,再配合一个激动人心的看起来是正在抽奖的动画来显示下一个中奖号码

正如进度条的存在意义一样……

《神秘的程序员们》漫画:31、32、34

说到抽奖的概率问题,不可不提的是著名的“三门问题”(Monty Hall problem)

《神秘的程序员们》漫画:31、32、34

只要在任何论坛、问答站、社交群、研讨会上贴出三门问题,都会吵上几十页,从初中生到数学博士都热衷于讨论,并且谁也无法说服谁,最后以互骂民科、羞辱对方智商收场。

《神秘的程序员们》漫画:31、32、34

让这个数学游戏问题变得著名的是 Marilyn vos Savant,至今为止吉尼斯世界纪录中拥有最高智商的人类/女性,10 岁时测得 IQ 高达 228。她在《Parade》杂志开专栏回答读者来信,有一位读者在 1990 年向她提出了三门问题。Vos Savant 的回答是:

“你原先选择的门有1/3 的胜率,但剩下的门有2/3 的胜率。所以你应该改变选择。如果我们把问题换成 100 个门,你选了A门,然后(知道奖品在哪的)主持人为你打开了 98 扇有猫的门,这样一假设的话你肯定毫不犹豫会换门,对吧。”(见注1)

她的答案看起来相当反直觉,所以在专栏上登出以后,收到了来自群众和学界的雪片般的质疑。

“看起来你很喜欢直奔要点,那我也直接点:你搞砸了。如果一扇门打开后显示没有奖品,那么剩下的两扇门胜率都各是1/2,没什么可能一扇门比另一扇门的概率高。作为一个职业数学家,我为大众在数学技能的缺失感到十分担忧。请承认你的错误,并在未来更用心些。”

Robert Sachs, Ph.D.

乔治梅森大学

“你捅篓子了,你捅大篓子了!看起来掌握基本的数学原理对你是有困难的。无论你是否改变选择,概率都是1/2。这个国家里已经有够多的数学文盲了,我们用不着“世界智商最高的人”来证明这一点了。丢人!”

Scott Smith, Ph.D.

弗罗里达大学

作为反击,Vos Savant 在她的专栏对三门问题做了更详细的分析(用来解决三门问题的方法很多,她在回信里用的是最容易理解的 simple solutions)

《神秘的程序员们》漫画:31、32、34

在“主持人知道每个门后有啥,且只打开有猫的门”这个命题限定条件下:换门有2/3 的胜率,不换只有1/3 的胜率(因为你首次选中的门后有车的概率是1/3)

没想到,她收到了更多措辞粗鲁的回信。92% 的大众不同意她的答案,65% 来自高校的来信认为她是错的。

“你错了。但爱因斯坦在承认自己的错误后在人们心中赢得了更多尊重。”

Frank Rose, Ph.D.

密歇根大学

“我曾经是你专栏的忠实读者。但这件事上你真的错了。我是专业干这个的。”

James Rauff, Ph.D.

密利克大学

“在回答此类问题之前,你应该重修概率。”

Charles Reid, Ph.D.

弗罗里达大学

“我肯定你能收到不少来自高校学生的来信,建议你留着他们的地址以便在未来求助。”

W. Robert Smith, Ph.D. 

佐治亚州立大学

“你错得不能再错了。我希望这次的争论能唤起人们对当今数学教育形势之严峻程度的关注。如果你能承认自己的错误,尚能对目前可悲的现状作出一些贡献。到底多少愤怒的数学家才能让你改变观点?”

E. Ray Bobo, Ph.D.

乔治城大学

“很震惊,在被至少三个数学家纠正之后,你仍然没意识到自己的错误。”

Kent Ford

迪克森州立大学

“可能女人看待数学问题就是跟男人不一样。”

Don Edwards

俄勒冈州桑河市 

“你就是那只羊!” (三门问题原题是两只羊和一辆豪车。漫画做了萌化改编)

Glenn Calkins

西密苏里州立大学

“你错了。但积极一面看,要是所有的这些 Ph.D 都错了,我们的国家就有大麻烦了”

Everett Harman, Ph.D.

美国陆军研究院

尽管第二次回复后收到的来信重得差不多把杂志的(物理意义上)邮箱都压坏了,vos Savant 第三次在专栏上回复坚持自己是对的。并号召全国的数学课堂都拿这个问题做一下概率实验,无论人肉或计算机模拟都行。

最后几乎所有做了实验的反馈都证明她是对的:改变选择后赢取豪车的概率上升为2/3,而不是1/2 或1/3。大部分教授和学生在看到实验数据时都震呆了。

连 Paul Erdős在内的顶级数学家都在这个问题上失了足 (迄今为止发表论文数最多的数学家,在数论、图论、组合数学、概率论、集合论、近似理论等领域颇有建树)。即使在 "a formal mathematical proof of the correct answer “面前,他仍然拒绝相信且更加愤怒。直到亲眼看到数百次计算机模拟的结果,他才不得不承认自己错了(见注2)。 Paul 的牛逼生平见注 3 (译文)

如此多的数学/理工博士会栽在这个问题上,就是因为它太反直觉了。对于所有搞科学为生的人,过于相信自己的直觉是会倒霉,不经过计算就羞辱对手更是会倒大霉的,也有可能学界对吉尼斯、IQ 测试、女性这几个关键字的组合有天然敌意。但结果就是,以上这些来自各大高校的 Ph.D 的精彩言论(连同署名和学院)被一直留在 vos Savant 官网的页面上。25 年来,任何三门问题的论文/讨论/wiki 都会引用这个页面。除非她不再给服务器续费或被骗走域名,这些人差不多会被一直围观下去。


与此类似的另一个经典概率悖论是 Two envelops problem

《神秘的程序员们》漫画:31、32、34

这个困局应该如何破解?解释见注4,或结尾处扫码取药。


不够过瘾的话来看看和三门问题密切相关,但更反直觉的 Bertrand's Box Paradox

《神秘的程序员们》漫画:31、32、34

解释请看注 5 和注6(中文) ,或结尾处扫码取药。


感觉没被虐够的欢迎来到 Boy or Girl paradox (Two Child Problem )

《神秘的程序员们》漫画:31、32、34

感觉智力被伤害的同学们,来看个段子开心开心吧,

《神秘的程序员们》漫画:31、32、34

分析过程及问题拓展请看注 8 或注9,或结尾处扫码取药。

这是 96 年 vos Savant 在《Parade》杂志专栏上讨论的另一个坑人概率段子。作为智商最高的人类,她还真的是很厉害,1990 年的三门问题大讨论后,估计受到一万点伤害的学界们很可能会一直用各种悖论或陷阱问题钓她的鱼。但直到 2012 年她才犯了一个错误,随后纠正了。后来 2013、2014、2015 年她每年都各犯了一个错误(回答专栏问题时),全都被 wiki 页面记录下来……(注 10)(她仍然在《Parade》上开着那个专栏)

上述这些争议问题一个共性都是它们都用了难度看起来很低的提问方式,数字很小,好像随便心算一下就能得出答案。这种迷惑性让人们更轻信自己的简单计算的结果或被直觉蒙蔽。如果三门问题当初是个千门问题,提前知道结果的主持人打开了其中 239 扇门…… 没准人们更愿意使用条件概率或模拟来计算。那样的话,很可能它不会引发如此大的争议。

另一个共性是很多时候,这些问题的复杂度或争议,是由于自然语言很难描述好一个数学问题。命题里模糊的表述会严重影响条件,从而得出截然不同的概率。

对了,放假期间闲得没事干的同学,可以移步注 6 链接(译文)中的最后一个“充满争议的数学问题”,经典虐脑概率题:Three prisoners problem 

最后,西乔和神秘的顾问团祝大家春节愉快(结果看完你们不会愉快了对吧,摔!)


由于上述每一个问题都基本上会引发巨大争议,篇幅所限,这篇漫画不提供分析过程。有疑惑的同学请参考脚注或自行 google。不方便看到英文 wiki 的同学可以长按二维码去看答案,我摘录了各题的部分解答和分析过程。

《神秘的程序员们》漫画:31、32、34

可预见将会收到很多评论,恕不能一一回复。建议写出了自己见解或分析的同学们分享到朋友圈讨论。

  • 注 1 vos Savant 关于三门问题的所有回复和读者来信精选(英文) http://marilynvossavant.com/game-show-problem/

  • 注 2 Monty Hall, Paul Erdős, And The Fallibility of Human Intuition(英文)  http://bdld.info/2009/06/25/monty-hall-paul-erdos-and-the-fallibility-of-human-intuition/

  • 注 3 作为当代最伟大的数学家之一,他有很多非常有趣的故事。(中文)http://www.brunel.ac.uk/~csstzzw/erdos.html

  • 注4(英文)  https://en.wikipedia.org/wiki/Two_envelopes_problem

  • 注 5 Bertrand's Box Paradox(英文)  https://en.wikipedia.org/wiki/Bertrand%27s_box_paradox

  • 注 6 最具争议的 12 个数学事实 (译文) http://select.yeeyan.org/view/AhyuChen/357495

  • 注7(英文)  https://en.wikipedia.org/wiki/Boy_or_Girl_paradox

  • 注 8 (译文) Lying students and games of coordination  http://mindyourdecisions.com/blog/2009/10/13/lying-students-and-games-of-coordination/

  • 注 9 (中文) 樣本空間 (Sample space)  http://highscope.ch.ntu.edu.tw/wordpress/?p=47145

  • 注 10 (英文)  https://en.wikipedia.org/wiki/Marilyn_vos_Savant

后续:

挖了一个凶残的坑然后自己掉进去了

上一篇《摔,这个春节期间最凶残的一期漫画》收到很多关注转发,也有很多评论留言指出在“抽 50 个数和抽 50 次”的概率问题上我们弄错啦。

于是我们团队又花了大半天讨论这件事(本来想春节给读者们找点事干,没想到先把自己扔坑里了)。结论是我们的确出错了(脸被打得 pia pia 响),向读者们致歉。

在引子处阐述了我们对于年会那期漫画中抽奖程序的设计理由。带出了一个问题 “一次抽出 50 个数和抽 50 次(每次 1 个)在概率上难道不是相等的吗?”

首先这个提问是有毛病的,它并没有描述在讨论什么的概率。而我们在上一篇中提到的:“在抽奖程序中 “抽 50 次”的隐含前提是每抽出一个号码后会公布,然后从奖池中移走……所以用抽 50 次的方法,每次抽取时,奖池里剩下的人的获奖概率是不平等的。”解释本身没有错。但回答不了问题,(实际上这个问题也回答)。

但我们最大的失误是只考虑了让程序在“每轮抽取时的概率是否一样”,但忽略了现场中的每个人 50 轮抽奖后中奖概率是否一样。

其次,由于原来的这个提问从年会抽奖的漫画场景而来,表述不清晰,因此附加条件是不完备的。要满足每个人中奖概率公平,还必须增加一个限定条件:“50 份奖品是完全相同的”。实际上,三等奖经常是等值但不同的奖品,而就算是“一样的”实物奖品,甚至哪怕是等额现金,都会有细微的差别。大概只有固定钱数电子支付才能满足这个限定条件。

所以从程序设计的角度出发,“乱序取 top50” 的方式仍然比“抽 50 次”更有通用性。

讨论真实世界的概率问题,必须在一系列附加条件下进行,这样才能抽象出模型进行计算。但自然语言描述这些附加条件非常吃力,经常会漏掉条件导致结果变化。比如下面补丁1。

结论:在加上“奖品完全一样”这个限定条件后,现场观众在 50 轮抽奖后的累积中奖概率的确是相等的。

每一篇漫画,除了主创团队两人(负责技术层面的霍炬和负责表现层面的西乔),我们都会请漫画主题相关领域的专家 review。这次我们找了两个我们认识的数学水平最高的算法专家。但是由于我们提问时描述语言的不完备,所有人的注意力都放在“程序生成的每一轮的中奖概率是否相等”以及如何选择乱序算法。大家甚至花了大半天讨论如何在使用伪随机数的情况下提高的算法公平性。然后又就此讨论如果拥有无限的计算能力,我们是否可以通过计算证明我们所在的充满概率的世界是不是虚拟的。当然最后他们不约而同的劝我们不要讨论概率问题,“因为那没有意义”,不幸的是我们没采纳这个建议。


上一篇中的两个补丁

补丁1: 最后一题爆胎问题中,缺少限定条件:爆胎的必须是一辆四轮车,两人猜中一致的概率才是1/4。感谢读者 老张指出。

补丁2: 三门问题的解法中,配图文字应为第一种可能下车在A门;第二种可能下车在B门;第三种可能性下车在C门。而不是"第一种可能你选择了A门……B门……C门” 。 感谢读者追俗和  Viz (ง ·̀_·́)ง 指出。

来自: mp.weixin.qq.com