使用参数进行python shuffling以获得相同的结果

时间:2013-10-10 21:59:49

标签: python

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

我知道如何对列表进行混洗,但是是否可以使用一个参数对其进行混洗,以使每次洗牌产生相同的结果?

喜欢的东西;

random.shuffle(x,parameter)

,此参数的结果相同。 Say参数为4,每次结果为[4, 2, 1, 6, 3, 5]

4 个答案:

答案 0 :(得分:70)

正如the documentation所解释的那样:

  

此模块提供的函数实际上是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,而不是一遍又一遍地创建新的实例;没有太多区别。)

答案 1 :(得分:16)

您可以设置随机生成器的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()

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

答案 2 :(得分:9)

使用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使用固定值函数!

答案 3 :(得分:-2)

来自python reference

  

可选参数random是一个返回a的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]