Python和Numpy的加权抛硬币游戏的概率

使用Python和Numpy的加权抛硬币游戏的概率 本周的一个简短而有趣的游戏。

两个玩家正在玩一个游戏,他们从玩家1开始抛出一枚不一定公平的硬币。第一个抛出正面的人获胜。抛出的硬币落在头上的概率是p。那么玩家1赢得游戏的概率是多少?

我们可以用python中的一个简单函数来探索这个问题。让我们写一个函数,输入两个参数。1.)要玩的游戏数量,以及2.)掷硬币的结果是正面的概率(默认设置为0.5或50%)。

我们把这个函数称为 “prob_weighted_coin_game”

我们可以用以下代码模拟这个游戏。

import&#xA0;numpy&#xA0;as&#xA0;np<br>def&#xA0;prob_weighted_coin_game(num_games,&#xA0;prob_heads=.5):&#xA0;<br>&#xA0;&#xA0;player_one_wins&#xA0;=&#xA0;0&#xA0;<br>&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;n&#xA0;<span class="hljs-keyword">in</span>&#xA0;range(0,num_games):&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;num_flips&#xA0;=&#xA0;0&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;win&#xA0;=&#xA0;0<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">while</span>&#xA0;win&#xA0;==&#xA0;0:&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;turn&#xA0;=&#xA0;np.random.uniform(0,1)&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;num_flips&#xA0;+=&#xA0;1&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">if</span>&#xA0;turn&#xA0;<= prob_heads: <br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">if</span>&#xA0;num_flips&#xA0;%&#xA0;2&#xA0;!=&#xA0;0:&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;player_one_wins&#xA0;+=&#xA0;1&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;win&#xA0;+=&#xA0;1&#xA0;<br>&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;<span class="hljs-built_in">float</span>(player_one_wins)/<span class="hljs-built_in">float</span>(num_games)<br></= prob_heads: 

现在,让我们一步步简单地走过这个过程。

import&#xA0;numpy&#xA0;as&#xA0;np<br>def&#xA0;prob_weighted_coin_game(num_games,&#xA0;prob_heads&#xA0;=&#xA0;0.5):&#xA0;<br>&#xA0;&#xA0;player_one_wins&#xA0;=&#xA0;0

我们首先导入numpy,因为我们可以利用它的随机选择功能来模拟这个游戏的投币机制。

我们定义我们的函数的名称,并指定我们的两个参数。我们将默认的正面概率设置为0.5,以备我们只是想指定一些使用公平硬币的游戏,看看结果如何。显然,我们可以在这里输入我们喜欢的自定义概率。

我们还为玩家1赢得的游戏数量设置了一个全局计数器,每轮模拟都从0开始。

<span class="hljs-keyword">for</span>&#xA0;n&#xA0;<span class="hljs-keyword">in</span>&#xA0;range(0,num_games):&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;num_flips&#xA0;=&#xA0;0&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;win&#xA0;=&#xA0;0<br>&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">while</span>&#xA0;win&#xA0;==&#xA0;0:&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;turn&#xA0;=&#xA0;np.random.uniform(0,1)&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;num_flips&#xA0;+=&#xA0;1

现在,对于指定的模拟次数中的每一个游戏(例如 range(0, num_games)),我们将从零开始计算翻硬币的次数。这既可以记录游戏进行了多长时间,也可以帮助我们确定一旦抛出一个人头,谁是赢家。

我们还指定了一个胜利条件 “赢”,这将帮助我们知道游戏何时结束。当赢的时候仍然等于零,玩家继续抛掷硬币。每一次 “转 “都构成了硬币的翻转,它是一个随机选择的小数值,介于0和1之间。

&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">if</span>&#xA0;turn&#xA0;<= prob_heads: <br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">if</span>&#xA0;num_flips&#xA0;%&#xA0;2&#xA0;!=&#xA0;0:&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;player_one_wins&#xA0;+=&#xA0;1&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;win&#xA0;+=&#xA0;1<br></= prob_heads: 

如果随机选择的 “turn “值小于或等于我们设定的 “prob_heads “值,我们就认为这是一个获胜条件。

我们可以这样理解:如果翻头的概率是0.6,比0和1之间的60%的值都可以解释为翻头(例如,0.0和0.6之间的所有值)。

一旦满足了获胜条件,我们就检查硬币被翻转了多少次。因为玩家1总是拥有第一次翻转,我们知道,翻转次数为奇数意味着玩家1是最后一个玩家,因此将是赢家。如果玩家1赢了游戏,我们就在函数顶部的 player_one_wins计数器上加1。我们还将 “赢 “的值改为1.0,这将中断当前游戏,并在预设的模拟次数中开始下一个游戏。

&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;<span class="hljs-built_in">float</span>(player_one_wins)/<span class="hljs-built_in">float</span>(num_games)

一旦所有模拟运行完毕,该函数将返回玩家1赢得的游戏数除以总游戏数。这将表示为十进制的胜率。

好了! 现在我们已经写好了我们的函数,让我们用一枚公平的硬币玩50,000局,看看结果如何。

prob_weighted_coin_game(50000)<br>0.66848

在50,000场游戏中,我们看到玩家1通过先走有明显的优势。事实上,即使在使用公平硬币的情况下,玩家1也有大约2/3的机会因先抛硬币而赢得游戏。

如果我们调整硬币翻出头的概率呢?如果硬币有75%的机会是正面呢?

prob_weighted_coin_game(50000,&#xA0;.75)<br>0.80066

由于加权硬币75%的翻转都是正面,玩家1将有望在80%的时间内获胜。

如果我们真的缩减出现头像的可能性呢?比如说,如果头像只出现在1%的时候?

prob_weighted_coin_game(50000,&#xA0;.01)<br>0.50498

只有当我们大幅削减人头出现的可能性时,两个玩家才有大致相同的获胜机会。

有趣的东西! 你可以随意玩玩这个函数,看看不同的模拟次数和人头概率对玩家1获胜的可能性有何影响。

谢谢你的阅读!

Original: https://blog.csdn.net/qq_40523298/article/details/127749296
Author: qq_40523298
Title: Python和Numpy的加权抛硬币游戏的概率

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/758294/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球