問題背景
有三張彩票,一張有獎。你買了一張,老板在自己剩余的兩張中刮開了一張,沒中。這時候他要用剩下的一張和你換,你換不換?換和不換你中獎的概率一樣嗎?(你可以思考一下,然后看我下面的回答)
解析
從直覺上來講,彩票中獎的概率是1/3,你最先抽了一張,不管咋操作,中獎的概率應該都是1/3。這時候老板排除掉了一張沒中獎的,剩下兩張必有一張中獎,所以概率是1/2。換和不換應該都一樣。你是這么答的嗎?
這時候需要引申出貝葉斯了,貝葉斯在概率的計算中引入了先驗概率,即在知道了一些事情的情況下,概率會發生變化,按照貝葉斯的解答應該是怎樣的呢?
首先我們要引入概率的一些寫法(事實上如果你不太明白這些公式的話,建議適當補一些概率的課程,在機器學習中非常有用)
補充知識:P(A|B)表示在B發生的情況下A發生的概率。P(A|B) = [P(B|A)*P(A)] / P(B)。
我們假設A表示你手里目前這張是中獎的,B表示老板刮出來的那張是沒中獎的(雖然題目中說明了老板刮出來的沒中,但還是需要將情況假設出來)
那么由上面可得:
P(A|B) = [P(B|A)*P(A)] / P(B)
在式中P(B|A)表示在A發生的情況下B發生的概率,代入題目中也就是如果你手里這張是中獎的,那老板刮出來那張沒中獎的概率。很顯然這是必然的,因為只有一張是中獎的,所以P(B|A)=1,也就是必然的事件。P(A)表示你手里目前這張是中獎的概率,在計算P(A)時因為沒有給出前提條件,所以P(A)=1/3,也就是三張彩票,你手里中獎的概率是1/3。P(B)表示老板刮出來那張是沒中獎的概率,題目中已經給出前提條件老板刮出來的是沒中獎的,所以概率P(A)=1.
那么將數代進式子里面:P(A|B) = [P(B|A)*P(A)] / P(B) = [1 * 1/3] / 1 = 1/3,也就是說在老板刮出來一張沒中獎的彩票前提下,你手里這張中獎的概率是1/3,老板手里剩余那張是2/3。為了中獎概率最大化,應該和老板手里的彩票交換。
是不是感覺不對勁,三張彩票我自己抽了一張,我中不中獎怎么還和老板刮不刮自己的彩票有關系了呢?P(A|B)這個算法是錯的吧?當時論壇也爭論了很久,但十年前的人們還不太會使用貝葉斯來武裝自己,有一部分用直覺,也就是腦袋算法,堅持就是1/2。另一部分去繞來繞去分析,企圖找到直覺沒考慮到的地方來證明是1/3和2/3。
代碼實現
# 定義老板第一張彩票不中獎的情況次數
total_no_cnt = 0
# 定義老板第一張彩票不中獎,而我中獎的次數
my_cnt = 0
for _ in range(100000):
# 模擬中獎情況,三張彩票,有一張有獎,數字1表示中獎,老板隨機抽取兩張,剩下的一張歸我
list_a = [0, 0, 1]
boss_data_1 = choice(list_a)
list_a.remove(boss_data_1)
boss_data_2 = choice(list_a)
list_a.remove(boss_data_2)
my_data = list_a[0]
# 已知老板第一張彩票不中獎的情況下:
if boss_data_1 == 0:
total_no_cnt += 1
if my_data == 1:
my_cnt += 1
print("老板第一張彩票不中獎,我的中獎概覽為:%s", str(my_cnt / total_no_cnt))