2012-11-27 159 views
3

試圖在python中做生日程序。作爲Python的初學者,我遇到了一些麻煩。Python 3.3:生日概率

  1. 功能副本(L)是獲得一個列表升,如果有重複的元素返回true,false,如果它沒有。
  2. 函數test(count)生成一個列表count隨機整數在1到365之間。函數重複(l)將測試重複項。
  3. 功能概率(計數,NUM)運行NUM測試計數人,並計算與重複測試的次數。它返回含有重複項的測試部分 - 重複項的數量除以num。

結果應該是這樣的:

2人,2個生日的概率爲0.002。

對於3人,2個生日的概率爲0.008。等等...


滯留在第2步& 3:

import random 

# not sure what to put for count 
count = [random.randint(1, 365)] 

def duplicates(l): 
    if len(l)!=len(set(l)): 
     return True 
    else: 
     return False 

def test(count): 
    return [random.randint(1, 365)] 

#def probability(count,num): 

我相信我做了第一步正確,但我不知道在哪裏可以從這裏走。

+1

一點幫助與步驟2:'DEF測試(計數):返回[random.randint(1365),用於在範圍X(計數)]' – jdotjdot

回答

4

您應該像這樣創建列表。 test不是一個非常有用的名字。考慮像make_birthday_list代替

def test(count): 
    return [random.randint(1, 365) for x in range(count)] 

在重複測試已經計算爲一個布爾值,所以你可以做到這一點。它不使用l作爲變量名是個好主意(看起來太像1),所以我把它改成the_list

def duplicates(the_list): 
    return len(the_list)!=len(set(the_list)) 

你必須運行測試over and over得到的概率

如。

num_samples = 10000 
for count in range(100): 
    dup = 0 
    for test_number in range(num_samples): 
     the_list = make_birthday_list(count) 
     if duplicates(the_list): 
      dup += 1 
    print(count, dup/num_samples) #/returns a float in Python3 
+0

謝謝非常適合你的時間。我從你的答案中學到了很多關於Python的知識。 – Ace

1

test不返回長度count的列表。結果只有一個元素。你會想利用列表解析來得到這個工作不錯:

[random.randint(1, 365) for x in range(count)] 

那麼step 3:

def probability(count,num): 
    dup_trues = sum([duplicates(test(count)) for i in range(num)]) #*** 
    dup_falses = num-dup_trues 
    return float(fails)/num 

在上述功能的主機重要線路標記#*** 這裏有一個故障它是如何工作的:

方括號內的東西是列表理解。

for i in range(num)說做這個東西,其中i = 0,I = 1,...,I = NUM​​-1。你知道重複和測試是什麼。所以這個列表最後會出現一堆trues和falses(1和0)

sum將列表中的元素相加。所以這給了我們trues

數量下一行dup_falses = num-dup_trues說我們有NUM結果完全,那些都不是真的是假的。

return float(fails)/numfloat不在蟒必要3

+0

不客氣 – Sheena