Python中的随机迭代

48 投票
6 回答
80341 浏览
提问于 2025-04-17 12:54

当你想要顺序遍历一串数字时,你可以这样写:

for i in range(1000):
  # do something with i

但是如果你想要随机地遍历从0到999的数字呢?这就需要在每次遍历时随机选择一个之前没有选择过的数字,并且要确保遍历到所有的数字,从0到999。

你知道怎么聪明地做到这一点吗?

6 个回答

20

人们常常错过了将代码模块化的机会。你可以定义一个函数来封装“随机迭代”的概念:

def randomly(seq):
    shuffled = list(seq)
    random.shuffle(shuffled)
    return iter(shuffled)

然后:

for i in randomly(range(1000)):
    #.. we're good to go ..
36

这里有一种不同的方法,可以以随机顺序遍历一个列表。这个方法不会像使用shuffle()那样改变原来的列表。

lst=['a','b','c','d','e','f']
for value in sorted(lst,key=lambda _: random.random()):
    print value

或者:

for value in random.sample(lst,len(lst)):
    print value
52

你可以使用 random.shuffle() 来打乱一个列表的顺序:

import random

r = list(range(1000))
random.shuffle(r)
for i in r:
  # do something with i

顺便说一下,在很多情况下,如果你在其他编程语言中会用 for 循环来遍历一系列整数的话,在Python中你可以直接描述你想要遍历的“东西”。
比如说,如果你想用 i 的值来访问列表中的元素,直接打乱列表会更好:

lst = [1970, 1991, 2012]
random.shuffle(lst)
for x in lst:
  print x

注意:使用 random.shuffle() 时,你需要记住以下警告(摘自文档):

请注意,对于即使是比较小的列表长度,列表的所有排列方式总数都比大多数随机数生成器的周期要大;这意味着大部分长序列的排列方式是无法生成的。

撰写回答