我想创建数字 [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/