重複の可能性:
N 個のアイテムをランダムに選ぶ
1 から 49 までの 6 つの乱数を生成する必要がありますが、同じにすることはできません。それらをランダムにする方法は知っていますが、それらが異なることを確認する方法がわかりません。
ワークシートでは、各数値を表示してゼロに設定することを推奨していますが、それがどのように役立つかわかりません。
どんなアドバイスでも大歓迎です。
重複の可能性:
N 個のアイテムをランダムに選ぶ
1 から 49 までの 6 つの乱数を生成する必要がありますが、同じにすることはできません。それらをランダムにする方法は知っていますが、それらが異なることを確認する方法がわかりません。
ワークシートでは、各数値を表示してゼロに設定することを推奨していますが、それがどのように役立つかわかりません。
どんなアドバイスでも大歓迎です。
使用できます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 # 選択済みのマーク
別のことを試みたい場合は、他にも考慮すべき多くのアプローチがあります。たとえば、リストをランダム化してから切り捨てる、または何らかの形式のリザーバー サンプリングなどです。
任務頑張ってください。
Aset
は重複を保持しません。
s = set()
while len(s) < 6:
s.add(get_my_new_random_number())
それは非常に一般的で愚かなインタビューの質問です、ここにその解決策/アルゴリズムがあります:
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
同じ時間になることを決心しました!