【发布时间】: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