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


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

    alt

    两个玩家正在玩一个游戏,他们从玩家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)
    • 1

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

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

    我们首先导入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
    • 1

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

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

          if turn <= prob_heads: 
            if num_flips % 2 != 0: 
              player_one_wins += 1 
            win += 1
    • 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

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

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

    prob_weighted_coin_game(50000)
    0.66848
    • 1

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

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

    prob_weighted_coin_game(50000, .75)
    0.80066
    • 1

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

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

    prob_weighted_coin_game(50000, .01)
    0.50498
    • 1

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

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

    谢谢你的阅读!

    本文由 mdnice 多平台发布

  • 相关阅读:
    YOLOv3: An Incremental Improvement的译读笔记
    Zookeeper 节点权限控制ACL详解
    第二十四章《学生信息管理系统》第1节:学生信息管理系统简介
    ETCD快速入门-02 ETCD安装
    Java三大特性篇之——多态篇(千字详解)
    【Linux网络编程】Socket-TCP实例
    Java如何使用反射创建动态代理(JDK原生)呢?
    【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项
    python下拉框选择测试
    Mysql.索引详解
  • 原文地址:https://blog.csdn.net/qq_40523298/article/details/127749296