2016-10-11 49 views
3

各ループのランダムな値を生成し、それを変数minimumに保存しようとしています。前のループからランダムな値が存在するかどうかを確認してください

listQは、基本的にファイルからランダムに選択された6 linesを含んでいます。ラインは、1からmax_line(これは基本的には6ステップでmax_line値よりも小さい)から選択された。だから、私は6の乗数である数字を生成する必要があります。

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

ビットがここでスタックされています。おそらくリスト?

+2

もちろん、リストに追加し、 '' number in list''でチェックすることもできます。大量のデータの場合、 '' 'set()' ''はより良いでしょう。もちろん、この補助データ構造はループの外で定義されています! – sascha

+0

あなたのロジックが間違っています。 randrangeは0を最小値として返すことができるので、最大値は最大でも6になるので、 'maximum = minimum + 6'とするのは意味がありません。 – ozgur

+0

0と6の間に何も問題はありません。なぜなら、0 izがリストの最初の値であるからです。 – 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

これを構造化するとファイルは1回だけ開くことができますか? Fとして( 'questions.txt')オープンと : max_line = LEN(Fそれも可能open' と 'と----- '返信なら[0] == 'M' です。 ( ')'のようにopen( 'questions.txt')を使用して を入力してください: allQ = [fの行のためのline.strip() – user3431336

関連する問題