我需要一些好的伪随机数生成器,它可以像以前的输出中的纯函数一样计算,而不会隐藏任何状态。在“好”下我的意思是:
我必须能够以这样的方式对生成器进行参数化:使用任何参数(或其中一些大的子集)运行2^n
次迭代时,应覆盖{{1}之间的所有或几乎所有值}和0
,其中2^n - 1
是输出值中的位数。
n
位的组合发生器输出必须涵盖n + p
和0
之间的所有或几乎所有值,如果我针对每种可能的组合运行2^(n + p) - 1
次迭代其参数,2^n
是参数中的位数。
例如,LCG可以像纯函数一样计算,它可以满足第一个条件,但不能满足第二个条件。比方说,我们有32位LCG,p
并且它是常数,我们的m = 2^32
(两个32位参数p = 64
和a
),c
,所以我们必须从输出中查看三个数据以满足第二个条件。不幸的是,由于输出中奇数和偶数整数的严格交替顺序,条件不能满足。为了克服这个问题,必须引入隐藏状态,但这会使函数变得不纯净并破坏第一个条件(长隐藏期)。
编辑:严格来说,我希望函数族由n + p = 96
位参数化并具有完整状态p
位,每个都生成所有可能的二进制字符串{{1以独特的“随机”方式的位,而不仅仅是连续递增n
- 位int。选择这种独特方式所需的参数化。
我想要太多了吗?
答案 0 :(得分:2)
您可以使用任何分组密码和固定密钥。要生成下一个号码,请解密当前号码,增加它并重新加密。因为分组密码是1:1,所以它们必须在重复之前迭代输出域中的每个数字。
答案 1 :(得分:1)
尝试LFSR
您只需要原始多项式列表
以这种方式生成有限域的周期,生成大小为2 ^ n-1的字段。但是你可以推广这个过程来生成k ^ n-1的任何白色周期。
我还没有看到这个实现,但你要实现的只是将数字换成小数s> n其中gcd(s,2 ^ n-1)== 1. gcd代表最大公约数