【问题标题】:Is there "good" PRNG generating values without hidden state?是否存在没有隐藏状态的“好”PRNG 生成值?
【发布时间】:2011-02-21 18:18:32
【问题描述】:

我需要一些好的伪随机数生成器,它可以像纯函数一样从其先前的输出中计算出来,而不会隐藏任何状态。在“好”下,我的意思是:

  1. 我必须能够以这样的方式参数化生成器,以便在 2^n 迭代中使用任何参数(或它们的一些大子集)运行它应该涵盖 0 和 @987654324 之间的所有或几乎所有值@,其中n是输出值的位数。

  2. n + p 位的组合生成器输出必须覆盖02^(n + p) - 1 之间的所有或几乎所有值,如果我针对其参数的每个可能组合运行2^n 迭代,其中p是参数中的位数。

例如,LCG 可以像纯函数一样计算,它可以满足第一个条件,但不能满足第二个条件。假设我们有 32 位 LCG,m = 2^32,它是恒定的,我们的 p = 64(两个 32 位参数 ac),n + p = 96,所以我们必须从输出中查看三个整数的数据满足第二个条件。不幸的是,由于输出中奇偶整数的严格交替序列,无法满足条件。为了克服这个问题,必须引入隐藏状态,但这会使函数不纯并打破第一个条件(长隐藏期)。

编辑: 严格来说,我想要由p 位参数化并具有n 位的完整状态的函数系列,每个函数都生成所有可能的p + n 位二进制字符串在唯一的“随机”的方式,而不仅仅是不断增加(p + n)-bit int。选择该独特方式所需的参数化。

是不是我想要的太多了?

【问题讨论】:

  • 如果您期望 k 个调用中有 k 个不同的数字,那么它根本不是随机的。例如我总能预测到最后一个!还是我误会了?
  • 祝你好运。顺便说一句,“好”的 PRNG 足够随机,没有这个属性。
  • @Moron,任何 PRNG 都是无限的重复序列,只是因为它的状态具有有限的大小。如果您有 K 位状态,则该重复序列的周期不能长于 2^K。你认为好的 PRNG 只是向你展示了一些真正的隐藏状态。你不能凭空产生信息。
  • @Moron,好吧,如果你有 8 位的状态,你最多可以生成 256 个不同的值,并且你的 PRNG 的周期不能超过 256。此时你必须决定你想要什么, 在这 256 个值的期间产生 256 个不同的值,或者牺牲其中的一个或多个来完成生日悖论。在第二种情况下,您的“好”PRNG 将永远不会生成一些数字,例如 13,这将是幸运的 PRNG。
  • 为什么 PRNG 甚至应该有一个“句号”?可能值的所有有限性表明,一旦生成 257 个数字,就必然会有重复。如果 PRNG 有一个句点,那么它不是一个“好”的 PRNG,因为您可以预测整个序列!

标签: algorithm prng bijection


【解决方案1】:

您可以使用任何具有固定密钥的分组密码。要生成下一个数字,请解密当前数字,将其递增,然后重新加密。因为分组密码是 1:1,所以它们必须在重复之前遍历输出域中的每个数字。

【讨论】:

  • 有趣的想法,但对我的应用程序来说太慢了。无论如何,谢谢。
  • 嗯...也许没那么慢。如果我将生成宽度为 p 而不是 n + p 的密钥,并开始与 n + p 宽度的数据进行异或运算,您认为它将如何工作。它会生成所有 n + p 宽度的组合吗?
  • 取决于您从哪里获取数据。从广义上讲,这可能不会产生排列。
【解决方案2】:

试试LFSR
您所需要的只是原始多项式列表。
以这种方式生成有限域的周期,生成大小为 2^n-1 的域。但是您可以推广此过程以生成任何带有 k^n-1 周期的内容。

我还没有看到这个实现,但你所要做的就是将数字移动小数 s>n 其中 gcd(s,2^n-1) == 1。gcd 代表最大公约数

【讨论】:

  • 据我了解,组合值的子集包含无法生成的零。
  • 确实如此。如果需要,您应该手动添加对零的支持,然后从预定义的值(例如 0x001 跳转到 0x000,然后返回到下一个值 0x001)。
猜你喜欢
  • 2012-12-16
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2018-12-02
相关资源
最近更新 更多