我如何实现一个random.choice()函数,它返回可重现的结果?

时间:2011-08-29 06:36:57

标签: python python-2.7

我想将一个固定的种子(字符串)传递给一个函数,然后让它从列表中随机选择一个项目。但是,如果使用相同的种子,它应该是同一列表中的相同项目!显然这根本不是随机的,但它应该或多或少看起来是随机的并且是平均分布的。它一定也很快。

为了证明,这是随机的方式。

>>> random.seed('Python')
>>> random.choice([1,2,3,4,5,6,7,8,9,0])
3
>>> random.choice([1,2,3,4,5,6,7,8,9,0])
6
>>> random.choice([1,2,3,4,5,6,7,8,9,0])
2

我想要的是这个。

>>> notrandom([1,2,3,4,5,6,7,8,9,0],seed='Python')
4
>>> notrandom([1,2,3,4,5,6,7,8,9,0],seed='Python')
4
>>> notrandom([1,2,3,4,5,6,7,8,9,0],seed='Python')
4

如果相同的列表与相同的种子字符串一起使用,则只需要可重现。

2 个答案:

答案 0 :(得分:3)

the Python doc for random,我认为这就是你要找的东西:

  

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

像,

> r = random.Random()

> r.seed('Hi')
> r.random()
0.3787897089299177

> r.seed('Hi')
> r.random()
0.3787897089299177

答案 1 :(得分:0)

第一次,从列表中选择一个随机数,然后对种子进行散列并将该对保存在数组中。

之后,哈希种子并将其用作数组中的键。

这显然是一个糟糕的解决方案,但我认为它可以解决这个问题。

编辑:刚看到它也是同一个输入列表。因此,哈希列表并保存该哈希值。