前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:如何手动打乱一个列表

一日一技:如何手动打乱一个列表

作者头像
青南
发布2020-07-09 10:48:40
4760
发布2020-07-09 10:48:40
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

产品经理亲手做的法式香煎鹅肝

我们知道,在 Python 里面,可以使用 random.shuffle打乱一个列表,如下图所示:

那么,如果我们要自己写一个打乱列表的算法,应该怎么写呢?

我们可以使用Fisher–Yates shuffle[1] 算法。这个算法的基本思想是:

  1. 从列表中任选一个数字,把它跟最后一个数字交换。
  2. 从列表索引为0-(n-2)中任选一个数字,把它和倒数第二位交换。
  3. 从列表索引为0-(n-3)位中,任选一个数字,把它和倒数第三位交换。
  4. 从索引为0,1中任选一个数字,把它和索引为1的数字交换。

具体的代码实现非常简单:

代码语言:javascript
复制
import random

def shuffle(target):
    for change in range(len(target) - 1, 0, -1):
        lower = random.randint(0, change)
        target[lower], target[change] = target[change], target[lower]

这个一个 in-place操作,直接修改原列表,所以不需要返回。

运行效果如下图所示:

每次运行,它的结果都是不一样的。

参考资料

[1]

Fisher–Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档