【问题标题】:Python: Generating a big uniform permutation cheaplyPython:廉价地生成一个大的统一排列
【发布时间】:2014-03-25 11:19:55
【问题描述】:

我不确定这在理论上是否可行;但如果是的话,我想知道如何在 Python 中做到这一点。

我想廉价地生成一个大的随机排列。例如,假设我想要对range(10**9) 进行排列。我希望排列是统一的(即,我希望数字遍布各处,没有任何看似结构。)我希望有一个函数可用于获取每个 n 的排列中的第 n 个项目,并且我想有另一个函数可用于获取排列中每个数字的索引。

最大的最终条件是:我想做所有这些,而不必存储排列的所有项目。 (这可能是一个巨大的空间。)我希望每个项目都可以访问,但我不想存储所有项目,例如 Python 3 中的range

这可能吗?

【问题讨论】:

  • 我想了解更多有关该应用程序的信息。究竟是什么阻止了你在一个范围内使用随机整数?
  • 就排列而言,我认为这样做的希望不大。只需存储 10**9 中的 which!您选择的排列需要超过 10 GiB,通过 ln n! 近似 en.wikipedia.org/wiki/… - 再加上没有可行的 PRNG 有足够长的时间来生成这些排列的可观部分,这意味着你将不得不满足于排列的一个微小的、规则的子集。另一方面,如果您只想要来自range(10**9) 的一些(唯一?)数字...
  • 线性反馈移位寄存器可以有一个非常大的周期,并且它们以看似随机的顺序生成每个数字一次。
  • 现在我想一想,像 AES 这样的分组密码不完全符合这个要求吗?

标签: python permutation combinatorics


【解决方案1】:

我可以看到这种情况发生并部分满足您的要求的唯一方法是,如果排列不是随机的,而是看起来是随机的,并且实际上是一个序列,如果您知道 a_n-1,您可以从中生成 a_n。

看看这个:http://en.wikipedia.org/wiki/Linear_feedback_shift_register 你想要的是一个最大长度的 LSFR。它将以看似随机的顺序生成一次 0 到 2**n-1 的所有数字。对于不同的 n,您需要使用不同的功能。

我认为你不能有函数 getIdxOf(val) 和 getValOf(Idx) 但是,除非你一个一个地遍历生成函数。

【讨论】:

    【解决方案2】:

    我相信像 AES 这样的分组密码正好提供了这种功能。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 2011-09-23
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多