2014-02-12 69 views
0

下面執行代碼時出現看似隨機誤差是從自己編寫的程序的代碼的一部分是通過各種手段非常基本。在Python 3.3

pc1 = random.choice(cards) 
cca1 = random.choice(cards) 
while (pc1 == cca1): 
    cca1 = random.choice(cards) 
ccb1 = random.choice(cards) 
while (pc1 == ccb1) or (cca1 == ccb1): 
    ccb1 = random.choice(cards) 

pc1cca1ccb1只是變量名,縮短了易用性。這部分代碼所做的是嘗試從名爲卡的字典中獲取3個條目。它使用while函數來確保所選卡片不相同;他們將永遠是不同的。

這下去,直到我有9個獨特的變量從我的52字典,和它的作品,除了有時會產生以下錯誤罰款:

Traceback (most recent call last): 
    File "C:\Python33\Programs\Poker\1.0.py", line 231, in <module> 
    ccc2 = random.choice(cards) 
    File "C:\Python33\lib\random.py", line 252, in choice 
    return seq[i] 
KeyError: 0 

上述(ccc2)錯誤的變量只是一個之前顯示的代碼的繼續,以及假設每次都會導致錯誤發生變化的變量。

的錯誤只發生有時(有時該程序運行正常,其他時候,它顯示了錯誤),它發生在線路還與每一個的外觀變化。 我明白我的代碼是低效的,但我真的只是希望制止這種錯誤,也許有些有用的想法/如何改進的提示。

再一次;做它本來應該的,但無法識別地返回看似偶然的隨機時間所提到的錯誤,看似隨機的原因網站。

在此先感謝!

回答

5

的方式random.choice作品是專爲序列,而不是映射。它挑選指數,所以有時會嘗試cards[0],這顯然不是一個有效的關鍵。錯誤出現隨機的原因當然是因爲它取決於random所選的值!

您可以通過序列明確選擇解決這個問題:

random.choice(list(cards)) 

更廣泛地提高你的代碼,請注意random還包括sample

rcards = random.sample(list(cards), 3) # pick three random cards 

注意,在這兩種情況下,我們隨機選擇從字典

+0

太好了,非常感謝您的回覆,我已經編輯了我的代碼,並提供了.keys()的建議,現在看起來工作正常。我也會研究你的改進我的代碼的建議,謝謝你的幫助! – Russman

+0

嘿喬恩,感謝您的早幫助,只要把您的建議付諸實踐,並實現我忘了說我想要從字典條目,而不是鍵的值!這有可能嗎?我該怎麼做? – Russman

+0

一旦你有了鑰匙,就像通常那樣得到這些值:'val = cards [key]'。或者,從'cards.values()'中隨機選擇/抽樣。 – jonrsharpe