Python使用random和tertools模塊解一些經(jīng)典概率問(wèn)題
random 模塊中的常用函數(shù)
random()
返回一個(gè)位于區(qū)間 [0,1] 內(nèi)的實(shí)數(shù);
uniform(a, b)
返回一個(gè)位于區(qū)間 [a,b] 內(nèi)的實(shí)數(shù);
randint(a, b)
返回一個(gè)位于區(qū)間 [a,b] 內(nèi)的整數(shù);
choice(sequence)
返回一個(gè)位于 sequence 中的元素,其中,sequence 為一個(gè)有序序列,如 list、string 或者 tuple 等類(lèi)型;
randrange([start], stop[, step])
等效于 choice(range([start], stop[, step]));
shuffle(sequence [, random])
無(wú)返回值,用于打亂 sequence 中元素的排列順序;
sample(sequence, n)
返回一個(gè)由 n 個(gè) sequence 中的元素組成的分片,其中,sequence 也可以是 set 類(lèi)型。
利用 itertools 得到排列、組合
permutations(sequence, k))
從序列 sequence 中得到包含 k 個(gè)元素的所有排列。
combinations(sequence, k))
從序列 sequence 中得到包含 k 個(gè)元素的所有組合。
羊車(chē)門(mén)問(wèn)題
有一個(gè)抽獎(jiǎng)節(jié)目,臺(tái)上有三扇關(guān)閉的門(mén),一扇門(mén)后面停著汽車(chē),其余門(mén)后都是山羊,只有主持人知道每扇門(mén)后面是什么。參賽者可以選擇一扇門(mén),在開(kāi)啟它之前,主持人會(huì)開(kāi)啟另外一扇門(mén),露出門(mén)后的山羊,然后允許參賽者更換自己的選擇。問(wèn)題是:參賽者更換選擇后能否增加贏得汽車(chē)的機(jī)會(huì)?
有很多時(shí)候,我們并不知道自己的理論分析正確與否,但如果知道概率論中的 大數(shù)定律,又碰巧懂一點(diǎn)編程,無(wú)疑可以利用計(jì)算機(jī)重復(fù)模擬事件以求解問(wèn)題。該問(wèn)題的 Python 3.x 解答程序如下:
from random import *
def once(doors = 3): # 一次事件的模擬
car = randrange(doors) # 一扇門(mén)后面停著汽車(chē)
man = randrange(doors) # 參賽者預(yù)先選擇一扇門(mén)
return car == man # 參賽者是否最初就選擇到車(chē)
h = 0 # 堅(jiān)持選擇贏得汽車(chē)的次數(shù)
c = 0 # 改變選擇贏得汽車(chē)的次數(shù)
times = int(1e6) # 重復(fù)實(shí)驗(yàn)的次數(shù)
for i in range(times):
if once(): h += 1
else: c += 1
print("維持選擇:",h/times*100,"%\n改變選擇:",c/times*100,"%")
運(yùn)行結(jié)果:
維持選擇: 33.268 %
改變選擇: 66.732 %
撲克牌問(wèn)題
概率論給我們帶來(lái)了很多匪夷所思的反常結(jié)果,條件概率尤其如此。譬如:
四個(gè)人打撲克,其中一個(gè)人說(shuō),我手上有一個(gè) A。請(qǐng)問(wèn)他手上有不止一個(gè) A 的概率是多少?
四個(gè)人打撲克,其中一個(gè)人說(shuō),我手上有一個(gè)黑桃 A。請(qǐng)問(wèn)他手上有不止一個(gè) A 的概率又是多少?
from random import *
cards = [i for i in range(52)]
counter = [0, 0, 0, 0]
def once(): # 0 表示黑桃 A
global cards
ace = set(sample(cards, 13)) & {0,1,2,3}
return len(ace), 0 in ace
for i in range(int(1e6)):
a, s = once() # a 表示 A 的個(gè)數(shù), s 表示是否有黑桃 A
if a:
counter[1] += 1
if s: counter[3] += 1
if a > 1:
counter[0] += 1
if s: counter[2] += 1
print('情況一:', counter[0]/counter[1], '\n情況二:', counter[2]/counter[3])
運(yùn)行結(jié)果:
情況一: 0.3694922900321386
情況二: 0.5613778028656186
有趣的事情出來(lái)了:如果這個(gè)人宣布了手中 A 的花色,他手中持有多個(gè) A 的概率竟然會(huì)大大增加。可這又該如何理解呢?
一個(gè)家庭中有兩個(gè)小孩,已知其中一個(gè)是女孩,求另一個(gè)小孩也是女孩的概率
網(wǎng)絡(luò)上每一次有人發(fā)帖提出與條件概率有關(guān)的悖論時(shí),總會(huì)引來(lái)無(wú)數(shù)人的圍觀和爭(zhēng)論,哪怕這些問(wèn)題的實(shí)質(zhì)都是相同的。本題目無(wú)疑是爭(zhēng)論的最多的問(wèn)題之一。
說(shuō)起來(lái)網(wǎng)上的分析都像模像樣,一些原本都迷糊的人被人講的暈頭轉(zhuǎn)向,一會(huì)覺(jué)得這個(gè)對(duì),一會(huì)又覺(jué)得那個(gè)對(duì)?,F(xiàn)在我不給你分析那些道理,就用計(jì)算機(jī)來(lái)模擬問(wèn)題,讓你直接得到結(jié)論,而毋須明白個(gè)中緣由。
from random import * # 0 表示女孩,1 表示男孩
family = (lambda n :[{randrange(2),randrange(2)} for i in range(n)])(int(1e6))
both = family.count({0}) # 都是女孩的家庭數(shù)
exist = len(family) - family.count({1}) # 有女孩的家庭數(shù)
print(both/exist)
運(yùn)行結(jié)果:
0.33332221770186543
沒(méi)有那些深?yuàn)W的分析過(guò)程,寥寥數(shù)行代碼就得到了問(wèn)題的答案,想必這也是計(jì)算機(jī)引入數(shù)學(xué)計(jì)算與證明的好處。
生日悖論
每個(gè)人都有生日,偶爾會(huì)遇到與自己同一天過(guò)生日的人,但在生活中這種緣分似乎并不常有。我們猜猜看:在 50 個(gè)人當(dāng)中出現(xiàn)這種緣分的概率有多大,是 10%、20% 還是 50%?
from random import *
counter, times = 0, int(1e6)
for i in range(times):
if len({randrange(365) for i in range(50)}) != 50: # 存在同一天生日的人
counter += 1
print('在 50 個(gè)人中有相同生日的概率為:',counter/times)
運(yùn)行結(jié)果:
在 50 個(gè)人中有相同生日的概率為: 0.970109
在 50 個(gè)人中有相同生日的概率高達(dá) 97%,這個(gè)數(shù)字恐怕高出了絕大多數(shù)人的意料。我們沒(méi)有算錯(cuò),是我們的直覺(jué)錯(cuò)了,科學(xué)與生活又開(kāi)了個(gè)玩笑。正因?yàn)橛?jì)算結(jié)果與日常經(jīng)驗(yàn)產(chǎn)生了如此明顯的矛盾,該問(wèn)題被稱為「生日悖論」,它體現(xiàn)的是理性計(jì)算與感性認(rèn)識(shí)的矛盾,并不引起邏輯矛盾,所以倒也算不上嚴(yán)格意義上的悖論。
相關(guān)文章
Pytorch在dataloader類(lèi)中設(shè)置shuffle的隨機(jī)數(shù)種子方式
今天小編就為大家分享一篇Pytorch在dataloader類(lèi)中設(shè)置shuffle的隨機(jī)數(shù)種子方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題
這篇文章主要介紹了Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python對(duì)字符串實(shí)現(xiàn)去重操作的方法示例
字符串去重是python中字符串操作常見(jiàn)的一個(gè)需求,最近在工作中就又遇到了,所以下面這篇文章主要給大家介紹了關(guān)于Python對(duì)字符串實(shí)現(xiàn)去重操作的相關(guān)資料,文中給出了詳細(xì)的介紹,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08python?多態(tài)?協(xié)議?鴨子類(lèi)型詳解
這篇文章主要為大家介紹了python?多態(tài)?協(xié)議?鴨子類(lèi)型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-11-11tensorflow 2.0模式下訓(xùn)練的模型轉(zhuǎn)成 tf1.x 版本的pb模型實(shí)例
這篇文章主要介紹了tensorflow 2.0模式下訓(xùn)練的模型轉(zhuǎn)成 tf1.x 版本的pb模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想過(guò)來(lái)看看吧2020-06-06pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn)
這篇文章主要介紹了pandas將list數(shù)據(jù)拆分成行或列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12基于Python實(shí)現(xiàn)多圖繪制系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的多圖繪制系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Python庫(kù)urllib與urllib2主要區(qū)別分析
這篇文章主要介紹了Python庫(kù)urllib與urllib2主要區(qū)別,需要的朋友可以參考下2014-07-07