快速获取数字列表的方法

2024-04-27 03:05:55 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一段代码:

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开始,每个循环周期上升一。然后,如果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的数字列表。“随机”数字越多越好。提前谢谢


Tags: or方法代码intest列表lenif
2条回答

正如许多人已经建议的那样,使用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()

相关问题 更多 >