在抛硬币模拟中搜索“ p”值

时间:2019-06-14 00:01:03

标签: python numpy random

编码新手,尝试在抛硬币模拟中找到“ 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)

2 个答案:

答案 0 :(得分:0)

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

Python的sum 函数组合了一系列项目;有关示例,请参见文档。


您尝试使用变量m进行计数,但是没有赋予它初始值。

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


在OP评论后更新

我想我现在明白了:您想估计在一组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)的评估结果为1False将为0:在外部理解(内嵌for)中进行所有10,000次试验:

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

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

答案 1 :(得分:0)

如果您只是尝试抛硬币10,000次,然后看看有多少头(如果您愿意,可以抛尾)出现,那么这是一种简单的方法。 random.random函数返回一个数字,使得0 <= x <1,因此50%的时间应小于.5。

import random

tosses = 100000

t = 0
for i in range(tosses):
    if random.random() < .5:
        t += 1

p = t / tosses
print(p)