Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套循环故障_Python_Loops - Fatal编程技术网

Python 嵌套循环故障

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+

我正在为我的统计课做这个生日问题,这需要检查每个人共享同一个生日的概率。对于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+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)