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

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

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

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

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

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

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

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



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操作,直接修改原列表,所以不需要返回。

运行效果如下图所示:

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

目录
相关文章
|
弹性计算 调度 容器
在Kubernetes集群中通过LocalVolume Provisioner使用本地盘
介绍 阿里云在部分ECS类型中提供了本地盘配置,本地盘具有低时延、高随机IOPS、高吞吐量和高性价比的优势,在一些对性能要求很高的应用中有很大优势。 在Kubernetes系统中使用本地盘可以通过HostPath、LocalVolume等类型的PV使用: HostPath: 卷本身不带有调度信息,如果想对每个pod固定在某个节点上,就需要对pod配置nodeSelector等调度信息; LocalVolume: 卷本身包含了调度信息,使用这个卷的pod会被固定在特定的节点上,这样可以很好的保证数据的连续性。
6029 0
|
6月前
|
人工智能 安全 算法
Deepseek证明了“人工智能发展一日千里”!
人工智能(AI)正以惊人的速度发展,Deepseek作为行业新星,半年迭代13代模型,展现了AI技术的飞速进步。然而,技术快速发展也带来安全与伦理挑战。生成式人工智能(GAI)认证应运而生,由培生推出,为从业者提供技能培训与认证,确保AI应用符合伦理规范。GAI认证不仅提升个人竞争力,还推动行业健康发展,促进技术公平与国际合作。未来,GAI认证将引领AI进入新阶段,助力共创智能未来。
|
Linux
设置socket接收和发送超时的一种方式
设置socket接收和发送超时的一种方式
863 0
|
存储 安全 C语言
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
产品入门第六讲:Axure中继器
产品入门第六讲:Axure中继器
250 0
|
C# 开发者 C++
【学习资源】C#初学者学习资源推荐
初学者学习C#的学习资源推荐, 包括网站,书籍与社区。
805 0
【学习资源】C#初学者学习资源推荐
|
机器学习/深度学习 传感器 算法
【语音识别】基于匹配滤波器语音识别附matlab代码
【语音识别】基于匹配滤波器语音识别附matlab代码
|
Java 数据库 Spring
spring boot 2.0 JPA主键生成策略不按单表递增解决办法
spring boot 2.0 JPA主键生成策略不按单表递增解决办法
179 0
|
存储 开发框架 前端开发
Flask框架介绍
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
510 0
Flask框架介绍
|
测试技术 Python
热饭的测开成果盘点第八期:C/S架构大型selenium平台本地调试客户端
本期介绍的是一个wxpython写的客户端,主要是给一套服务端的selenium平台做本地调用。在上回我说到 完全在页面维护的平台反响不好后就转变为使用者可自行在本地写脚本,写好后上传到平台即可,所以做了本地的c/s客户端方便调试用例,而且和平台联系紧密,比如一些公共变量 方法等同步之类的。但是可惜 做了一半我就被陷害愤然离职了,这个客户端也还没正式启用就雪葬了
热饭的测开成果盘点第八期:C/S架构大型selenium平台本地调试客户端