Python 嵌套循环故障
我正在为我的统计课做这个生日问题,这需要检查每个人共享同一个生日的概率。对于23个人,我应该得到0.5的概率。我做了10公里的试验,但我的概率是0.7。它必须是我反复检查和调试的代码Python 嵌套循环故障,python,loops,Python,Loops,我正在为我的统计课做这个生日问题,这需要检查每个人共享同一个生日的概率。对于23个人,我应该得到0.5的概率。我做了10公里的试验,但我的概率是0.7。它必须是我反复检查和调试的代码 import random import numpy as np n=10_000 m=23 a= np.random.randint(1,365, size=(n,m)) b=[] count=1 j=0 while j<n: i=0 while i<m: k=i+
import random
import numpy as np
n=10_000
m=23
a= np.random.randint(1,365, size=(n,m))
b=[]
count=1
j=0
while j<n:
i=0
while i<m:
k=i+1
while k<m:
if a[j][i]==a[j][k]:
b.append(count)
k+=1
i+=1
j+=1
z=(len(b)/n)
print("Probability = ",z)
随机导入
将numpy作为np导入
n=10_000
m=23
a=np.random.randint(1365,大小=(n,m))
b=[]
计数=1
j=0
然而,你面临的问题是,在每次实验中,在找到一对生日相同的情侣后,你继续进行,并且可以为每对额外的情侣计算一对。您确实希望从内部循环中中断
,但由于这需要跳出两个级别的循环,使用中断
不容易实现,因此从函数中返回
会更方便
通过将while
循环替换为for
循环,并仅使用整数计数器而不是1
值列表,也可以稍微整理一下,得到以下结果:
import random
import numpy as np
def share_birthday(birthdays):
m = len(birthdays)
for i in range(m):
for k in range(i + 1, m):
if birthdays[i] == birthdays[k]:
return 1
return 0
n = 10000
m = 23
a = np.random.randint(1, 365, size=(n,m))
count = 0
for j in range(n):
if share_birthday(a[j]):
count += 1
z = count / n
print("Probability = ",z)
在一次测试中,结果如下:
Probability = 0.5101
为了进行比较,这里是概率的直接计算(不依赖于蒙特卡罗方法):
其中:
Probability = 0.5072972343239857
附录-在评论中讨论之后,您似乎想看看如何
将
从嵌套循环中分离出来的示例。答案是,当您从内部循环中断时,需要设置一个标志,您可以测试该标志,以决定是否也从外部循环中断。像这样(同样使用for
循环以简洁,但同样的方法也适用于原始while
循环)
同样,这应该报告一个接近0.5的概率。即使您已经找到了一个用于试验的生日,您也会继续计算重叠的生日。您可以对此进行更多的扩展,但您的简短回答正确地指出了问题的核心。谢谢!我真的很感激。谢谢你!我真的很感激。我希望这一切都有意义,你也明白为什么我建议从函数中使用
return
——一个break
只会从内部循环退出,但你想从三个循环中的两个循环中退出。嗯,确实如此,但老实说,我希望有不止一种方法可以做到这一点。嵌套循环在这里似乎是无用的…@Thomas您将需要嵌套循环,因为您需要通过从类中选择的两个人的组合进行循环。您可能可以使用itertools.combines
,但这实际上是将循环隐藏在模块内看不见的地方——但仍然需要这样做。我的意思是,我希望有一种方法可以修复我的嵌套循环版本,而不是仅限于使用带有嵌套循环的函数的这种方法。
Probability = 0.5072972343239857
import random
import numpy as np
n = 10000
m = 23
a = np.random.randint(1,365, size=(n,m))
count = 0
for j in range(n):
match = False
for i in range(m):
for k in range(i+1, m):
if a[j][i] == a[j][k]:
count += 1
match = True
break
if match:
break
z = count / n
print("Probability = ", z)