python - 生成巨大列表的随机排列(在 Python 中)

标签 python algorithm iterator permutation

我想创建数字 [1,2,...,N] 的随机排列,其中 N 是一个大数字。所以我不想将排列的所有元素存储在内存中,而是迭代我的特定排列的元素而不在内存中保留以前的值。

知道如何在 Python 中做到这一点吗?

最佳答案

一种可能性是使用加密。由于加密是可逆的,即一对一,对于给定的 key ,您将得到与加密相同但顺序不同的数字。

您需要一个 block 大小足以包含您的最大 N 的 block 密码。在 ECB 模式下使用 DES 来获得 N = 2^64 - 1。在 ECB 模式下使用 AES 来获得 N = 2^128 - 1。对于其他大小,要么使用 Hasty Pudding cipher ,具有可变 block 大小,或者编写您自己的简单 Feistel cipher .我假设您只需要一个随机播放,而不是一个加密安全的随机播放。

如果输出大于N,则重新加密直到小于N,一对一的特性保证了大数链也是唯一的。

不需要将整个数组存储在内存中,可以根据需要对每个数字进行加密。只需要 key 和密码算法。一个轻微的并发症是分组密码在 [0 ... N-1] 上工作;您可能需要一些额外的代码来处理极端情况。

关于python - 生成巨大列表的随机排列(在 Python 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30615536/

相关文章:

python - Pandas Dataframe.groupby() 用于相同值的不同组

Python:控制 "for loop"执行速度

algorithm - 计数排序的时间复杂度

c++ - 使用迭代器访问存储在 vector 中的类对象的方法。如何?

python - 从生成器创建迭代器返回相同的对象

python - gcloud ml-engine 本地预测 RuntimeError : Bad magic number in . pyc 文件

python - 从 __pycache__ 恢复

algorithm - 不相交集合数据结构

java - 回溯算法中的InputMismatchException

java - Iterator for Java Framework Collection 的不同结果