随机播放一小部分物品

时间:2014-09-07 10:59:50

标签: python random

如果我使用python's random.shuffle对一个小列表进行随机播放,我也会得到无瑕疵的结果。

import random

for i in range(10):
    ori = [1, 2, 3]
    per = ori[:]
    random.shuffle(per)
    print i, per, (per == ori) or ""

以下是示例输出:

0 [1, 3, 2] 
1 [1, 2, 3] True
2 [3, 1, 2] 
3 [2, 3, 1] 
4 [1, 2, 3] True
5 [2, 3, 1] 
6 [3, 2, 1] 
7 [2, 1, 3] 
8 [2, 1, 3] 
9 [2, 1, 3] 

我理解在查看算法详细信息[1][2]之后必定会出现这种情况。但我真的想以编程方式获得一个小的未排序列表(比如3到6个项目)。

您认为最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

如果您必须排除原始排序,则只需重试该随机播放,直到per != ori

答案 1 :(得分:1)

一种方法是生成列表的排列,然后删除第一项。之后,您可以使用random.choice选择任何排列:

>>> from random import choice
>>> from itertools import permutations
>>> data = list(permutations([1, 2, 3], 3))[1:]
>>> for _ in range(10):
...     print choice(data)
...     
(3, 2, 1)
(3, 2, 1)
(2, 1, 3)
(1, 3, 2)
(1, 3, 2)
(1, 3, 2)
(3, 2, 1)
(2, 3, 1)
(2, 3, 1)
(2, 1, 3)

答案 2 :(得分:-1)

因为它是一个短阵列,所以手动快速洗牌:

import random

for i in range(len(ori) - 1):
    j = random.randint(i + 1, len(ori) - 1)
    ori[i], ori[j] = ori[j], ori[i]

这样您就可以确保不会获得原始数组。这是O(n)解决方案,您应该只在小数组上使用它。