为什么我没有收到任何错误但代码不起作用?

时间:2020-03-15 01:48:42

标签: python list random definition

我正在尝试为班级编写代码,通过执行10 ^ 6次该实验,然后计算两次或两次以上实验的发生次数的比例,从而确定两个或两个以上的人在一个小组中有相同生日的可能性更多的人有相同的生日。我附加了以下代码,但是当我尝试运行它时,绝对没有任何反应。它没有给出错误信息,只是停止工作。有谁知道为什么?

    -
 import random

 def calc_birthday_probability (num_people):

     random.seed (2020) # Don't change this value
     num_trials = 1000000
     probability = 0
     list1 = []
     num_people = int(input())
     repeats = 0
     for i in range(0,num_trials+1):

         for i in range (0,num_people+1):
            list1.append(random.randint (1,3655))
            for i in list1:
                if list1.count(i)>1:
                    repeats +=1
                    i = i+1
                i = i+1

    prob = repeats//num_trials
    probability = probability + prob

    return probability

a = calc_birthday_probability(10)

print(a)

3 个答案:

答案 0 :(得分:3)

num_people = int(input()) 经典,您已经在函数中获得了参数,但您正在为其输入数据。您的程序只是等待您输入内容。

通常,当一个python程序尽管期望执行某种动作却什么也不做时,一个好窍门是检查它是否正在等待某种输入:)

编辑#1:如@rkatkam所述,两个for循环都使用相同的循环变量(特别是 i )。

答案 1 :(得分:2)

在函数的所有for循环中,您都使用了变量i,因此它的范围也不合适定义。

类似以下的方法应该起作用,但对我来说有效:

def calc_birthday_probability (num_people):

    random.seed (2020) # Don't change this value
    num_trials = 1000000
    probability = 0
    list1 = []
    repeats = 0
    for i in range(0,num_trials+1):

        for j in range (0,num_people+1):
            list1.append(random.randint (1,3655))
            for k in list1:
                if list1.count(j)>1:
                    repeats +=1
                    k = k+1

    prob = repeats//num_trials
    probability = probability + prob

    return probability

一些提示:

  1. 首先尝试使用较小的num_trials测试代码,直到发现结果正确为止。

  2. 您有一个接受num_people值的参数,并且该函数还具有一个input()

  3. 当您尝试打印输出时,还一起打印其他字符串,以识别该函数是否完成了执行。

答案 2 :(得分:0)

您的代码的简单版本

import random

def calc_birthday_probability(number_of_people = 30, num_trials=1000):
    dups_found = 0
    for _ in range(num_trials):
        birthdays = [random.randint (1,365) for _ in range(number_of_people)]

        # set of birthdays which are duplicates
        duplicates = set(x for x in birthdays if birthdays.count(x) > 1)

        if len(duplicates) >= 1:
            dups_found += 1   # increment since at least one duplicate

    return number_of_people, dups_found/num_trials * 100


num_people = int(input("Number of people: "))
print(f'{calc_birthday_probability(num_people, 1000):.2f}%')

测试

仅进行1,000次试验,因为结果足以与reference进行比较

for num_people in range(1, 52, 2):
  print(f'{num_people} --> {calc_birthday_probability(num_people, 1000):.2f}%')

输出

1 --> 0.00%
3 --> 0.40%
5 --> 3.10%
7 --> 6.10%
9 --> 9.90%
11 --> 13.70%
13 --> 19.00%
15 --> 25.30%
17 --> 34.60%
19 --> 37.70%
21 --> 46.50%
23 --> 53.30%
25 --> 57.30%
27 --> 59.60%
29 --> 70.40%
31 --> 72.40%
33 --> 77.90%
35 --> 81.60%
37 --> 84.30%
39 --> 87.90%
41 --> 89.30%
43 --> 93.40%
45 --> 93.70%
47 --> 95.00%
49 --> 96.10%
51 --> 96.60%