当你想在数字列表上按顺序迭代时,你会写:
for i in range(1000):
# do something with i
但是如果你想随机迭代范围(0..999)中的数字列表怎么办?需要(在每次迭代中)随机选择在任何先前迭代中未选择的数字,并且需要迭代范围内的所有数字(0..999)。
你知道怎么做(智能)吗?
答案 0 :(得分:26)
您可以使用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()
时,请注意以下警告(摘自docs:
注意,即使是相当小的len(x),总数也是 x的排列大于大多数随机数的周期 发电机;这意味着长序列的大多数排列都可以 永远不会被生成。
答案 1 :(得分:16)
人们经常错过模块化的机会。您可以定义一个函数来封装“随机迭代”的想法:
def randomly(seq):
shuffled = list(seq)
random.shuffle(shuffled)
return iter(shuffled)
然后:
for i in randomly(range(1000)):
#.. we're good to go ..
答案 2 :(得分:6)
演示Python生成器和Fisher–Yates shuffle。
import random
def shuffled(sequence):
deck = list(sequence)
while len(deck):
i = random.randint(0, len(deck) - 1) # choose random card
card = deck[i] # take the card
deck[i] = deck[-1] # put top card in its place
deck.pop() # remove top card
yield card
您只能生成与您使用的随机数一样多的随机数。但老实说,这可能不会节省太多,所以你通常应该使用random.shuffle
。
注意:如果选择了顶级卡,deck[i] = deck.pop()
将不安全,因此删除顶部分两步完成。
答案 3 :(得分:5)
numpy
中有一个功能random.permutation()
可以完全适合您。
您的代码看起来像
from numpy.random import permutation
for i in permutation(1000):
# do something with i
答案 4 :(得分:3)
使用random.shuffle方法:
itrange = list(range(100))
random.shuffle(itrange)
for i in itrange:
print i
答案 5 :(得分:2)
这是一种以随机顺序迭代列表的方法。与使用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