Algorithm “有没有?”;“好”;PRNG生成没有隐藏状态的值?
我需要一些好的伪随机数生成器,它可以像纯函数一样从以前的输出中计算出来,而不需要任何状态隐藏。“好”是指:Algorithm “有没有?”;“好”;PRNG生成没有隐藏状态的值?,algorithm,prng,bijection,Algorithm,Prng,Bijection,我需要一些好的伪随机数生成器,它可以像纯函数一样从以前的输出中计算出来,而不需要任何状态隐藏。“好”是指: 我必须能够以这样的方式对生成器进行参数化,即使用任何参数(或其中的一些较大子集)运行2^n迭代时,应该覆盖0和2^n-1之间的所有或几乎所有值,其中n是输出值中的位数 如果对其参数的每个可能组合运行2^n迭代,则n+p位的组合生成器输出必须覆盖0和2^(n+p)-1之间的所有或几乎所有值,其中p是参数中的位数 例如,可以像纯函数一样计算,它可以满足第一个条件,但不能满足第二个条件。比如说,
2^n
迭代时,应该覆盖0
和2^n-1
之间的所有或几乎所有值,其中n
是输出值中的位数2^n
迭代,则n+p
位的组合生成器输出必须覆盖0
和2^(n+p)-1
之间的所有或几乎所有值,其中p
是参数中的位数m=2^32
,它是常数,我们的p=64
(两个32位参数a
和c
),n+p=96
,所以我们必须从输出中以三个整数窥视数据,以满足第二个条件。不幸的是,由于输出中奇偶整数的严格交替序列,该条件不能满足。为了克服这一点,必须引入隐藏状态,但这会使函数不纯净,并打破第一个条件(长隐藏周期)
编辑:严格来说,我希望函数族由p
位参数化,并具有n
位的完整状态,每个函数以独特的“随机”方式生成p+n
位的所有可能二进制字符串,而不仅仅是连续递增(p+n)
-选择该唯一方式所需的位int.参数化
我想要的太多了吗?试试看您所需要的只是原始多项式列表。
以这种方式生成有限域的周期,生成大小为2^n-1的域。但是你可以把这个过程推广到生成任何周期为k^n-1的东西
我还没有看到这个实现,但是您所要实现的就是通过小的数字s>n来移动数字,其中gcd(s,2^n-1)==1。gcd代表最大公约数您可以使用任何具有固定密钥的分组密码。要生成下一个数字,请对当前数字进行解密、递增并重新加密。因为分组密码是1:1,所以在重复之前,它们必须遍历输出域中的每个数字。如果在k个调用中需要k个不同的数字,那么这根本不是随机的。例如,我总能预测最后一个!还是我误解了?祝你好运找到他们。”好的“PRNG”是随机的,没有这个属性,顺便说一句@Moron,任何PRNG都是无止境的重复序列,只是因为它的状态有有限的大小。如果你有K位的状态,重复序列的周期不能超过2^K。你认为PRNG是好的,只需显示几个真正隐藏状态的位。您不能从无到有地生成信息。@笨蛋,好吧,如果您的状态为8位,您最多可以生成256个不同的值,并且PRNG的周期不能超过256。在这一点上,你必须决定你想要什么,在这256个值的周期内生成256个不同的值,或者牺牲其中的一个或多个来实现生日悖论。在第二种情况下,你的“好”PRNG将永远不会生成一些数字,例如13,这将是幸运的PRNG。为什么PRNG甚至应该有一个“周期”?所有可能值的有限性表明,一旦生成257个数字,就必然会有重复的数字。如果PRNG有一个周期,那么它不是一个“好”PRNG,因为您可以预测整个序列!这个想法很有趣,但对我的应用程序来说太慢了。不管怎样,谢谢。嗯。。。也许没那么慢。如果我将生成宽度为p的键,而不是n+p,并开始用n+p宽度的数据进行XORing,您认为它将如何工作。它会生成n+p宽度的所有组合吗?取决于您从何处获得数据。广义地说,这可能不会生成置换。据我所知,组合值中有一个子集包含无法生成的零。这是真的。如果需要,您应该手动添加对零的支持,并从预定义值(例如0x001)跳到0x000,然后再跳回到下一个值0x001。