Random 随机迭代整数序列,从1到n

Random 随机迭代整数序列,从1到n,random,integer,sequence,Random,Integer,Sequence,我有一系列的整数需要迭代。您可以假设序列以1开始,以n结束,其中n>1。但是,我不想按顺序遍历它们。目标是以随机的方式遍历所有这些对象。此外,n可能非常大,以万亿计,因此我无法将范围存储在内存中。有办法做到这一点吗 我知道有一种方法可以通过已经在内存中的数组来实现这一点。当您不能同时存储整个范围时,是否可以执行类似操作?您可以使用加密计数器 选择一个精心设计的对称密码来加密N以下的数字。您可以使用建议的方案,然后生成一个具有高熵的随机密钥,并开始加密数字0、1、2。。。向上。由于加密确保了1:1

我有一系列的整数需要迭代。您可以假设序列以1开始,以n结束,其中n>1。但是,我不想按顺序遍历它们。目标是以随机的方式遍历所有这些对象。此外,n可能非常大,以万亿计,因此我无法将范围存储在内存中。有办法做到这一点吗

我知道有一种方法可以通过已经在内存中的数组来实现这一点。当您不能同时存储整个范围时,是否可以执行类似操作?

您可以使用加密计数器

选择一个精心设计的对称密码来加密N以下的数字。您可以使用建议的方案,然后生成一个具有高熵的随机密钥,并开始加密数字0、1、2。。。向上。由于加密确保了1:1的映射,并且良好的加密看起来是随机的,因此您将只使用O1存储来获得一系列不重复的随机数

在中使用分组密码是创建密码的一种众所周知的技术。第10.2.1节。of提供了额外的提示。 由于随机性的质量,建议使用AES作为随机模拟的基础分组密码

这一想法绝非新鲜事物,已经由以下人员在stackoverflow上多次提出:

此外,crypto.stackexchange对此也有多个线程:


你在找算法吗?。。。特定语言。。。你这里所说的“随机”是什么意思?你需要任何特定的统计特性吗?或者只是将它们全部混合起来?如果您不存储整个数组,您仍然需要至少存储您已经输出的那些数组,这最终将相当于存储整个数组。除非你不介意使用同一个数字两次,否则你只是在寻找一个随机数生成器。例如,一种方法是对n的位进行随机重新排序,然后在原图中以通常的方式计算二进制数。但是,如果你依赖这种随机性来保证安全性,你就不会这么做。实际上,你只需要为每个数字存储一位。。。。因此,如果范围为100万,则只需要125kB来表示缓冲区。