获取数字列表的更快方法



我有一段代码:

def test(num):
count = 1
l = []
while len(l) < 16:
x = num % count
if x >= 16 or x in l:
pass
else:
l.append(x)

count += 1

return l

取一个数字45071,以count为模,从1开始,每个循环周期增加1。然后,如果45071 % count小于16,则将其添加到列表中,除非已经存在相同的值。当列表中有16个数字时,循环停止,从0到15。下面是测试运行的结果:

>>> print(test(45071))
[0, 1, 2, 3, 5, 7, 8, 4, 11, 15, 14, 13, 12, 6, 9, 10]

这是有效的,但是对于更大的列表和许多不同的数字,它变得相当慢。我想知道是否有任何方法可以使这个更快,或者另一种方法来获得从0到15的数字列表。数字越"随机"越好。提前感谢!

正如很多人已经建议的那样,使用random。它不是真正的随机(没有什么是随机的)——如果你用相同的种子调用random.seed,然后调用相同的伪随机函数,你总是会得到相同的伪随机结果。

>>> import random
>>> def shuffled_ints(n, seed):
...     random.seed(seed)
...     ints = list(range(n))
...     random.shuffle(ints)
...     return ints
...
>>> shuffled_ints(16, 45071)
[0, 10, 12, 14, 8, 1, 15, 2, 13, 7, 6, 5, 3, 9, 11, 4]
>>> shuffled_ints(16, 1234)
[3, 2, 6, 4, 7, 10, 8, 5, 11, 12, 13, 9, 15, 0, 1, 14]
>>> shuffled_ints(16, 45071)
[0, 10, 12, 14, 8, 1, 15, 2, 13, 7, 6, 5, 3, 9, 11, 4]

使用shuffle(或等效的)比原始方法更有效,因为您不需要不断生成随机数并将它们丢弃。

一个更简洁的版本可能是使用random.sample:

def shuffled_ints(n, seed):
random.seed(seed)
return random.sample(range(n), n)

如果您只是在寻找随机数,那么您可以使用具有此功能的库。例如random.randrange()或numpy.random.rand()

相关内容

最新更新