Python随机序列生成及种子设定

22
我正在进行一项学校项目(所以我不能使用任何高级特性),并且使用的是Python 2.6.6。
我有一个从1到1000的数字列表,我的种子将是448。
如何使用该种子生成一个随机序列,以使列表中的数字位于不同的索引?
如果知道种子,是否可以将列表中的元素返回到初始位置?
抱歉,如果我的问题令人困惑,但英语不是我的母语。
谢谢。

1
http://docs.python.org/release/2.6.6/library/random.html会告诉你所有需要了解的内容。 - Rafe Kettler
@Rafe 我之前看过这个,但是没看懂。 - Favolas
我真的希望448只是一个非常小的数字。对于您的输入,有factorial(1000)种排序选项,因此为了获得适当的伪随机数,您需要这个数量级的种子。 - lkanab
2个回答

51
import random
SEED = 448

myList = [ 'list', 'elements', 'go', 'here' ]
random.seed(SEED)
random.shuffle(myList)

print myList

导致

['here', 'go', 'list', 'elements']

您的列表现在已经伪随机化。

'伪'是很重要的,因为所有具有相同种子和项目数的列表将以相同的“随机”顺序返回。我们可以利用这一点来取消打乱您的列表;如果它是真正的随机,那么这将是不可能的。

Order = list(range(len(myList)))
# Order is a list having the same number of items as myList,
# where each position's value equals its index

random.seed(SEED)
random.shuffle(Order)
# Order is now shuffled in the same order as myList;
# so each position's value equals its original index

originalList = [0]*len(myList)   # empty list, but the right length
for index,originalIndex in enumerate(Order):
    originalList[originalIndex] = myList[index]
    # copy each item back to its original index

print originalList

导致结果

['list', 'elements', 'go', 'here']

太棒了!originalList现在是myList的原始顺序。


晚了点,但这是一个很棒的答案。伪随机性的运用很酷! - Peter Dolan
1
如果它创建一个本地的random.Random实例来进行种子生成,而不是使用默认的实例,那就更棒了。这个答案让我搜索如何以线程安全的方式实现它。 - nurettin

3

在Python文档中简单查找http://docs.python.org/library/random.html,可以了解以下内容:

random.seed([x])

你可以使用它来初始化种子。

要再次按照初始顺序获取项目,请重新设置种子并再次获取随机数。然后,您可以使用此索引获取列表中的内容,或者仅仅将索引用于其他任何事情。

只需对列表进行排序,它就会再次按照排序顺序排列。


我曾经读过这个,但是没有理解。我已经使用了random.seed(448),但是它没有给我任何东西。如何在我的列表中使用它? - Favolas
你可以使用seed函数设置随机数生成器的种子。然后在同一模块中调用另一个方法来获取下一个随机数。 - Kissaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接