85
import random
x = [1, 2, 3, 4, 5, 6]
random.shuffle(x)
print x

我知道如何打乱一个列表,但是是否可以用一个参数来打乱它,这样打乱每次都会产生相同的结果?

就像是;

random.shuffle(x,parameter)

这个参数的结果是一样的。说参数是4,结果是[4, 2, 1, 6, 3, 5]每次。

4

4 回答 4

182

正如文档所解释的:

该模块提供的函数实际上是 random.Random 类的隐藏实例的绑定方法。您可以实例化您自己的 Random 实例以获取不共享状态的生成器。

因此,您可以使用自己的种子创建自己的random.Random实例,这根本不会影响全局函数:

>>> import random
>>> x = [1, 2, 3, 4, 5, 6]
>>> random.Random(4).shuffle(x)
>>> x
[4, 6, 5, 1, 3, 2]
>>> x = [1, 2, 3, 4, 5, 6]
>>> random.Random(4).shuffle(x)
>>> x
[4, 6, 5, 1, 3, 2]

(您也可以保留Random实例并重新seed创建它,而不是一遍又一遍地创建新实例;没有太大区别。)

于 2013-10-10T22:30:05.200 回答
36

您可以设置随机生成器的seed(接受parameter),这将确定您的洗牌方法

import random
x = [1, 2, 3, 4, 5, 6]
random.seed(4)
random.shuffle(x)
print x

结果应该总是

[2, 3, 6, 4, 5, 1]

为了“重新随机化”其余代码,您可以简单地通过运行以系统时间重新设置随机数生成器

random.seed()

在代码的“确定性”部分之后

于 2013-10-10T22:03:03.973 回答
10

使用固定值的洗牌效果random不好!例子:

from random import shuffle
v = sum([[k] * 100 for k in range(10)], [])
print v[:40]
shuffle(v, random = lambda: 0.7)
print v[:40]

给出输出:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 8, 0, 0, 9, 0, 0, 0, 9, 0, 0, 8, 0, 0, 7, 0, 0, 0, 9, 0, 0, 7, 0, 0, 8, 0, 0, 0, 7, 0, 0, 7, 0, 0, 8, 0, 0, 0, 9]

其他种子也是类似的——不是很随机(反正乍一看……很难证明)。这是因为random它不是种子——它被重复使用了很多次。示范:

def rand_tracker():
    rand_tracker.count += 1
    return random()
rand_tracker.count = 0
shuffle(v, random = rand_tracker)
print 'Random function was called %d times for length %d list.' % (rand_tracker.count, len(v))

这表明:

Random function was called 999 times for length 1000 list.

你应该做的是@abarnert 的建议:

from random import Random
Random(4).shuffle(x)

在这种情况下,固定值是完全可以的。

TLDR:使用@abarnert 的答案,不要使用固定值函数random

于 2015-04-16T19:16:57.163 回答
-2

从python参考

可选参数 random 是一个 0 参数函数,返回 [0.0, 1.0) 中的随机浮点数;默认情况下,这是函数 random()

您可以使用始终返回与种子相同的值的 lambda 函数shuffle

In [7]: l = [1,2,3,4]
In [8]: random.shuffle(l, lambda: .5)

In [9]: l
Out[9]: [1, 4, 2, 3]

In [10]: l = [1,2,3,4]

In [11]: random.shuffle(l, lambda: .5)

In [12]: l
Out[12]: [1, 4, 2, 3]  # same order as Out[9]
于 2013-10-10T22:03:37.413 回答