我正在尝试为班级编写代码,通过执行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)
答案 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
一些提示:
首先尝试使用较小的num_trials
测试代码,直到发现结果正确为止。
您有一个接受num_people
值的参数,并且该函数还具有一个input()
。
当您尝试打印输出时,还一起打印其他字符串,以识别该函数是否完成了执行。
答案 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%