15

重複の可能性:
N 個のアイテムをランダムに選ぶ

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

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

どんなアドバイスでも大歓迎です。

4

3 に答える 3

42

使用できます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 までの数字のリスト
サンプル = []
6 つのサンプルを取得するまで:
  index = 0 から 48 までの乱数 # random.randint() を参照
  ifpopulation[index] is not 0: # マークされていない値が見つかった場合
    人口[インデックス]をサンプルに追加
    setpopulation[index] = 0 # 選択済みのマーク

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

任務頑張ってください。

于 2012-11-29T15:12:40.090 に答える
13

Asetは重複を保持しません。

s = set()
while len(s) < 6:
    s.add(get_my_new_random_number())
于 2012-11-29T15:12:07.760 に答える
2

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

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

同じ時間になることを決心しました!

于 2012-11-29T15:27:26.963 に答える