【发布时间】:2016-03-12 09:23:49
【问题描述】:
我有一个包含大约 3900 个元素的列表,我需要随机排列这些元素以生成统计分布。我环顾四周,发现这个Maximal Length of List to Shuffle with Python random.shuffle 解释了Python 中PRNG 的周期是2**19937-1,这导致了一个最大长度为2080 的列表,然后就不可能生成所有可能的排列。我只产生列表的 300-1000 个排列,因此我不太可能产生重复的排列,但是,因为这产生了一个统计分布,我希望将所有可能的排列作为潜在样本。
【问题讨论】:
-
您想生成 3900 个元素的所有可能排列?
-
你考虑过使用
os.urandom吗? urandom 适合加密,所以我认为它应该适用于你正在做的任何事情。 -
出于统计目的——事实上,基本上任何目的——对可能排列的限制是没有问题的。如果您担心这一点,那么您需要担心的与理想分布的偏差要大得多。
-
作为一个需要担心的“更大的偏差”的例子,in Python 2,
random.sample-ingxrange(1, sys.maxsize)always returns a number congruent to 1 mod2**10. 另外,对于建议加密 PRNG 的人,即使是 那些 也没有时间产生所有可能的排列,甚至密码学家仍然不在乎。 -
@m69 不,它只会给你一组不同的 2^19937。如果您第二次使用不同的 PRNG 置换,最好添加它们的句点(如果它们之间没有交互)。