【问题标题】:Simulate a coin toss experiment - RealPython模拟抛硬币实验 - RealPython
【发布时间】:2018-07-08 19:14:05
【问题描述】:

有人可以帮我解释下面 Realpython 分配任务的解决方案吗?我发现的解决方案似乎令人困惑。

编写一个 Python 脚本,该脚本使用抛硬币模拟来确定这个稍微复杂一点的概率谜题的答案:我不断抛硬币,直到我看到它正面和反面至少各一次——换句话说,第一次掷硬币后,我继续掷硬币,直到得到不同的结果。平均而言,我总共需要掷多少次硬币?同样,可以计算出实际概率,但这里的重点是使用 randint 模拟事件。要获得预期的平均投掷次数,您应该将变量 trial 设置为 10000 ,将变量 flips 设置为 0 ,然后在每次抛硬币时将 1 添加到您的 flips 变量。然后你可以在代码末尾打印翻转/试验,看看平均翻转次数是多少。

    from random import randint
    flips = 0
    trials = 10000
    for i in range(trials):
        first_flip = randint(0, 1)
        while randint(0, 1) == first_flip:
            flips += 1           # Every flip after the first flip.
    print("flips done is {}".format(flips))
    print(flips / trials + 2.0)  # Initial trial and final trial added.

在上述情况下,如果 first_flip 为 0 并且 while 循环条件在第一次随机尝试时产生 1,则 for 循环迭代而不添加翻转。此外,如果当随机尝试等于 first_flip 时运行 while 循环,则在 while 循环轨迹内,即不会添加 for 循环中“i”的值。简而言之,最终的翻转次数多于或少于试验次数。

谁能帮我解释一下这个背后的逻辑或更好的python脚本?

【问题讨论】:

    标签: python python-3.x algorithm


    【解决方案1】:

    代码主要按照您的想法运行。您缺少的部分:

    如果 first_flip 为 0 并且 while 循环条件在第一次随机尝试时产生 1,则 for 循环会迭代而不添加翻转。

    这个在底层解决了,

    print(flips / trials + 2.0)  # Initial trial and final trial added.
    

    他们在此处添加每次试验的 2 个“缺失”翻转。


    如果我写了代码,我会这样做。

    flips = 0
    def flip():
        global flips
        flips += 1
        return randint(0,1)
    
    trials = 10000
    for i in range(trials):
        first_flip = flip()
        while flip() == first_flip:
            pass
    
    print("flips done is {}".format(flips))
    print("average flips", flips / trials)
    

    【讨论】:

      【解决方案2】:

      我会以不同的方式分解它。

      对于每次试验,让我们假设第一次翻转是 0。(实际上它是什么并不重要,这对逻辑没有影响 - 所以我们只是假设这是我们得到的,然后我们不'实际上甚至不必翻转它。)然后我们继续翻转直到得到 1。

      当我们完成所有试验时,我们有一个未知数量的 0(加上我们实际上没有做的每个试验一个 0)加上每个试验一个 1。所以翻转的总数是 {number of 0s we 实际上翻转} + 2 * {number of trial},一旦我们有 {number of trial} 1s 我们就停止。

      from random import randint
      
      def total_flips(trials):
          zeros = 0
          ones = 0
          while ones < trials:
              if randint(0, 1):
                  ones += 1
              else:
                  zeros += 1
          return zeros + 2 * trials
      
      trials = 10000
      flips = total_flips(trials)
      print("Flips done:", flips)
      print("Average flips:", flips / trials)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-02
        • 2012-06-24
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 2018-07-27
        相关资源
        最近更新 更多