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

问题描述 投票:0回答:3

[我正在尝试为课堂编写代码,通过运行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)
python list random definition
3个回答
3
投票

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

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

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


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. 当您尝试打印输出时,也要打印其他字符串,以识别函数是否完成了执行。


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}%')

Test

仅进行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%
© www.soinside.com 2019 - 2024. All rights reserved.