2012-11-18 88 views
-2

我正在嘗試編寫應用程序,將模擬擲硬幣一定次數到最多200次。 它必須記錄投擲數量和投擲的尾數,向用戶顯示連續投擲的頭數最多的數目,連續投擲的最多尾數以及除了所顯示的頭數和尾數的百分比。Python編程 - 投擲硬幣

請沒有負面評論 - 剛開始學習python,我的嘗試是在下面!

import random as rn 

rolls=int(raw_input("Enter the number of rolls: ")) 

for rolls in range(rolls): 
    print rn.choice(['H', 'HH', 'HHH', 'T', 'TT', 'TTT']), 
+4

有什麼問題嗎? –

+2

這不是隨機的,你可以通過把它們串在一起來偏向連續相同的拋物線。你想要做的是:'tosses = [rn.choice(「HT」)for i in range(rolls)]''。 –

+0

您錯過了「HT」,「TH」,「HTT」,「HTH」,「THT」,「THH」 – inspectorG4dget

回答

3

生成使用random.choice每個拋折騰:

tosses = ''.join(random.choice('HT') for i in range(rolls)) 

您可以簡單地計算的H和T得到的字符串中出現次數分別獲得的頭和尾,數量:

heads = tosses.count('H') 
tails = tosses.count('T') 

最後,您可以通過拆分其他 symb的字符串來查找連續正面/反面的最大數量ol,並找到最大的結果子字符串:

heads_in_a_row = max(len(s) for s in tosses.split('T')) 
tails_in_a_row = max(len(s) for s in tosses.split('H')) 

不是非常高效,但它可能有助於您理解。

+0

你也應該解釋它是如何工作的,至少在一般情況下;考慮提問者。 –

+0

對於'heads_in_a_row',你應該在'T'上分割,'tails_in_a_row'應該在'H'上分割。 – Tim

+0

@Tim,抓住了它,謝謝。 – ezod

0

無論何時您需要找到連續的東西,最好考慮itertools.groupby。這種方法需要很少的額外內存,無論輥的數量

from itertools import groupby 
import random 

rolls = int(raw_input("Enter the number of rolls: ")) 

tosses = (random.choice('HT') for x in range(rolls)) 

maxes = {'H': 0, 'T': 0} 
sums = {'H': 0, 'T': 0} 

for g, v in groupby(tosses): 
    n = sum(1 for x in v) 
    maxes[g] = max(maxes[g], n) 
    sums[g] += n 

print maxes['H'] 
print maxes['T'] 
print sums['H']*100.0/rolls 
print sums['T']*100.0/rolls 
0

它讓我感到驚訝,這兩個答案至今採取了非常沉重的做法,效率很低,做了很多的事情,尤其是內存使用明智的:

  • 構建和處理字符串
  • 存儲輸入
  • 創建多個臨時列表和/或字符串計數的目的的冗餘副本。

而且,這些方法都從一個角度運行時特別優雅或擅長解釋什麼是怎麼回事或者需要做算法,這是初學者教學的一個重要方面程序方面。

以下方法允許您使用任意大的輸入(滾動量),因爲它不需要保留任何副本。因此,它可以很容易地轉換爲生成器函數或類似的流處理函數。它也更簡單,程序清潔。

import random 

rolls=int(raw_input("Enter the number of rolls: ")) 

desc = {0: "H", 1: "T"} 
total = [0, 0] 
running = [0, 0] 
running_max = [0, 0] 
last_rolled = None 

for roll in xrange(rolls): 
    # we use 0 for heads and 1 for tails 
    # this will be the index to the relevant list element for our counters 
    rolled = random.randint(0,1) 
    total[rolled] += 1 

    if last_rolled == rolled: 
     # we are continuing the run, flipped the same as last time 
     running[rolled] += 1 
    else: 
     # there has been a break in the run 
     if not last_rolled is None: 
      # as long as this isnt the first iteration 
      print running[last_rolled] * desc[last_rolled], 
      running[last_rolled] = 0 
     running[rolled] = 1 

    # update the max count 
    running_max[rolled] = max(running_max[rolled], running[rolled]) 
    last_rolled = rolled 

print running[last_rolled] * desc[last_rolled] 
print "total rolls: H=%d, T=%d" % tuple(total) 
print "running max: H=%d, T=%d" % tuple(running_max) 

輸出示例:

Enter the number of rolls: 20 
HH TTTT HH TT HHHHHHH T H T 
total rolls: H=12, T=8 
running max: H=7, T=4