2016-10-11 31 views
3

存在一個隨機值我試圖生成每個循環的隨機值,並將其保存到變量minimum雖然做了檢查,如果該號碼之前已經在之前的循環中的一個產生。檢查,如果從以前的循環

listQ基本上包含6行從文件中隨機選擇。線路選自1max_line(其基本上比max_line值小6個步驟)。所以重要的是我必須生成一個乘數爲6的數字。

for x in range(0, 10): 
    minimum = random.randrange(0, max_line,6) 
    maximum = minimum+6 
    listQ = listQ[minimum:maximum] 

有點卡在這裏。一個列表可能?

+2

當然,附加到一個列表,並檢查'''在list'''數量是可能的。對於大量數據,'''set()'''會更好。當然這個輔助數據結構是在循環之外定義的! – sascha

+0

你的邏輯錯了。假設'maximum = minimum + 6'沒有任何意義,因爲randrange可以返回0作爲最小值,所以最大值最多隻能爲6。 – ozgur

+0

0和6沒有錯,因爲0是列表中的第一個值。 – user3431336

回答

1

保留所有先前值的列表,檢查每個後續的迭代。

# sets have faster "val in set?" checks than lists 
# do this once, somewhere in your program 
previous_vals = set() 

# other stuff here, including main program loop 
for x in range(0, 10): 
    # find a unique, new random number while 
    # limiting number of tries to prevent infinite looping 
    number_of_tries = 0 
    MAX_TRIES = 10 
    generating_random = true 
    while generating_random:  
     minimum = random.randrange(0, max_line,6) 
     if minimum not in previous_vals: 
      previous_vals.add(minimum) 
      generating_random = false 
     number_of_tries += 1 
     if number_of_tries == MAX_TRIES: 
      raise RunTimeError("Maximum number of random tries reached!") 

    maximum = minimum+6 
    listQ = listQ[minimum:maximum] 

請注意,there are other functions for set than add如果你想修改你的例子。

爲了防止代碼陷入無限循環,我添加了最大嘗試次數,因爲我不知道任何關於輸入數據的知識來了解進入這種情況的可能性。

+0

謝謝,這真的很有幫助! – user3431336

+0

順便說一句,有可能這樣構造這個文件只打開一次?是它甚至有可能用'與open' ----- '如果答覆[0] == 'M': 開放( 'questions.txt')爲f: max_line = LEN(F。 readlines方法()) 張開( 'questions.txt')爲f: allQ = [line.strip()在F線]' – user3431336