字典键的顺序可以被认为是随机排列吗?

Can the order of the keys of a dictionary being considered a random permutation?

我有 40.000 个 ID,它们是字典中的键。我需要将它们洗牌,例如 random.shuffle。但是我可以跳过这一步吗?

Dictionary 不按键的出现顺序存储键,因此如果我这样做 keys = dict.keys(),则 keys 包含非升序的键。我的程序只会 运行 一次,所以我不关心 "result of the permutation" 在执行中是否相同。

那么,我可以 "cheat" 并跳过随机播放步骤吗?


我知道键的顺序有点可预测。不过我要问的是:

random.shuffle() 生成的排列与键的顺序(大致)相同的可能性(粗略地说)是多少?

不,你不能。

如果需要随机性,则不能在将数据输入字典之前或之后跳过改组。

原因是虽然不能保证字典中键的顺序,但是根据条目的顺序,它们将采用的顺序具有很强的可预测性。

字典中的条目是根据键的 hash 的值完成的,该值是一个非常大的数字,对另一个大数字取模,创建一个有界的值范围。当两个键散列为相同的值时,会出现 collision;然后将密钥放置在下一个可用位置(无论哪种方式确定)

[编辑]:
以与哈希桶大致(非常)相同的顺序随机获取密钥的机会是......不确定。

详细说明其他人在说什么以及为什么您实际上需要洗牌。如果您以相同的方式重复初始化您的字典,它每次都会有相同的顺序。这显然不是随机的。正如 Masque 所说,它是基于哈希的(参见这个 SO 问题 Why is the order in dictionaries and sets arbitrary?)。

直接回答"What is the chance (roughly speaking) of a permutation generated by random.shuffle() to be (much) identical to the order of the keys?":它完全与随机播放相同的几率是1/factorial(len(yourDict));那是因为其中一个排列将导致与您的字典在初始化时相同的排序。但是,所有其他排序都会有所不同,并且有 factorial(len(yourDict)) 不同的排列(排序)可能由洗牌产生。

希望对您有所帮助!