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

Co *_*der 41 python

import random
x = [1, 2, 3, 4, 5, 6]
random.shuffle(x)
print x
Run Code Online (Sandbox Code Playgroud)

我知道如何改变一个列表,但是有可能用一个参数对其进行洗牌,这样每次洗牌都会产生相同的结果吗?

就像是;

random.shuffle(x,parameter)
Run Code Online (Sandbox Code Playgroud)

并且该参数的结果相同.说参数是4,结果是[4, 2, 1, 6, 3, 5]每次.

aba*_*ert 90

正如文档所述:

该模块提供的函数实际上是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]
Run Code Online (Sandbox Code Playgroud)

(你也可以保留Random实例,seed而不是一遍又一遍地创建新的实例;没有太大的区别.)

  • 这实际上应该是正确的答案. (7认同)
  • 不错的解决方案!+1 表示不影响全局功能 (3认同)

lej*_*lot 20

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

import random
x = [1, 2, 3, 4, 5, 6]
random.seed(4)
random.shuffle(x)
print x
Run Code Online (Sandbox Code Playgroud)

结果应该是永远的

[2, 3, 6, 4, 5, 1]
Run Code Online (Sandbox Code Playgroud)

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

random.seed()
Run Code Online (Sandbox Code Playgroud)

在你的"确定性"部分代码之后

  • 请注意,这会污染"随机"模块中每个函数的结果,以用于程序的其余部分.将第二个参数传递给`shuffle`只会影响一个调用. (5认同)

Mar*_*ark 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]
Run Code Online (Sandbox Code Playgroud)

给出输出:

[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]
Run Code Online (Sandbox Code Playgroud)

它与其他种子相似 - 不是很随意(乍一看......无法证明).这是因为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))
Run Code Online (Sandbox Code Playgroud)

这表现了:

Random function was called 999 times for length 1000 list.
Run Code Online (Sandbox Code Playgroud)

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

from random import Random
Random(4).shuffle(x)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,固定值是完全正常的.

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