Python 洗牌一小部分物品

Python 洗牌一小部分物品,python,random,Python,Random,如果我使用拖拽一个小列表,我也会得到未拖拽的结果 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

如果我使用拖拽一个小列表,我也会得到未拖拽的结果

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] 
我理解,在研究了算法细节之后,情况必然如此。但我真的希望以编程方式获得一个小的未排序列表(比如3到6项)


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

如果必须排除原始顺序,只需重试洗牌,直到
per!=ori

一种方法是生成列表的排列,然后删除第一项。之后,您可以使用
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)

由于它是一个短数组,请手动快速洗牌:

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)
解决方案,您应该只在小型阵列上使用它。

我想是的,这使得[1,2]的情况总是[2,1];)-这是唯一的办法吗?我不会问是否有大量的例子,其中只有4项。。。如果一个函数名为shuffle,你希望它做什么?既然你在问,那么这个函数的功能与我期望它做的完全一致。是的,数学上的POV与实用上的POV不匹配。我想这取决于具体的用例。例如,如果我拿2个、3个和4个红心,用手洗它们,如果它们偶尔会按原来的顺序出现,我也不会感到惊讶
random.shuffle()
基本上是相同的交易(请原谅这个双关语)。@Wolf:我认为它也符合实际情况。如果我递给你3张牌,让你洗牌,我希望原始的顺序与其他任何顺序一样有同等的机会成为结果。好的,“重新实现”
随机。洗牌在我的情况下似乎是有意义的。我接受你的回答,因为它更实用。NPE重新表述了我的问题,这通常是一个好主意,同样在这种情况下,讨论有助于理解。所以这次我没有应用其中任何一个,我仍然在反映我的实际目标。无论如何,我发现这个答案最符合我原来的问题——正如我现在所理解的;)你试过这个吗?没有[1,3,2]。很抱歉,我以为你只想洗牌数组,确保没有得到原始数组。如果你想得到所有可能的数组排列,你应该使用