【问题标题】:Algorithm to generate pseudorandom numbers serie, reproducible knowing initial seed生成伪随机数系列的算法,可重现的已知初始种子
【发布时间】:2011-05-03 14:56:50
【问题描述】:

我必须编写一个轻量级算法来生成伪随机无限数序列,并强烈依赖于初始种子。

在python中应该是这样的

seed = 3345                 // Common number
generator = numgen(seed)
while True:
    generator.getNext()     // With the same seed it produce same numbers

正如我所写,即使在不同的机器和不同的时间,使用相同的种子它也必须产生相同的数字系列。是否有一个标准模式或者我必须实现自己的算法?

【问题讨论】:

  • 还有要求吗?否则,我建议itertools.count...
  • 如果你的无限序列不必是随机的,为什么不使用像 +1 这样简单的愚蠢的东西呢? (如果种子是 5,那么系列是 5、6、7,...) - 或任何其他简单的算术函数?
  • 一般def numgen(x): yield x 是无限的,非随机的,强烈依赖于种子,并且总是以相同的方式工作。另外,将next 与生成器一起使用(没有getNext
  • @Elad:我声称找到了最愚蠢的一个:)
  • @dancek:这只会产生一次种子然后提高StopIteration

标签: python algorithm numbers generator series


【解决方案1】:

有了给定的要求,你可以去常数系列

generator = itertools.repeat(seed)

这是

  • 轻量级
  • 不一定是随机的
  • 强烈依赖于初始种子
  • 即使在不同的机器上也能生产相同的系列

编辑:为了让这成为一个实际的答案,这里是如何使用 Python 的 Mersenne Twister 生成一系列随机数:

seed = 3345
maximum = 1000000
generator = random.Random(seed)
while True:
    print generator.random(maximum)

创建您自己的random.Random 实例可确保不会从其他地方调用随机数生成器干扰您的随机状态。

【讨论】:

  • 重复相同的数字是不够的。我需要在数字生成中进行某种变化。
  • @Emilio:这个答案和所有 cmets 的要点是您需要指定您的具体要求。例如,您可以告诉我们您需要该系列的用途。如果唯一的附加要求是“不恒定”,那么只需从种子开始计数。如果这又不是您想要的,请说明您需要什么。
  • 感谢您的建议 =)
  • +1 用于解释 random.Random 实例。官方文档并没有很好地涵盖这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2012-11-26
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多