【问题标题】:How would I implement a random.choice() like function which returns reproducible results?我将如何实现一个 random.choice() 之类的函数来返回可重现的结果?
【发布时间】:2011-08-29 06:36:56
【问题描述】:

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

为了演示,这就是随机的工作原理。

>>> 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

仅当相同的列表与相同的种子字符串一起使用时,它才需要是可重现的。

【问题讨论】:

  • 只要您在每次选择之前重新播种 random 就可以使用,而您在这里没有这样做。
  • 4.通过公平的掷骰子选择。保证是随机的。

标签: python python-2.7


【解决方案1】:

来自the Python doc for random,我想这就是你要找的:

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

喜欢,

> r = random.Random()

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

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

【讨论】:

  • 这将导致为相同长度的不同列表选择相同的索引(如果您知道为给定种子的任何列表选择了哪个索引,则通常该索引对于所有列表都是可预测的)所以您如果您想为不同的列表选择不同的选择,则需要对种子做一些额外的事情。
【解决方案2】:

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

然后,散列种子并将其用作数组中的键。

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

编辑:刚刚看到它也适用于相同的输入列表。所以散列列表并保存该散列。

【讨论】:

    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多