【问题标题】:What is the principle of randomly selecting positions to swap in the shuffle functionshuffle函数中随机选位交换的原理是什么
【发布时间】:2021-09-30 04:04:23
【问题描述】:

Fisher-Yates shuffle 意思是我们每次从选中的segment中取出最后一个数,和之前随机选中的数交换,不断迭代,最终实现随机shuffle。python3.6中官方Shuffle的代码是如下

     _int = int
     for i in reversed(range(1, len(x))):
          # pick an element in x[:i+1] with which to exchange x[i]
          j = _int(random() * (i+1))
          x[i], x[j] = x[j], x[i]

为什么不直接选择全球位置并交换?

【问题讨论】:

  • "那么每次随机选择时要交换的位置总是0"——不,不是。
  • _int = int的原因是什么?
  • @Barmar:这是避免一些全局查找的微优化。由于全局变量缓存优化,这些天影响不大。

标签: python fisher-yates-shuffle


【解决方案1】:

random()[0, 1) 范围内的浮点数。当你将它乘以i+1 时,你会得到一个在[0, i+1) 范围内的浮点数。当您将其转换为整数时,您会得到[0, i] 范围内的整数。

当然,您可以只使用random.randint(0, i)。而reverse(range(1, len(x))可以简化为range(len(x)-1, 0, -1)

【讨论】:

  • 该代码实际上避免在通常的代码路径中使用random() - 如果调用者提供了他们自己的random 参数,则提问者发布的是备用代码路径。它在通常情况下使用randbelow。 (至于“简化”reversed(range(1, len(x)),见仁见智,我个人觉得reversed的版本更清晰。)
猜你喜欢
  • 2011-08-07
  • 2020-09-08
  • 2011-08-18
  • 1970-01-01
  • 2014-12-04
  • 2017-02-28
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多