2011-09-14 108 views
0

我有這樣的代碼這個python代碼是做我想做的事情嗎?

import random 
b = 20 
x = random.randrange(0,b) 
y = random.randrange(0,b) 
ab = 0 
xc = 0 

while ab != 10: 
    if x != y: 
     x = random.randrange(0,b) 
     y = random.randrange(0,b) 
     xc = xc + 1 
    elif x == y: 
     print ab 
     print 'number of tries out of', b, ' : ', xc 
     ab = ab + 1 
     xc = 0 
     y = 999999 

它本質上是一個統計程序。我想從10次嘗試中看出爲了匹配需要生成一個隨機數的次數。到目前爲止,我運行這個程序後得到的數字是:我得到了這些值,我跑了5次程序,總共有50次嘗試。

9 
26 
6 
1 
5 
109 
5 
42 
12 
63 

所有這些低的數字使我想知道如果我的計劃是隻非常幸運的,或者如果事情是錯我的代碼。謝謝!

注意:有沒有一種方法可以讓XC在每個while循環之後加起來,while循環對於顯示總數是否爲true?

+1

爲什麼不運行它一千次?數字越大,數據越好,而20就計算機的能力而言,數字非常小。 –

+0

有些東西可能會使你的值向上扭曲,事實上,在匹配之後,你通過設置y = 9999自動強制x!= y,這意味着xc在第一次增加時不會爲x和y選擇隨機值它至少應該*可能*在一行中選擇兩個匹配並報告xc值爲0)。另外,爲什麼你每次都通過循環「導入隨機」(我懷疑這對你的程序行爲有什麼影響,但看起來很奇怪)? – Peter

回答

1

我會說你有些不走運。

平均有27.8。但是如果你在0到20之間選擇兩個數字,你會期望他們匹配大約1/20的時間,因此你希望在比賽前等待大約20次。

+0

我改變了y值爲1 ,然後將b增加到50,所以範圍將是1,50. 我的新值仍然令人難以置信。 我在少於5次嘗試中獲得了4次我的新程序 所以你不認爲什麼是錯的? – Drake

+0

4出了多少次嘗試? –

+0

我得到了不到5次,是新程序的4次運行中的平均值的5倍* 藉口語法 – Drake

1

與迭代的數量較多一下:

#!/usr/bin/env python 
import random 

max_num = 20 
x = random.randrange(0, max_num) 
y = random.randrange(0, max_num) 
tries = 0 

i = 0 
iterations = 1000 
total_tries = 0 
while i < iterations: 
    if x != y: 
     x = random.randrange(0, max_num) 
     y = random.randrange(0, max_num) 
     tries += 1 
    else: 
     print(i) 
     print('number of tries out of %s : %s ' % (max_num, tries)) 
     total_tries += tries 
     i += 1 
     tries = 0 
     y = -1 

print("Average tries: %s" % (total_tries/iterations)) 

如果我跑,我得到〜20每次。

注:這可以簡化爲這樣:

#!/usr/bin/env python 
import random 

max_num = 20 
iterations = 1000 
total_tries = 0 

for i in range(iterations): 
    print(i) 

    tries = 0 
    x = 0 
    y = -1 
    while x != y: 
     x = random.randrange(0, max_num) 
     y = random.randrange(0, max_num) 
     tries += 1 

    print('number of tries out of %s : %s ' % (max_num, tries)) 
    total_tries += tries 
    i += 1 
    tries = 0 

print("Average tries: %s" % (total_tries/iterations)) 
+1

這仍然太複雜了;看到我的答案。 –

1

你的邏輯很奇怪。

  • 您不想使用人造哨兵值來擺脫循環。只是明確地擺脫它。

  • 您基本上有兩個循環:一個用於迭代試驗,一個用於查看給定試驗需要多少次嘗試。不要隱藏那個結構。

  • 不涵蓋if/else if的所有情況。這就是else的用途。

  • 在循環中,在測試之前生成數字,而不是之後。這樣,你所做的更清晰,並且在循環之前不需要額外的生成步驟。同樣,重新初始化頂部循環內的值,而不是底部。

  • 使用清晰的變量名稱。如果沒有有意義的變量名稱,請避免創建變量。您實際上不需要將兩個變量設置爲random.randrange(0, b)以比較結果。 OTOH,如果你想簡化邏輯並避免寫一個看起來怪異的random.randrange(0, b)自己的比較,那麼你可以注意到(如果你對這類東西感興趣的話,應該能夠證明,如果你有興趣編寫一個程序)您可以任意選擇一個目標值並獲得相同的結果。另外,使用變量來命名您任意選擇的數字常量。

  • 您可以在Python中使用+=來更新變量。

  • 使用打印格式。


import random 
range_size = 20 
total = 0 
iterations = 1000 # or however many 

for trial in xrange(iterations): 
    attempts = 0 
    while random.randrange(0, range_size) != 0: attempts += 1 
    print "Trial #{0}: Took {1} tries to match one of {2} numbers.".format(
     trial, attempts, range_size 
    ) 
    total += attempts 

print "Average trials: {0}".format(float(total)/iterations) 

如果您不需要調試信息,我們可以通過內置的功能做了總結,併爲我們循環邏輯使事情變得更清潔:

from random import randrange 
from itertools import * 
range_size = 20 
total = 0 
iterations = 1000 # or however many 

print "Average trials: {0}".format(sum(
    sum(takewhile(lambda x: randrange(0, range_size) != 0, repeat(1))) 
    # I tested that way, but this is probably more logical 
    # even if it's more verbose: 
    # len(list(takewhile(
    #  lambda x: x != 0, 
    #  imap(randrange, repeat(0), repeat(range_size)) 
    #))) 
    # 'lambda x: x != 0' can also be spelled 'bool' in this context, 
    # but explicit is better than implicit... 
    for i in xrange(iterations) 
)/float(iterations)) 
+0

'while random.randrange(0,range_size)!= 0:' - 你說得對,那樣更好。 –