【问题标题】:Generate a random vector from a linear congruential RNG从线性同余 RNG 生成随机向量
【发布时间】:2013-08-01 21:06:06
【问题描述】:

如果我有一个线性同余生成器,这样每次给定一个特定的种子,我就可以准确地知道我们可以生成一个固定的伪随机数序列,这些序列已知均匀分布在 [1, K] 之间,应该如何我用这样一个RNG生成一个M维随机向量,它均匀分布在[1,K^M]之间?

【问题讨论】:

  • 随机向量均匀分布在 [1,K^M] 之间是什么意思?你的意思是每个条目在 [1,K] 中应该是统一的,并且转换为数字时的向量应该是统一的?
  • @user2566092:没错,这就是我想要的。

标签: algorithm random


【解决方案1】:

如果您对除 M 维情况之外的所有 LCG 都满意,那么最基本的解决方案是为 M 个单独的生成器使用 M 个单独的种子。这至少可以确保给定向量的元素是独立的(在您的播种算法的限制内)。

但是,您可能真正想要的是一个状态至少为 M*log_2(K) 位的 PRNG,它可以保证向量的所有部分之间有一些混合。如果这超过 64 位,那么为此使用 LCG 似乎需要付出很多努力才能实现比许多更简单的解决方案更弱的东西。

如果 M 是常数并且不是不合理的大,那么您可能会查看 xorshift、multiply-with-carry 或 WELL。否则,您可能会坚持使用著名的大周期生成器或加密算法,而对理论限制视而不见。

【讨论】:

    【解决方案2】:

    我不知道你打算使用什么编程语言或者K和M的范围是多少,但是如果K是2的幂,你可以简单地附加M个伪随机数的二进制表示得到一个伪随机数均匀分布在 [1, K^M] 上。如果 K 不是 2 的幂,您可以使用某种分区函数或重新滚动某些值来构造 [1, K^M] 分布数字的位。

    【讨论】:

    • 问题是,如果它是一个线性同余生成器,我们知道 (seed, current number) 可以确定下一个伪随机数是什么,这样我们就无法生成 a数均匀分布在 [1, K^M] 上,对吧?
    • 是的,LCG 的序列相关性存在问题。 sh1 的回答探讨了一些替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多