非迭代随机数序列的简单公式是什么?

What is a simple formula for a non-iterative random number sequence?

我想要一个函数 f(x),它根据值 x 给出均匀分布的良好伪随机数。我知道线性同余生成器,但是这些生成器在迭代中工作,即我提供初始种子,然后我一个一个地获得一系列随机值。这不是我想要的,因为如果想得到序列中的第 200000 个数字,我必须计算数字 1 ... 199999。我需要一个由一个简单公式给出的函数,该公式使用基本操作,例如 + , *, mod, 等。我也知道散列函数,但我没有找到适合这些需要的函数。我可能会自己想出一些功能,但我想使用经过测试的功能来提供不错的伪随机值。有没有类似的东西被使用?

您可以考虑乘法同余生成器。这些是没有附加常数的线性同余:Xi+1 = aXi % c 对于合适的常数 a 和 c。将其展开几次迭代将使您确信 Xk = akX0 % c ,其中 X0 是您的种子值。这可以使用 fast modular exponentiation 在 O(log(k)) 时间内计算出来。无需计算第 199,999 次即可得到第 200,000th 个值,您可以按大约 18 步的比例找到它。

实际上,对于具有附加常数的LCG,它也可以工作。有一篇 F. Brown 的论文,"Random Number Generation with Arbitrary Stride",Trans。是。核素。社会。 (1994 年 11 月)。基于这篇论文,有一个合理的 LCG,具有不错的质量和 log2(N) 向前跳过的特性,被著名的 Monte Carlo 包 MCNP5 使用。 C++ post 在这里 https://github.com/Iwan-Zotow/LCG-PLE63/. Further development if this idea (RNG with logarithmic skip-ahead) is pretty decent family of generators at http://www.pcg-random.org/

您可以使用一种简单的加密算法来加密数字 1、2、3... 由于加密是可逆的,因此每个输入数字都会有一个唯一的输出。您序列中的第 200000 个数字是 encrypt(key, 200000)。将 DES 用于 64 位数字,将 AES 用于 128 位数字,您可以将自己的简单 Feistel cipher 用于 32 位或 16 位数字。