我想知道Python的内置set
结构的元素排序的缺失是否“足够随机”。例如,拿一个集合的迭代器,它可以被认为是它的元素的混洗视图?Python的集合没有排序可以被视为随机顺序吗?
(如果它的事项,我在Windows主机上运行的Python 2.6.5。)
我想知道Python的内置set
结构的元素排序的缺失是否“足够随机”。例如,拿一个集合的迭代器,它可以被认为是它的元素的混洗视图?Python的集合没有排序可以被视为随机顺序吗?
(如果它的事项,我在Windows主机上运行的Python 2.6.5。)
不,这是不随机。它是“任意排序的”,这意味着你不能依赖它是有序的还是随机的。
不,你不能依靠它来达到任何真正的统计目的。 Python中的集合的实现是根据哈希表,并可能导致元素分布显示一些非随机的属性。 “没有保证订单”和“保证以统一随机方式无序”之间存在巨大差距。
使用random.shuffle
到确实序列的混洗元素。
事情是'random.shuffle'只能用于序列,'set'不能。有人可能会把它转换为一个'list',但是对于大量的元素和性能敏感的代码,它可能是一个问题... – Chuim 2010-05-18 20:04:22
一句话,没有:制定方案,这些自由,你预留就像是一个百搭卡,你可以用,当你实现,开发或改写的时候
>>> list(set(range(10000))) == list(range(10000))
True
同意,只是做了类似的测试我自己并得到了这些结果。 – Chuim 2010-05-18 19:56:30
随意性中心你的程序。您收集的这些免费卡越多,您可以从代码中提供更高的效率(可能),因为您可以更自由地进行更改。
它不是随机的,它只是自由。如果这样更好的话,订单可以在星期三转发,星期五转发。
顶部“禅”答案! ;) – Chuim 2010-05-18 20:05:47
理解“不确定”和“随机”之间的区别是很重要的。 – 2010-05-18 19:22:58
事实上,订单可以根据集合中各种对象的ID进行预测。这是代码严格定义的。但是 - 奖金 - 这些细节与您无关,使它们成为“任意”,“特定实施”和“任何事情都不可靠”。而且“只要你被允许照顾,就没有定义。” – 2010-05-18 19:25:58
好的。散列函数将决定顺序。例如,对于整数元素,我们将获得自然顺序。所以,我得出结论,我们将对同一组元素有“未定义”,“任意”和“可重复”排序。 – Chuim 2010-05-18 20:01:07