<p>下面是Python3.6对使用集合进行交易的通用版本的模拟。在makea Deal的广义版本中,门和要打开的门的数量是不同的。参考:</p>
<p><a href="https://math.stackexchange.com/questions/608957/monty-hall-problem-extended">https://math.stackexchange.com/questions/608957/monty-hall-problem-extended</a></p>
<p>如果在doors=3和doors U to_open=1的情况下运行,如果不选择切换门,则预期结果为33%,而在切换门时,预期结果为66%。在</p>
<pre><code>#!/usr/bin/env python
''' application of Make a deal statistics
application is using sets {}
for reference see:
https://math.stackexchange.com/questions/608957/monty-hall-problem-extended
'''
import random
def Make_a_Deal(doors, doors_to_open):
''' Generalised function of Make_a_Deal. Logic should be self explanatory
Returns win_1 for the option when no change is made in the choice of
door and win_2 when the option to change is taken.
'''
win_1, win_2 = False, False
doors = set(range(1, doors+1))
price = set(random.sample(doors, 1))
choice1 = set(random.sample(doors, 1))
open = set(random.sample(doors.difference(price).
difference(choice1), doors_to_open))
choice2 = set(random.sample(doors.difference(open).
difference(choice1), 1))
win_1 = choice1.issubset(price)
win_2 = choice2.issubset(price)
return win_1, win_2
def main():
''' input:
- throws: number of times to Make_a_Deal (must be > 0)
- doors: number of doors to choose from (must be > 2)
- doors_to_open: number of doors to be opened before giving the
option to change the initial choice (must be > 0 and <= doors-2)
'''
try:
throws = int(input('how many throws: '))
doors = int(input('how many doors: '))
doors_to_open = int(input('how many doors to open: '))
if (throws < 1) or (doors < 3) or \
(doors_to_open > doors-2) or (doors_to_open < 1):
print('invalid input')
return
except Exception as e:
print('invalid input: ', e)
return
number_of_wins_1, number_of_wins_2, counter = 0, 0, 0
while counter < throws:
win_1, win_2 = Make_a_Deal(doors, doors_to_open)
if win_1:
number_of_wins_1 += 1
if win_2:
number_of_wins_2 += 1
counter += 1
print('completion is {:.2f}%'.
format(100*counter/throws), end='\r')
print('number of wins option 1 is {:.2f}%: '.
format(100*number_of_wins_1/counter))
print('number of wins option 2 is {:.2f}%: '.
format(100*number_of_wins_2/counter))
if __name__ == '__main__':
main()
</code></pre>