2016-11-11 7 views
0

n = range(1, n+1)の範囲内で、n * pの一意の整数のリストをランダムに生成する必要があります。例えばNumPy - 範囲内の一意の整数のランダムリストを選択する

n = 10p = 0.3場合は、可能な結果があることができます:

[2, 6, 9] 
[1, 5, 7] 
[3, 4, 8] 
[3, 5, 6] 
etc 

次のPythonコードは完璧に仕事をしていません:それはPythonのだからしかし、それは(長く取ることができます

import random 

n = 250000 
p = 0.8 
np = int(n * p) 

result = [] 
for i in range(np): 
    attempt = random.randint(1, n) 
    if attempt not in result: 
     result.append(attempt) 

1分以上)をnp > 200000に設定します。

NumPyを使用して、上記のソリューションのより効率的なバージョンを確認できますか?

+3

result = random.sample(range(1,n+1),p*n) 

リンク(あなたの範囲(np.arange(1、N + 1))の密な表現を作成し、np.random.choiceを使用)交換しないでシャッフルして、最初のnの値を取る。これらのアプローチは、一種の時間 - メモリトレードオフです。 – sascha

+0

@サシャ、コメントに答えを入れるのは何ですか? – user2699

+2

@ user2699簡単な質問、簡単な答え。高品質の完全な回答を追加する時間はありませんが、急いで低品質の回答(例えば、仮定、ベンチマーク、共同のない1行のコード)を与えないように十分に意欲的です。したがって、手助けのアプローチの概要。 – sascha

答えて

0

resultをリストの代わりに設定すると、追加する新しいアイテムが既に存在するかどうかを確認するために、各繰り返しでリスト内のすべてのアイテムを実行する必要がなくなります。小さな改善ですが、パフォーマンスに違いが見られます。

関連する問題