计算在前 100 次滚动中连续滚动 3 次 6 的概率 [使用 python]
Calculating the probability of rolling a 6 3 times in a row in the first 100 rolls [Using python]
我不确定如何在不在循环内实现许多循环的情况下有效地计算概率。我能够正确执行它。但是肯定有更好的方法来编写代码。我不确定是否应该将我的所有代码都包含在循环中,因为它很长。
我目前拥有的代码
import math
arr=[]
total = 0
count =0
# for k in range(1,7):
# for i in range(1,7):
# tupple = (k,i)
# arr.append(tupple)
# count+=1
def countConsecutive(array, lengthOfArray):
for i in range(lengthOfArray - 2):
# If consecutive elements are same
if (array[i] == array[i + 1]==array[i+2]6):
return True
else:
return False
for a in range(1,7):
for b in range(1,7):
for c in range(1,7):
for d in range(1,7):
for e in range(1,7):
for f in range(1,7):
for g in range(1,7):
for h in range(1,7):
for i in range(1,7):
for j in range(1,7):
for k in range(1,7):
for l in range(1,7):
for m in range(1,7):
for n in range(1,7):
for o in range(1,7):
for p in range(1,7):
for q in range(1,7):
for r in range(1,7):
for s in range(1,7):
for t in range(1,7):
for u in range(1,7):
for v in range(1,7):
for w in range(1,7):
for x in range(1,7):
for y in range(1,7):
for z in range(1,7):
for aa in range(1,7):
for ab in range(1,7):
for ac in range(1,7):
for ad in range(1,7):
for ae in range(1,7):
for ad in range(1,7):
for ae in range(1,7):
for af in range(1,7):
for ag in range(1,7):
for ah in range(1,7):
for ai in range(1,7):
for aj in range(1,7):
for ak in range(1,7):
for al in range(1,7):
for am in range(1,7):
for an in range(1,7):
for ao in range(1,7):
for ap in range(1,7):
for aq in range(1,7):
for ar in range(1,7):
for As in range(1,7):
for at in range(1,7):
for av in range(1,7):
for aw in range(1,7):
for ax in range(1,7):
for ay in range(1,7):
for az in range(1,7):
for ba in range(1,7):
for bb in range(1,7):
for bc in range(1,7):
for bd in range(1,7):
for be in range(1,7):
for bf in range(1,7):
for bg in range(1,7):
for bh in range(1,7):
for bi in range(1,7):
for bj in range(1,7):
for bk in range(1,7):
for bl in range(1,7):
for bm in range(1,7):
for bn in range(1,7):
for bo in range(1,7):
for bp in range(1,7):
for bq in range(1,7):
for br in range(1,7):
for bs in range(1,7):
for bt in range(1,7):
for bu in range(1,7):
for bv in range(1,7):
for bw in range(1,7):
for bx in range(1,7):
for by in range(1,7):
for bz in range(1,7):
for ca in range(1,7):
for cb in range(1,7):
for cc in range(1,7):
for cd in range(1,7):
for ce in range(1,7):
for cf in range(1,7):
for cg in range(1,7):
for ch in range(1,7):
for ci in range(1,7):
for cj in range(1,7):
for ck in range(1,7):
for cl in range(1,7):
for cm in range(1,7):
for cn in range(1,7):
for co in range(1,7):
for cp in range(1,7):
for cq in range(1,7):
for cr in range(1,7):
for cs in range(1,7):
for ct in range(1,7):
for cu in range(1,7):
arr1 = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,q,x,y,z,aa,ab,ac,af,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,As,at,av,aw,ax,ay,az,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu]
if countConsecutive(arr1,len(arr1)) == True:
count+=1
arr.append(arr1)
print(count/pow(6,100))
这里有更简单的方法:
import random
sixs = []
counter = 0
for i in range(100):
for x in range(3):
if random.randint(1,6) == 6:
sixs.append(x)
if len(sixs) == 3:
counter = counter +1
sixs = []
print(str(counter) + "%")
导入模块random
。并创建空 list
,在本例中为 sixs[]
和 counter
。 For
循环将 运行 100 次,在 for
循环内你将有另一个 for
lopp,它将 运行 3 次并检查 if random.randint(1,6) == 6:
。如果生成的random
数是6,append
它就变成sixs[] list
。当第二个循环完成时,它将检查数字 6 是否被附加了 3 次,如果是,它将 counter
增加 1。在代码末尾,它将打印百分比。
[编辑]
只缺少一行代码,用于在迭代结束时将 list
重置回 0。该行是 sixs[] = []
您不需要为此进行任何编码虚拟实验。这个概率很容易计算。
如果你认为你拿三个骰子并掷它们得到三六的概率是 (1/6)³ = 1/216。所以没有三六的概率是 215/216。如果你重复一百次三个骰子都不是六个的概率甚至一次是 (215/216)^100 ≃ 0.6287。所以 100 次掷出三六的概率是 1-0.6287 = 0.3713 ≃ 37.1%.
掷骰子一百次并检查是否连续三个的场景几乎相同。稍微小一些,因为前两轮不可能有连续的 6,所以基本上我们有 98 次尝试。 1 - (215/216)^98 ≃ 0.3654 ≃ 36.5%
如果您想编写代码进行测试,这里有一个选项。
import random
def try100rolls():
"""
Returns true if there is three consecutive sixs
"""
sixcount = 0
for i in range(100):
if random.randint(1,6) == 6:
sixcount += 1
if sixcount == 3:
return True
else:
sixcount = 0
return False
def test(times):
"""
Do hundred roll test n times. Returns persentage how many times you got three six on row
"""
successcount=0
for i in range(times):
if try100rolls():
successcount += 1
return successcount/times
您进行的测试运行次数越多,结果就越接近数学计算值。出于某种原因,当 运行 100 次测试运行时,我得到的概率比正确值略小。可能和Python随机class有关,或者我算错了。或者只是改变。
我不确定如何在不在循环内实现许多循环的情况下有效地计算概率。我能够正确执行它。但是肯定有更好的方法来编写代码。我不确定是否应该将我的所有代码都包含在循环中,因为它很长。
我目前拥有的代码
import math
arr=[]
total = 0
count =0
# for k in range(1,7):
# for i in range(1,7):
# tupple = (k,i)
# arr.append(tupple)
# count+=1
def countConsecutive(array, lengthOfArray):
for i in range(lengthOfArray - 2):
# If consecutive elements are same
if (array[i] == array[i + 1]==array[i+2]6):
return True
else:
return False
for a in range(1,7):
for b in range(1,7):
for c in range(1,7):
for d in range(1,7):
for e in range(1,7):
for f in range(1,7):
for g in range(1,7):
for h in range(1,7):
for i in range(1,7):
for j in range(1,7):
for k in range(1,7):
for l in range(1,7):
for m in range(1,7):
for n in range(1,7):
for o in range(1,7):
for p in range(1,7):
for q in range(1,7):
for r in range(1,7):
for s in range(1,7):
for t in range(1,7):
for u in range(1,7):
for v in range(1,7):
for w in range(1,7):
for x in range(1,7):
for y in range(1,7):
for z in range(1,7):
for aa in range(1,7):
for ab in range(1,7):
for ac in range(1,7):
for ad in range(1,7):
for ae in range(1,7):
for ad in range(1,7):
for ae in range(1,7):
for af in range(1,7):
for ag in range(1,7):
for ah in range(1,7):
for ai in range(1,7):
for aj in range(1,7):
for ak in range(1,7):
for al in range(1,7):
for am in range(1,7):
for an in range(1,7):
for ao in range(1,7):
for ap in range(1,7):
for aq in range(1,7):
for ar in range(1,7):
for As in range(1,7):
for at in range(1,7):
for av in range(1,7):
for aw in range(1,7):
for ax in range(1,7):
for ay in range(1,7):
for az in range(1,7):
for ba in range(1,7):
for bb in range(1,7):
for bc in range(1,7):
for bd in range(1,7):
for be in range(1,7):
for bf in range(1,7):
for bg in range(1,7):
for bh in range(1,7):
for bi in range(1,7):
for bj in range(1,7):
for bk in range(1,7):
for bl in range(1,7):
for bm in range(1,7):
for bn in range(1,7):
for bo in range(1,7):
for bp in range(1,7):
for bq in range(1,7):
for br in range(1,7):
for bs in range(1,7):
for bt in range(1,7):
for bu in range(1,7):
for bv in range(1,7):
for bw in range(1,7):
for bx in range(1,7):
for by in range(1,7):
for bz in range(1,7):
for ca in range(1,7):
for cb in range(1,7):
for cc in range(1,7):
for cd in range(1,7):
for ce in range(1,7):
for cf in range(1,7):
for cg in range(1,7):
for ch in range(1,7):
for ci in range(1,7):
for cj in range(1,7):
for ck in range(1,7):
for cl in range(1,7):
for cm in range(1,7):
for cn in range(1,7):
for co in range(1,7):
for cp in range(1,7):
for cq in range(1,7):
for cr in range(1,7):
for cs in range(1,7):
for ct in range(1,7):
for cu in range(1,7):
arr1 = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,q,x,y,z,aa,ab,ac,af,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,As,at,av,aw,ax,ay,az,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu]
if countConsecutive(arr1,len(arr1)) == True:
count+=1
arr.append(arr1)
print(count/pow(6,100))
这里有更简单的方法:
import random
sixs = []
counter = 0
for i in range(100):
for x in range(3):
if random.randint(1,6) == 6:
sixs.append(x)
if len(sixs) == 3:
counter = counter +1
sixs = []
print(str(counter) + "%")
导入模块random
。并创建空 list
,在本例中为 sixs[]
和 counter
。 For
循环将 运行 100 次,在 for
循环内你将有另一个 for
lopp,它将 运行 3 次并检查 if random.randint(1,6) == 6:
。如果生成的random
数是6,append
它就变成sixs[] list
。当第二个循环完成时,它将检查数字 6 是否被附加了 3 次,如果是,它将 counter
增加 1。在代码末尾,它将打印百分比。
[编辑]
只缺少一行代码,用于在迭代结束时将 list
重置回 0。该行是 sixs[] = []
您不需要为此进行任何编码虚拟实验。这个概率很容易计算。
如果你认为你拿三个骰子并掷它们得到三六的概率是 (1/6)³ = 1/216。所以没有三六的概率是 215/216。如果你重复一百次三个骰子都不是六个的概率甚至一次是 (215/216)^100 ≃ 0.6287。所以 100 次掷出三六的概率是 1-0.6287 = 0.3713 ≃ 37.1%.
掷骰子一百次并检查是否连续三个的场景几乎相同。稍微小一些,因为前两轮不可能有连续的 6,所以基本上我们有 98 次尝试。 1 - (215/216)^98 ≃ 0.3654 ≃ 36.5%
如果您想编写代码进行测试,这里有一个选项。
import random
def try100rolls():
"""
Returns true if there is three consecutive sixs
"""
sixcount = 0
for i in range(100):
if random.randint(1,6) == 6:
sixcount += 1
if sixcount == 3:
return True
else:
sixcount = 0
return False
def test(times):
"""
Do hundred roll test n times. Returns persentage how many times you got three six on row
"""
successcount=0
for i in range(times):
if try100rolls():
successcount += 1
return successcount/times
您进行的测试运行次数越多,结果就越接近数学计算值。出于某种原因,当 运行 100 次测试运行时,我得到的概率比正确值略小。可能和Python随机class有关,或者我算错了。或者只是改变。