Проблема:
Вот небольшая проблема Монте-Карло, рассмотрим следующую игру, в которой используются два вращающихся диска. Предположим, игрок крутит один или другой указатель на дисках в соответствии со следующими правилами:
если игрок вращает указатель i и останавливается в области с областью p_{ij}
, он перемещается с диска i
на диск j
(i
и j
равны 1 или 2) ;
если указатель останавливается в области с областью x_i
, игра заканчивается;
, если игра заканчивается в области с областью x_1
, игрок выигрывает, но если указатель останавливается в области с областью x_2
, игрок проигрывает.
Какова вероятность того, что игрок, начиная с диска 1, выиграет? Предположим, что площадь каждого диска равна единице, так что x_1+p_{11}+p_{12} =1
, а также x_2+p_{21}+p_{22} =1
Запустите свой код для случаев p_{11} =0.2
, p_{12} =0.4
, p_{21} =0.3
и p_{22} =0.35
.
import random
p_11 = 0.2
p_12 = 0.4 #0.2+0.4
p_21 = 0.3
p_22 = 0.35
wins = 0
pointer = 0
pointer2 = 0
for i in range(10**7):
while pointer < p_11:
pointer2 = 0 #resetting pointer2
pointer = random.uniform(0,1)
if p_11+p_21 < pointer < 1: #area corresponding to x_1
wins += 1 #wins
pointer = 0
break
else:
pointer = 0 #resetting pointer1
while pointer2 < p_22:
pointer2 = random.uniform(0,1)
if p_22+p_21 < pointer2 < 1: #area corresponding to x_2
pointer2 = 0
break #loses
print(wins/10**7)
Правильный ответ - 0,5821, но я получаю 0,7141465. Где я делаю не так?
Я отредактировал свой код, в этом случае он снова поворачивает диск для p_22
и p_11
случаев
![enter image description here](https://i.stack.imgur.com/OuMPT.png)
Вопрос из книги «Цифровые кости» (Пол Дж. Нахим) Страница 27-29 (Theres a pdf)