Python中的随机迭代

时间:2012-02-12 20:26:43

标签: python random for-loop

当你想在数字列表上按顺序迭代时,你会写:

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

但是如果你想随机迭代范围(0..999)中的数字列表怎么办?需要(在每次迭代中)随机选择在任何先前迭代中未选择的数字,并且需要迭代范围内的所有数字(0..999)。

你知道怎么做(智能)吗?

6 个答案:

答案 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