【问题标题】:Searching for the 'p' value in a coin toss simulation在抛硬币模拟中搜索“p”值
【发布时间】:2019-10-28 14:28:08
【问题描述】:

编码新手,试图在掷硬币模拟中找到“p”值。 当前获取属性错误:

'int' 对象没有属性 'sum'。

怎么可能?请帮忙。'''

import numpy as np
import random
attempts = 0
t = 0

for I in range (10000):
      attempts = random.randint(2, 30)
      if (attempts.sum >= 22 ):
      t += 1

p = t / 10000 
print(p)

【问题讨论】:

  • attempts 是 2 到 29 之间的单个整数值。
  • 常见的统计用法将p定义为硬币显示目标值(通常是“正面”)的机会。目前尚不清楚您在做什么,因为您的“硬币”可以返回相当大范围的结果,2-30。请描述您尝试使用sum 是如何解决问题的,以及该问题可能是什么。
  • “怎么可能?”你不明白哪一部分,究竟是什么?你知道'int' object 是什么吗?你知道attribute 是什么吗?你知道具体投诉的是哪个'int' object吗?你期望它有那个属性吗?如果是,为什么?
  • 在大多数情况下,投掷硬币最终会得到一个偶数的投掷次数,在这种情况下,投掷次数为 30,但在投掷 22 次时,“p”值是多少?
  • 您是否想要numpy.random.randint(2, size=30) 而不是random.randint(2, 30)? (也就是说,在每个循环中,您掷出 30 个硬币,并记录其中至少 22 个出现“正面”的频率。)

标签: python numpy random


【解决方案1】:

attempts 是您最近生成的随机整数。 int 没有属性(数据字段)sum。由于您没有充分描述您认为代码的作用,因此我们无法解决问题。

Python 的sum 函数 将一系列项目相加;有关示例,请参阅文档。


你尝试用变量m 来计算一些东西,但你没有给它初始值。

您将t 设置为0,然后将其除以您的循环限制,但您从未更改过该值;这将是 0.0。


OP cmets 后更新

我想我现在明白了:您想估计在一组 30 次公平硬币中至少出现 22 个正面(或您选择的任何一面)的概率。我会尽力利用您的原始代码。

首先,你必须投掷一枚公平的硬币;您所做的函数调用会在 [2, 30] 范围内生成一个随机整数。相反,您需要以 30 人一组的方式进行如下呼叫:

flip = random.randint(0,1)

这给你一个 0 或 1。假设我们要计算 1 结果:这允许我们简单地添加系列:

count = sum(random.randint(0,1) for _ in range(30))

这将循环 30 次,将结果放入一个列表中,然后将它们相加;这是你想要的翻转次数。现在,在这 30 次翻转组中做 10,000 次,每组检查 22 个结果:

import random
t = 0

for i in range (10000):
    count = sum(random.randint(0,1) for _ in range(30))
    if (count >= 22):
        t += 1

p = t / 10000 
print(p)

现在,如果您想进一步加强这一点,请使用成功比较(即True)将评估为1 的事实; False 将是 0:在外部理解中进行所有 10,000 次试验(内联 for):

t = sum( 
         sum(random.randint(0,1) for flip in range(30)) > 22
     for trial in range(10000) )
print(t / 10000)

fliptrial 是虚拟循环变量;你可以使用任何你喜欢的两个。

最后,为算法参数创建命名变量通常是更好的风格,例如

threshhold  = 22
trial_limit = 10000
flip_limit  = 30

并在您的代码中使用这些名称。

【讨论】:

    【解决方案2】:

    如果您只是想掷硬币 10,000 次,看看有多少正面朝上(或反面,如果您愿意的话),那么这是一种简单的方法。 random.random 函数返回一个 0

    import random
    
    tosses = 100000
    
    t = 0
    for i in range(tosses):
        if random.random() < .5:
            t += 1
    
    p = t / tosses
    print(p)
    

    【讨论】:

    • 你也可以用 print(f'heads {t}, tails {tosses - t}") 得到正面和反面的数量(python 3.6 或更高版本)
    • 我同意你的代码,虽然有人会说使用 random.randint(2, 30) 的 p 值会远小于 50%。
    • 没错,但大多数硬币都是 50%。如果您想要不同的概率,您可以将 .5 更改为其他值。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2012-06-24
    • 2014-05-25
    • 2021-08-03
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多