c

codeye

V1

2022/11/08阅读:19主题:默认主题

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

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

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

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

我们把这个函数称为 "prob_weighted_coin_game"

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

import numpy as np
def prob_weighted_coin_game(num_games, prob_heads=.5): 
  player_one_wins = 0 
  for n in range(0,num_games): 
    num_flips = 0 
    win = 0
    while win == 0: 
      turn = np.random.uniform(0,1) 
      num_flips += 1 
      if turn <= prob_heads: 
        if num_flips % 2 != 0: 
          player_one_wins += 1 
        win += 1 
  return float(player_one_wins)/float(num_games)

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

import numpy as np
def prob_weighted_coin_game(num_games, prob_heads = 0.5): 
  player_one_wins = 0

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

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

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

for n in range(0,num_games): 
    num_flips = 0 
    win = 0
    while win == 0: 
      turn = np.random.uniform(0,1) 
      num_flips += 1

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

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

      if turn <= prob_heads: 
        if num_flips % 2 != 0: 
          player_one_wins += 1 
        win += 1

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

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

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

  return float(player_one_wins)/float(num_games)

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

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

prob_weighted_coin_game(50000)
0.66848

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

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

prob_weighted_coin_game(50000, .75)
0.80066

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

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

prob_weighted_coin_game(50000, .01)
0.50498

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

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

谢谢你的阅读!

分类:

后端

标签:

后端

作者介绍

c
codeye
V1