2016-11-11 63 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代碼做這項工作完美:

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) 

然而,因爲它是Python的,它可能需要很長(如超過一分鐘)爲np > 200000

您是否可以使用NumPy查看上述解決方案的更高效版本?

+3

創建範圍的密集表示(np.arange(1,N + 1)),並使用np.random.choice()無需替換,或洗牌並取前n個值。這些方法是一種時間記憶折衷。 – sascha

+0

@sascha,在評論中提出答案的意義何在? – user2699

+2

@ user2699簡單的問題,簡單的答案。沒有時間添加完整的高質量答案,但有足夠的雄心壯志,不能給出一些衝突的低質量答案(例如,沒有假設,基準和合作的一行代碼)。因此概述了一種方法來提供幫助。 – sascha

回答

0

製作result一個集合而不是一個列表將使您無需在每次迭代時遍歷列表中的每個項目,以檢查您要附加的新項目是否已存在。小改進,但你應該看到性能的差異。

相關問題