2016-11-11 71 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一个集合而不是一个列表将使您无需在每次迭代时遍历列表中的每个项目,以检查您要附加的新项目是否已存在。小改进,但你应该看到性能的差异。

相关问题