【问题标题】:How well do Python sets randomize?Python 集合随机化的效果如何?
【发布时间】:2015-12-27 05:50:48
【问题描述】:

首先,我知道我不应该尝试我在这个问题中描述的内容,这纯粹是假设,所以请不要对我大喊大叫。

Python 集合不保持顺序,因为它们是没有映射部分的哈希映射。所以我想知道他们在随机化事物方面做得如何。显然,这对于加密来说是不够的,并且不适用于整数(因为 Python 哈希是整数上的标识),但它对于游戏和其他东西来说是否足够好?

它可以正常工作是有道理的,因为它对哈希进行了修改,但我不确定该哈希有多好以及它在随机化方面的效果如何。

P.S:集合总是会为相同的值返回相同的随机播放,但您可以假设这不是问题。

【问题讨论】:

  • “随机化”是什么意思?您所说的“对于游戏和其他东西来说足够好”是什么意思?如果您不关心顺序,您可以使用设置迭代顺序。如果您以任何方式关心顺序——希望它是一种特定的方式,或者不是一种特定的方式,或者是可预测的,或者是不可预测的——你不应该依赖迭代顺序。
  • 这绝对不是那个问题的欺骗
  • @undergroundmonorail 同意
  • @BrenBarn 我在问如果我希望它不可预测有多好。
  • @Maltysen 这太可怕了。这是非常可预测的,事实上这就是它存在的原因。

标签: python random hash set


【解决方案1】:

set 没有顺序,因此根据定义它不能随机化顺序。如果您关心订单,则迭代订单不可用。正如 BrenBam 所说,如果您以任何方式关心订单,则不能依赖它,因为它是一个实现细节。

随机排序的正确方法是random.shuffle

some_set_of_stuff = set(...)
some_list_of_stuff = list(some_set_of_stuff)  # you MUST make an ordered container for this!
random.shuffle(some_list_of_stuff)

如果你真的需要,也可以使用random.sample

some_set_of_stuff = set(...)
randomized = random.sample(some_set_of_stuff, len(some_set_of_stuff))

【讨论】:

  • 我在我的实际项目中使用random.shuffle(list())。我只是好奇如果不这样做会有多糟糕。
  • @Maltysen 好吧,这取决于你是否希望它被洗牌............
  • 我确实希望它随机化。
  • 那么你必须随机化它。 set(...) 不是随机的,只是对人类来说没有任何顺序。
猜你喜欢
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多