旋转游戏蒙特卡洛

时间:2019-05-20 22:34:53

标签: python montecarlo

问题:

这是一个蒙特卡洛(Monte Carlo)挑战的小问题,请考虑以下游戏,该游戏使用两个微调盘。假设播放器根据以下规则旋转磁盘上的一个或另一个指针:

  1. 如果玩家旋转指针i并将其停在区域p_{ij}的区域中,则他将从磁盘i移至磁盘ji和{ {1}}是1或2);

  2. 如果指针停在区域j的区域中,则游戏结束;否则,游戏结束。

  3. 如果游戏在区域x_i的区域中结束,则玩家获胜,但是如果指针在区域x_1的区域中停止,则玩家输局。

从磁盘1开始,播放器获胜的概率是多少?假设每个磁盘的面积为1,因此x_2x_1+p_{11}+p_{12} =1

针对x_2+p_{21}+p_{22} =1p_{11} =0.2p_{12} =0.4p_{21} =0.3的情况运行代码。

p_{22} =0.35

正确的答案是0.5821,但是我得到0.7141465。我在哪里做错了?

我编辑了代码,在这种情况下,它会在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) p_22情况下再次打开磁盘

enter image description here

问题来自名为Digital Dice(Paul J. Nahim)的书,第27-29页(有pdf)

1 个答案:

答案 0 :(得分:2)

我已经对问题进行了数学分析,发现解决方案实际上是:

leftBarButtonItem(在某些极端情况下(例如Back button)实际上是不正确的)

这实际上写在《数字骰子》的附录6中,所以我不会证明。

使用您的数字给出答案(1 - p_11 - p_12) * (1 - p_22) / ((1 - p_11) * (1 - p_22) - p_12 * p_21),这是正确的。您的代码发生了很大变化,现在它提供了p_22 = 1的输出,而不是问题中的内容。在这里,我更正了您的代码的第一个版本:

0.65

现在介绍您当前的代码。现在是错误的,因为1.0从循环import random p_11 = 0.2 p_12 = 0.4 p_21 = 0.3 p_22 = 0.35 total_iterations = 10 ** 6 wins = 0 num = 0 for i in range(total_iterations): current_disk = 1 while True: num = random.uniform(0, 1) if current_disk == 1: if num < p_12: current_disk = 2 continue elif num > p_11 + p_12: wins += 1 #wins break else: if num < p_21: current_disk = 1 continue elif num > p_21 + p_22: break print(wins / total_iterations) print((1 - p_11 - p_12) * (1 - p_22) / ((1 - p_11) * (1 - p_22) - p_12 * p_21)) 中断,而不是从循环break # loses中断。我们可以通过添加额外的标记while pointer2 < p_22来解决该问题,这将为您提供正确的答案。

while pointer < p_11