数风·数林 | 炉石传说中的概率(声控篇)
文 / 慵懶之龜 ??
引?/ 北大數(shù)院人
聲控是爐石傳說最大的魅力所在,也是技術(shù)的重要一部分。肩負(fù)全村人的希望的亂斗,下螺絲的時候給它指定一個目標(biāo),再下四個我就是狗的130系列(筆者最近打JJC被130從萬軍中抓走High巨人已經(jīng)兩次了)……最難以捉摸的大概就是這種玄學(xué),其中又以隨機(jī)分配傷害的情形最為復(fù)雜(而上面舉例的情形對應(yīng)的概率則比較容易計(jì)算)。
暑假里,一位爐石主播在微博上問了這樣一個問題:
場上一個大表哥,兩個兩血生物(沒有法強(qiáng)),打一個火山噴發(fā),大表哥被打死的概率是多少?
在爐石傳說中,隨機(jī)分配傷害的邏輯是這樣的:在所有合法目標(biāo)中等概率地選擇一個目標(biāo),然后對這個目標(biāo)造成一點(diǎn)傷害。然后如果這個目標(biāo)的生命值變?yōu)?,它就不再是合法目標(biāo)。如此循環(huán)直至打完規(guī)定的傷害或者場上不再有合法目標(biāo)。(如果實(shí)際情況與之不符……那就是阿三程序猿的錯)
這個問題相當(dāng)復(fù)雜,所以我們就先來看一個簡單的問題吧。
在很久很久以前,有個史學(xué)家:
這家伙發(fā)現(xiàn)了一條萌萌噠精靈龍。
后來年輕的法師打一個寒冰箭解了史學(xué)家,場上剩一條精靈龍;
最后法師決定碰碰運(yùn)氣,打一個奧術(shù)飛彈。
這三點(diǎn)傷害會隨機(jī)分配到英雄和精靈龍身上。那么,精靈龍被打死的概率是多少呢?(默認(rèn)英雄的生命值高于3)
呃,這個確實(shí)是很久很久以前的問題了,簡直和爐石傳說一樣古老。當(dāng)年引起過熱烈的討論,熱烈的程度大概相當(dāng)于這個版本對侏儒吸血鬼的收益的大討論……
那么我們怎么計(jì)算呢?先給兩個不正經(jīng)的方法:
方法一:要么打死,要么沒打死。二分之一,送分題!(如果真的這么回答,估計(jì)要被打死)
方法二:分別標(biāo)記三點(diǎn)傷害的目標(biāo):龍龍人,龍人龍,人龍龍,人人人,人人龍,人龍人,龍人人。一共七種情況,七分之三!(來自NGA上的帖子,自稱概率學(xué)忘得差不多了只會最簡單的辦法)
好了,我們開始變得正經(jīng)了。先說答案:二分之一。(先打死再說)
分析一:如果按照方法二的列舉。第一種情形,前兩下打龍的概率是四分之一,然后就一定打人,所以概率是四分之一。其他六種情形的概率都是八分之一。所以龍被打死的概率是二分之一。
分析二:我們可以認(rèn)為龍的血量也高于三點(diǎn),算它被打至少兩下的概率。稍微想一想就會發(fā)現(xiàn)這樣的轉(zhuǎn)化對問題的結(jié)論沒有影響。這樣轉(zhuǎn)化以后,我們發(fā)現(xiàn)龍如果不死,就是人至少被打兩下,按照對稱性,這和龍至少被打兩下的概率是一樣的。然后這兩者的發(fā)生概率一樣而且又是互補(bǔ)的事件,自然概率都是二分之一。
我們看到,雖然分析二很簡便,基本沒有計(jì)算,但卻只適用于幸運(yùn)二選一的情況,不能用來算大表哥的存活率。分析一的列舉方法則過于繁瑣,如果我們要用來算大表哥的存活率,就十分恐怖。那我們怎么辦?
我們可以借助現(xiàn)代化的裝備。拜托,你不是用紙筆打爐石的吧!接下來就輪到(非阿三)程序猿出場了——但是,程序猿也要先有個思路啊,怎么辦呢?
方法一:我們可以采用概率的頻率定義。模擬大量次數(shù),然后統(tǒng)計(jì)大表哥的存活次數(shù)。這很Coooooooool!
在一百萬次試驗(yàn)中大表哥存活了?996728?次,果然大地的守護(hù)者是沒那么容易入土的。
方法二:我們可以逐步簡化問題。打?14 點(diǎn)的問題比打 15 點(diǎn)簡單,打 13 點(diǎn)的又比打 14 點(diǎn)的簡單。如果我們有一種辦法最終歸結(jié)到打一點(diǎn),那就一眼就能看出答案了。
我們可以利用全概率公式,如果已知第一下打了誰,不就可以歸結(jié)為少打一點(diǎn)的問題了嗎?基于這個想法,我們有了下面的代碼。
我們算出大表哥存活的概率為?0.9966315820624765,和前面模擬的結(jié)果相對照,應(yīng)該沒有太大問題。
當(dāng)然,我們在面對這樣的局勢的時候,可以根據(jù)這樣的概率計(jì)算決定要不要拼一把,但是對于歐皇和非酋來說,這些都是沒有意義的。打死或者沒打死,不是二分之一嗎?(滑稽)
然后,我們還可以分析一下另一個問題:
那是一個上了逗魚時刻的悲慘故事。
雙方空場,任務(wù)賊鋪了4個5/5(任務(wù)賊削了大快人心)。于是薩滿打了一張火山噴發(fā)。
結(jié)果,火山噴發(fā)打出了接近生而平等的效果,一個都沒有打死……
那么這個概率大概是多少呢?
筆者用方法一進(jìn)行了數(shù)次100000次的模擬,一個都沒打死的次數(shù)大約在5800-6000。我們應(yīng)該可以放心的認(rèn)為這個概率大約是5.9%——在那之前筆者已經(jīng)用方法二開始運(yùn)行了,但是答案過了5分鐘還沒有出來……
對此我們進(jìn)行一下分析,可以發(fā)現(xiàn),方法二對于一些簡單的場面進(jìn)行了太多次數(shù)的重復(fù)計(jì)算。這就是程序低效的根源。
那我們可以怎樣進(jìn)行優(yōu)化呢?我們可以開一個中間結(jié)果儲存器,保存中間結(jié)果;如果要計(jì)算的場面已經(jīng)在計(jì)算過的中間結(jié)果里面了,我們就可以直接拿出這個結(jié)果,不需要進(jìn)行重復(fù)計(jì)算,這就是記憶化搜索的思想。但是這個儲存器的實(shí)現(xiàn)需要一些更高級的數(shù)據(jù)結(jié)構(gòu)方面的技巧,比如對整個場面信息進(jìn)行打包并Hash,筆者很懶就沒有去做(才不是因?yàn)槲也粫?#xff09;……
又過了5分鐘,結(jié)果出來啦,和我們的預(yù)期還是很接近的:0.05873199552297592。
祝大家早日學(xué)會聲控,讓對面打出奧術(shù)影襲和火山平等(啦啦啦:自作聰明)~
? ?哈爾莫斯:怎樣做數(shù)學(xué)研究
? ?扎克伯格2017年哈佛大學(xué)畢業(yè)演講
? ?線性代數(shù)在組合數(shù)學(xué)中的應(yīng)用
? ?你見過真的菲利普曲線嗎?
? ?支持向量機(jī)(SVM)的故事是這樣子的
? ?深度神經(jīng)網(wǎng)絡(luò)中的數(shù)學(xué),對你來說會不會太難?
? ?編程需要知道多少數(shù)學(xué)知識?
? ?陳省身——什么是幾何學(xué)
? ?模式識別研究的回顧與展望
? ?曲面論
? ?自然底數(shù)e的意義是什么?
? ?如何向5歲小孩解釋什么是支持向量機(jī)(SVM)?
? ?華裔天才數(shù)學(xué)家陶哲軒自述
? ?代數(shù),分析,幾何與拓?fù)?#xff0c;現(xiàn)代數(shù)學(xué)的三大方法論
算法數(shù)學(xué)之美微信公眾號歡迎賜稿
稿件涉及數(shù)學(xué)、物理、算法、計(jì)算機(jī)、編程等相關(guān)領(lǐng)域。
稿件一經(jīng)采用,我們將奉上稿酬。
投稿郵箱:math_alg@163.com
總結(jié)
以上是生活随笔為你收集整理的数风·数林 | 炉石传说中的概率(声控篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何理性客观地看待人工智能热潮
- 下一篇: [数电]补码的表示