2017-06-03 5 views
1

randomモジュールのrandom.sample()関数について読んでいますが、私の問題を解決するものは何も見ていません。Python - 特定の値を避けて範囲内のランダムサンプル

私はrange(0,999)で乱数を取得したいと思いrandom.sample(range(1,100),5)を使用して私に「人口」から5つのユニークなサンプル...

を与えるだろうことを知っています。私はrandom.sample(range(0,999),1)を使用することができましたが、なぜ私はrandom.sample()を使用することを考えていますか?

私はその範囲の乱数が別の配列(例えば、 [443,122,738])で、任意の数と一致しないようにする必要があります

私はこれをやって行くことができる、比較的簡単な方法はありますか?

また、私はPythonにはかなり新しく、間違いなく初心者です。あなたが私が見逃した可能性のある情報で質問を更新したいのであれば、私はします。

編集: 誤ってrandom.range()と言いました。うわー。

+0

「random.range」はありません。あなたは 'ランディント'を考えていますか?また、単一の乱数、またはいくつかの異なる乱数を取得しようとしていますか? –

+0

@AlexHall申し訳ありませんでした。ありがとうございました – Cheesecake

答えて

2

これを達成できる方法の1つは、番号を確認してから番号を使用できるリストに追加することです。

import random 

def method1(lower, upper, exclude): 
    choices = set(range(lower, upper + 1)) - set(exclude) 
    return random.choice(list(choices)) 

def method2(lower, upper, exclude): 
    exclude = set(exclude) 
    while True: 
     val = random.randint(lower, upper) 
     if val not in exclude: 
      return val 

使用例:

import random 

non_match = [443, 122, 738] 
match = [] 

while len(match) < 6: # Where 6 can be replaced with how many numbers you want minus 1 
    x = random.sample(range(0,999),1) 
    if x not in non_match: 
     match.append(x) 
+0

しかし、 'match'は0から5までの数字を持つことができます。 –

+0

@AlexHall良いキャッチ。私は、代わりにwhileループを使用して、希望の数値に達するまで続けるように答えを更新しました。 –

+0

ありがとう、これはちょうど私が見る必要があったものです。 – Cheesecake

2

二つの主な方法があり

for method in method1, method2: 
    for i in range(10): 
     print(method(1, 5, [2, 4])) 
    print('----') 

出力:

1 
1 
5 
3 
1 
1 
3 
5 
5 
1 
---- 
5 
3 
5 
1 
5 
3 
5 
3 
1 
3 
---- 

最初は狭い範囲以上のために良好ですリストexclude(だからchoicesリストはあまりにも大きくなりません)、2番目の方が反対の方が優れています(したがって、適切なオプションを探すのが何回も繰り返されることはありません)。

関連する問題