编码新手,尝试在抛硬币模拟中找到“ 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)
答案 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
)的评估结果为1
; False
将为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)
flip
和trial
是伪循环变量;您可以使用任意两个。
最后,通常使用更好的样式来为算法参数创建命名变量,例如
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)