2017-01-12 8 views
0
from random import randint 
def random_number(): 
    return randint (1,10) 

rn1 = random_number() 

rn2 = random_number() 
while rn2 == rn1: 

    rn2 = random_number() 

rn3 = random_number() 
while rn3 == rn1 or rn3 == rn2: 

    rn3 = random_number() 

rn4 = random_number() 
while rn4 == rn1 or rn4 == rn2 or rn4 == rn3: 

    rn4 = random_number() 

rn5 = random_number() 
while rn5 == rn1 or rn5 == rn2 or rn5 == rn3 or rn5 == rn4: 

    rn5 = random_number() 

私は今この小さなコードをしばらく苦労しています。私はランダムに5つの数字を生成するプログラムを取得しようとしています。問題は、プログラムが同じ番号を2回生成する可能性があるということでした。私はアルゴリズムで生成された5の中に重複した番号がないことを確認しようとしています。ただし、コードは重複して印刷されます。私が間違ってやっていることは何ですか?Pythonで数値をランダム化する際の重複を防ぐには?

+0

@squeamishossifrage、彼らはランダムな順序で10、いない5から1以下の5つの数字をしたいです。 – Holloway

+0

これは、 'random.sample(range(1、10)、5)'のような 'random.sample'を使ってきれいにすることができます。 – miradulo

+0

1から10までの数字をシャッフルしてから、5を上から外すことができます。 – khelwood

答えて

-1
from random import randint 

def random_numbers(): 
    return randint(1,10) 

def main(): 
    my_list = [] 
    for i in range(10): 
     value = random_numbers() 
     if value in my_list: 
      continue 
     else: 
      my_list.append(value) 
    print(my_list) 

main() 
+0

ダウン投票の理由はありますか? – Maddy

0

あなたがリストに各乱数を追加し、それがすでに行われているかどうかを確認するためにそのリストで確認することができます。この方法は簡単ですが、それを理解すること

numbers = [] 
while len(numbers) < 5: 
    n = random_number() 
    if n not in numbers: 
     numbers += [n] 

注ときに、非常に効率的ではありません元の数字セットの大きなサブセットを必要としています。たとえば、数字1〜1000000のセットから1000000の数字を取得しようとすると、すでにリストに追加されている数字を試しているので時間がかかります。

5

私はこれを行う最も簡単な方法は、random.sampleを使用することであると思う:

import random 

numbers = random.sample(range(1, 11), 5) 

これはあなたが望むものであるように思わ交換なしサンプリングし、実行します。そう、あなたの最後に1を追加する必要がある - random.sample(pop, k)は人口pop(リストまたはその他)からサイズkのサンプルを選択し、randintの境界がa <= x <= bている間range(a, b)の境界は、a <= x < bであることを

注意rangeが呼び出されます。

2

あなただけの組み込みのnumpyの機能を使用することもできます

import numpy as np 
np.random.choice(10,5) 

Documentation here。これらのすべては、あなたがサンプリングしたいように、からサンプリングする配列を構築するためにnp.arangeに依存していることを

np.random.choice(10, 5, replace=False) 

注:これと同様に、choiceは交換にとせずにサンプリングを切り替えるには、同様replacementキーワードを持っていることに注意してください[0,1,...,9]から - あなたはあなたが行うことができ、1〜10からサンプリングしたい場合:

np.random.choice(range(1,11), 5, replace=False 
関連する問題