web-dev-qa-db-ja.com

異なる乱数を生成する方法は?

可能性のある複製:
ランダムにN個のアイテムを選択

1〜49の6つの乱数を生成する必要がありますが、同じにすることはできません。私はそれらをランダムにする方法を知っていますが、それらが異なることを確認する方法がわかりません。

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

アドバイスは大歓迎です。

14
keirbtre

random.sample

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

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

これが割り当てであり、サンプリングを自分で実装する必要があると仮定すると、 random.sampleが実装されています 。これは非常に有益ですが、コードによってすべてのサブスライスも有効なランダムサンプルになることが保証されるため、ニーズに対して複雑すぎる場合があります。効率のために、人口規模に応じて異なるアプローチも使用します。

ワークシートについては、1から49までの数字のリストから始めることを想定しており、選択した数字を0に置き換えることをお勧めします。これにより、再選択してもスキップできます。ここにあなたが始めるためのいくつかの疑似コードがあります:

 population = range(1、50)#1から49までの数値のリスト
 sample = [] 
 6つのサンプルが得られるまで:
 index =ランダム0から48までの数値#random [randint()
を検索します。population[index]が0でない場合:#マークされていない値が見つかった場合
 Population [index]をサンプルに追加します
 Set Population [index] = 0#選択マークを付ける

別の方法を試してみたい場合は、他にも考慮すべき多くの方法があります。リストをランダム化してから切り捨てるか、何らかの形式の リザーバーサンプリング

あなたの割り当てで頑張ってください。

40
Shawn Chin

setは重複を保持しません:

s = set()
while len(s) < 6:
    s.add(get_my_new_random_number())
13
E.Z.

これは非常に一般的で愚かなインタビューの質問です。これがその解決策/アルゴリズムです。

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

同時に解決する!

3
0x90