【问题标题】:Randomly iterate through sequence of integers, 1 to n [duplicate]随机迭代整数序列,1到n [重复]
【发布时间】:2015-07-15 17:53:46
【问题描述】:

我有一个整数范围想要遍历。您可以假设序列以1 开头并以n 结尾,其中n > 1。但是,我不想按顺序遍历它们。目标是以随机方式遍历所有这些。此外,n 可能非常大,可能有数万亿,所以我无法将范围存储在内存中。有没有办法做到这一点?

我知道有一种方法可以使用已经在内存中的数组来执行此操作。当您不能一次存储整个范围时,可以做类似的事情吗?

【问题讨论】:

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

标签: random integer sequence


【解决方案1】:

您可以使用Format-Preserving Encryption 来加密计数器。

选择一个对称密码,用于加密最多为 N 的数字。(您可以使用建议的AES-FFX 方案)然后生成具有高熵的随机密钥并开始加密数字 0、1、2, ……向上。由于加密确保了 1:1 映射并且良好的加密看起来是随机的,因此您最终会得到一个仅使用 O(1) 存储的非重复随机数序列。

counter mode (CTR) 中使用分组密码是创建cryptographically secure pseudo-random number generator (CSPRNG) 的众所周知的技术。第 10.2.1 节。的NIST SP 800-90A 提供了额外的提示。 由于随机性的质量does not show any statistical weaknesses,建议使用 AES 作为底层分组密码进行随机模拟。

这个想法绝不是新的,Craig McQueen 已经在 stackoverflow 上多次提出:

crypto.stackexchange 也有几个关于此的线程:

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2013-09-30
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多