【问题标题】:Random numbers algorithm随机数算法
【发布时间】:2015-08-05 05:25:38
【问题描述】:

我需要按组生成随机数:100、500、1000 和 10000 个数字制服和高斯。这是创建一些直方图和其他统计数据所必需的。

条件是不使用python自带的随机函数,所以想用这个方法(线性同余生成器):Xn+1 ≡ (aXn + c) mod m。这里我需要 4 个变量。 有人可以告诉我如何实现这个算法吗?我假设 m 变量第一次是 100

【问题讨论】:

  • 我怀疑你会找到一个很好的 m=100 的线性同余生成器。您应该查看具有更大 m 的生成器。更好的是,如果你有时间,可以使用 Mersenne Twister。然后使用其他技术将最终结果获得到您想要的统一范围内,或者将生成器的输出转换为高斯(这里有各种关于类似主题的先前问题,因此请查找它们)。
  • 我试过这个:n=1 c=3 x=0 m=100 for i in range(100): x = (a*x+c) % m
  • 非常感谢大卫,我去看看
  • @DavidK python 的原生 PRNG 是 Mersenne Twister。
  • @pjs 很高兴知道这一点。了解为什么不使用本机函数的条件可能是相关的。如果是“我希望你有实现随机数生成器的经验,而不仅仅是调用random.randint()”,那么任何好的 RNG 都应该是公平的游戏。如果是“我想让你实现一个不是 Mersenne Twister 的 RNG,以便我们可以比较这两种算法”,那么当然不能使用 MT。

标签: python algorithm random


【解决方案1】:

你已经知道这是Linear congruential generator,那么有什么难读的呢?

它告诉你你已经知道的公式 以及你应该如何选择它们的解释:

一般 LCG 的周期最多为 m,对于某些选择 因子 a 远低于此。假设偏移量 c 非零, 当且仅当:

1) c 和 m 互质

2) a - 1 能被 m 的所有素因数整除

3) 如果 m 是 4 的倍数,a - 1 是 4 的倍数。

他们甚至在下表中为您提供了这些值的一些示例。这足以实现一个简单的功能:

def LCG(seed, n, a=1664525, c=1013904223, m=2**32):
    numbers = []
    for i in xrange(n):
        seed = (a * seed + c) % m
        numbers.append(seed)

    return numbers

print LCG(3, 5)

【讨论】:

  • 非常感谢萨尔瓦多,我真的很感激它
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2012-01-05
  • 2013-08-21
相关资源
最近更新 更多