Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm “有没有?”;“好”;PRNG生成没有隐藏状态的值?_Algorithm_Prng_Bijection - Fatal编程技术网

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
    是参数中的位数

  • 例如,可以像纯函数一样计算,它可以满足第一个条件,但不能满足第二个条件。比如说,我们有32位LCG,
    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。