又見蒙特卡洛——python模擬解決三門問題


  三門問題很有意思,wiki用不同方法將原理講的很透徹了,我跟喜歡其中這種理解方式:無論參賽者開始的選擇如何,在被主持人問到是否更換時都選擇更換。如果參賽者先選中山羊,換之后百分之百贏;如果參賽者先選中汽車,換之后百分之百輸。而選中山羊的概率是2/3,選中汽車的概率是1/3。所以不管怎樣都換,相對最初的贏得汽車僅為1/3的機率來說,轉換選擇可以增加贏的機會。

  原理明白了,實現就比較簡單了,這次用python啦。

import random as rnd

strategy = ['stick','choose','swith']
def MC(strategy,times):
	wins = 0
	for trail in range(times):
		# 假定,實際上獎品在0號門...但是我們並不知道...
		envelops = [0,1,2]
		# 第一次隨機選取一扇門
		first_choice = rnd.choice(envelops)
		# 根據第一次的選擇情況的不同,第二次宣策面臨兩種不同的備選組合

		# 如果第一次選擇了0號門,那么在打開另外兩個門中的一個空門后
		# 第二次將要在0號門和未打開的空門(1 or 2)中作出選擇
		if first_choice == 0:
			envelops = [0,rnd.choice([1,2])]
		# 如果第一次沒有選中0,那么此時被打開的必然是另一個空門,那么
		# 在第二次選擇時,將在0和自己現在所處的門(first_choice)作出選擇
		else:
			envelops = [0,first_choice]

		# 采取不同的策略進行第二次選擇

		# 保持原來位置不變
		if strategy == 'stick':
			second_choice = first_choice
		# 在除去一個空門后的兩個門中,隨機選擇一個
		elif strategy == 'choose':
			second_choice = rnd.choice(envelops)
		# 排除一扇空門后,放棄原來的選擇,直接選擇另一扇門
		elif strategy == 'switch':
			envelops.remove(first_choice)
			second_choice = envelops[0]

		# 記得,獎品在0號門
		if second_choice == 0:
			wins += 1
	# 計算獲獎的概率值
	p = wins/times
	print('第二次選擇采用'+strategy+'方法,獲獎的概率為:'+str(p)+'(模擬次數為'+str(times)+')')

MC('stick',10000)
MC('choose',10000)
MC('switch',10000)

  輸出如下:

 

  Wonderful!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM