【发布时间】:2011-02-21 18:18:32
【问题描述】:
我需要一些好的伪随机数生成器,它可以像纯函数一样从其先前的输出中计算出来,而不会隐藏任何状态。在“好”下,我的意思是:
我必须能够以这样的方式参数化生成器,以便在
2^n迭代中使用任何参数(或它们的一些大子集)运行它应该涵盖0和 @987654324 之间的所有或几乎所有值@,其中n是输出值的位数。n + p位的组合生成器输出必须覆盖0和2^(n + p) - 1之间的所有或几乎所有值,如果我针对其参数的每个可能组合运行2^n迭代,其中p是参数中的位数。
例如,LCG 可以像纯函数一样计算,它可以满足第一个条件,但不能满足第二个条件。假设我们有 32 位 LCG,m = 2^32,它是恒定的,我们的 p = 64(两个 32 位参数 a 和 c),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,因为您可以预测整个序列!