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

Python 字典键的顺序可以被认为是一种随机排列吗?,python,dictionary,key,shuffle,Python,Dictionary,Key,Shuffle,我有40000个ID,它们是字典中的键。例如,我需要将它们洗牌。但我能跳过这一步吗 字典不按键的出现顺序存储键,因此如果我按键的出现顺序存储键,则键的出现顺序为非升序。我的程序只运行一次,所以我不在乎执行中的“排列结果”是否相同 那么,我可以“作弊”并跳过洗牌步骤吗 我知道钥匙的顺序是可以预测的。我想问的是: 由random.shuffle()生成的排列(粗略地说)与键的顺序(非常)相同的几率是多少?不,你不能 如果需要随机性,则不能在将数据输入字典之前或之后跳过洗牌 原因是,尽管不能保证字典

我有40000个ID,它们是字典中的键。例如,我需要将它们洗牌。但我能跳过这一步吗

字典不按键的出现顺序存储键,因此如果我按键的出现顺序存储键,则键的出现顺序为非升序。我的程序只运行一次,所以我不在乎执行中的“排列结果”是否相同

那么,我可以“作弊”并跳过洗牌步骤吗


我知道钥匙的顺序是可以预测的。我想问的是:

random.shuffle()
生成的排列(粗略地说)与键的顺序(非常)相同的几率是多少?

不,你不能

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

原因是,尽管不能保证字典中键的顺序,但根据输入顺序,键的顺序具有很强的可预测性

字典中的条目是根据键的
散列
值来完成的,该值是一个非常大的数,将另一个大的数模化,从而创建一个有界的值范围。当两个键散列到相同的值时,会发生
冲突
;然后将钥匙放置在下一个可用位置(以确定的方式为准)

[编辑]:
随机获取密钥的顺序与散列桶大致相同的机会是。。。不确定。

不,你不能

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

原因是,尽管不能保证字典中键的顺序,但根据输入顺序,键的顺序具有很强的可预测性

字典中的条目是根据键的
散列
值来完成的,该值是一个非常大的数,将另一个大的数模化,从而创建一个有界的值范围。当两个键散列到相同的值时,会发生
冲突
;然后将钥匙放置在下一个可用位置(以确定的方式为准)

[编辑]:

随机获取密钥的顺序与散列桶大致相同的机会是。。。不确定。

详细说明其他人在说什么,以及为什么您需要洗牌。如果反复以相同的方式初始化词典,则每次的顺序都相同。这显然不是随机的。正如Masque所说,它是基于散列的(参见这个问题)

直接回答“random.shuffle()生成的排列与键的顺序(大致上)完全相同的几率是多少?”直接回答:与shuffle完全相同的几率是
1/阶乘(len(yourDict))
;这是因为其中一个排列将产生与dict在初始化时相同的顺序。不过,所有其他排序都会有所不同,而且洗牌可能会导致不同的排列(排序)。
factorial(len(yourDict))


希望有帮助

详细说明其他人在说什么,以及为什么你需要洗牌。如果反复以相同的方式初始化词典,则每次的顺序都相同。这显然不是随机的。正如Masque所说,它是基于散列的(参见这个问题)

直接回答“random.shuffle()生成的排列与键的顺序(大致上)完全相同的几率是多少?”直接回答:与shuffle完全相同的几率是
1/阶乘(len(yourDict))
;这是因为其中一个排列将产生与dict在初始化时相同的顺序。不过,所有其他排序都会有所不同,而且洗牌可能会导致不同的排列(排序)。
factorial(len(yourDict))


希望有帮助

字典的顺序很难是随机的,只是没有定义。通过对其进行真正的洗牌,您将获得更好的结果。洗牌的速度应该是线性的,所以性能不应该是一个问题。
字典顺序几乎不是随机的,只是没有定义。
;该死的一个解释会很好,也许在一个答案中,如果它不适合?我建议阅读哈希表和哈希函数。你可能正在按散列桶的顺序得到钥匙。嗯,这说明答案很重要@TomKarzes,谢谢!字典的顺序很难是随机的,只是没有定义。通过对其进行真正的洗牌,您将获得更好的结果。洗牌的速度应该是线性的,所以性能不应该是一个问题。
字典顺序几乎不是随机的,只是没有定义。
;该死的一个解释会很好,也许在一个答案中,如果它不适合?我建议阅读哈希表和哈希函数。你可能正在按散列桶的顺序得到钥匙。嗯,这说明答案很重要@TomKarzes,谢谢!一个诡辩:如果字典很大,那么可能有不到
阶乘(len(yourDict))
的方法来为随机数生成器种子,因此公式会夸大直接使用
random.shuffle()
的实际可能。看这个问题:另外,为了好玩,看这个:很酷。然而,OP说他们只处理40000个ID,伪随机数生成器周期为:
2**19937-1
for Python。因此,它们应该是安全的。sum(范围(140001)内n的math.log(n,2)计算结果为553809,所以为40000!更像是2**553809。此外,如果系统时钟以如下方式对其进行种子设定,即混洗是种子设定时系统时钟状态的函数,则系统的可能状态数