2016-11-16 74 views
0

我可以很容易地找到100個頭數和100個翻轉頭中硬幣翻轉頭的機率。該代碼如下。然而,我無法弄清楚如何輕鬆獲得連續連續10次擲硬幣的機率連續10次硬幣翻轉頭的機率

import random 

n = int(input("Enter the number of flips: ")) 

sum = 0 
heads = 0 
tails = 0 
for n in range(1, n + 1): 
    number = random.randrange(0,2) 
    if number == 0: 
     heads += 1 
    else: 
     tails += 1 
    sum += number 
    odds = sum/n 


print("No. of heads: ", heads) 
print("No. of tails: ", tails) 
print("Odds: ", odds) 
+2

您知道'(1/2)^ 10'嗎? – schwobaseggl

+0

'odds = sum/n'應該不會縮進那裏。你用循環計數器覆蓋了'n'變量 –

+0

@schwobaseggl:我認爲OP需要模擬翻轉,而不是計算* expected *值。 – Prune

回答

2

你需要翻轉硬幣10次,但只報告成功,如果他們所有拿出頭。用相反的邏輯做到這一點:如果任何一個人出現尾巴,將你的旗子設置爲False。

all_heads = True 
for i in range(10): 
    number = random.randrange(0,2) 
    if number != 0: 
     all_heads = False 

更簡潔

all_heads = True 
for i in range(10): 
    all_heads &= random.randrange(0,2) == 0 

...甚至更Python

all_heads = all(random.randrange(0,2) == 0 for i in range(10)) 

無論你選擇,你需要做足夠的時間來近似的統計宇宙。既然你預計在1024次試驗中只有一次成功,你會需要10,000到100,000次試驗。計算成功次數,除以試驗次數。你已經知道如何做那部分。


SPOILER:

鑑於磁頭遊程的長度,Ñ,和試驗次數,這樣可減少到

print (sum(all(random.randrange(0,2) for _ in range(n)) \ 
      for _ in range(trials))      \ 
    /float(trials)) 

歡迎到Python。 :-)

+1

在第一個片段中,當'number!= 0'時,不僅應該將all_heads設置爲False,還應該儘早退出for循環 - 尤其是如果你要模擬這樣做的次數非常多。 – martineau

+0

你是對的。爲了簡單起見,我保留了這一點,並且稍後與** all **方法保持一致。 – Prune

+0

沒有考慮使用反向邏輯,但似乎在我添加了你提到的代碼部分後正在工作。感謝您的幫助:D –

0

一個實驗現在將達到10次翻轉。您必須經常重複以獲得足夠的預期結果(10頭):

import random 

n = int(input("Enter the number of tries: ")) # 1 try = 10 flips 
ten_head_count = 0 

for _ in range(n): 
    if all(x==0 for x in (random.randrange(0,2) for _ in range(10))): 
     ten_head_count += 1 

print("No. of ten heads: ", ten_head_count) 
print("No. of tries: ", n) 
print("Odds: ", ten_head_count/n) 
+0

看起來像是一個非常簡單和不錯的方式來做到這一點。謝謝 –