【问题标题】:Why am i getting no error but the code isnt working?为什么我没有收到错误但代码不起作用?
【发布时间】:2020-03-15 01:48:42
【问题描述】:

我正在尝试为类编写一个代码,通过运行这个实验 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)

【问题讨论】:

  • 你为什么不调试你的代码?
  • 你的缩进是一团糟。您能否首先确保这是正确的。如果我复制您的代码,我会收到一条接一条的错误消息。
  • 我认为您的意思是 365(一年中的天数),而不是 3655。

标签: python list random definition


【解决方案1】:

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. 当您尝试打印输出时,同时打印一些其他字符串,以确定函数是否完成执行。

    【讨论】:

      【解决方案3】:

      更简单的代码版本

      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%
      

      【讨论】:

        猜你喜欢
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 2021-09-23
        • 2016-09-05
        • 1970-01-01
        相关资源
        最近更新 更多