python使用参数进行洗牌以获得相同的resu

2024-04-25 23:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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]


Tags: import列表参数parameterrandomprintshuffle
3条回答

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

在你的“确定性”代码之后

正如the documentation所解释的:

The functions supplied by this module are actually bound methods of a hidden instance of the random.Random class. You can instantiate your own instances of Random to get generators that don’t share state.

因此,您只需创建自己的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实例,而不是一遍又一遍地创建新的实例;没有太大的区别。)

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

相关问题 更多 >