2012-11-29 12 views
13

可能性の重複:
pick N items at random異なる乱数を生成する方法は?

Iは1と49の間の6つの乱数を生成する必要があるが、彼らは同じにすることはできません。私はそれらを無作為にする方法を知っています、私はちょうどそれらが異なっていることを確実にする方法がわかりません。

ワークシートでは、各数値を表示してゼロに設定することをお勧めしますが、どのように役立つかはわかりません。

アドバイスをいただければ幸いです。

+4

あなたが試したことを投稿する必要があります。 – asheeshr

+0

もちろん、同じものでなければ、もはや実際にはランダムではありません。 –

+0

はい、それらはまだランダムです。ちょっとだけ小さいリストから引き出されているだけです。 – keirbtre

答えて

13

setは、任意の重複を維持しません。

s = set() 
while len(s) < 6: 
    s.add(get_my_new_random_number()) 
36

あなたはrandom.sampleを使用することができます。

>>> random.sample(xrange(1,50), 6) 
[26, 39, 36, 46, 37, 1] 

「ワークシートは、各番号を表示し、それをゼロに設定する推奨しています、それがどのように役立つかわかりません」

は、これが割り当てと仮定すると、あなたは自分をサンプリングし、あなたがtake a look at how random.sample is implementedをできた実装する必要があります。本当に有益ですが、コードはすべてのサブスライスも有効なランダムサンプルであることを保証するので、必要に応じて複雑すぎるかもしれません。効率を上げるために、人口の大きさに応じて異なるアプローチも使用しています。

ワークシートは、1から49までの数字のリストから始めて、選択した数字を0に置き換えて再選択した場合はスキップできるようにすることを前提としていると思います。

 
population = range(1, 50) # list of numbers from 1 to 49 
sample = [] 
until we get 6 samples: 
    index = a random number from 0 to 48 # look up random.randint() 
    if population[index] is not 0: # if we found an unmarked value 
    append population[index] to sample 
    set population[index] = 0 # mark selected 

何か違うことを試したい場合は、たとえば次のような考え方があります。リストをランダム化してから切り捨てるか、または何らかの形のreservoir samplingを入力します。

あなたの割り当てが幸運です。

+2

Python 3を使用している場合は、 'xrange'を' range'に変更してください。 –

+0

ありがとう!それは確かに割り当ての一部です。あなたはとても役に立ちました:) – keirbtre

+0

よろしくお願いします。 –

3

それはここにその解決策/アルゴリズムがあり、非常に一般的で愚かなインタビューの質問です:人々のために

import random 
a = range(1,50) 
for i in xrange(6): 
    b = a[random.randint(0,len(a)-i)] 
    a.remove(b) 
    print b 

は、ここでは、効率を気に私の解決策とチンさんのテストベンチれる:

>>> random.sample(xrange(1,50), 6) 
[26, 39, 36, 46, 37, 1] 

結果:

>python -mtimeit -s'import try2' 
[38, 7, 31, 24, 30, 32] 
100000000 loops, best of 3: 0.0144 usec per loop 
>python -mtimeit -s'import try1' 
36 
26 
41 
31 
37 
14 
100000000 loops, best of 3: 0.0144 usec per loop 

は、同じ時間であることを解決!