我有一段代码:
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()