随机洗牌算法+matlab,洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

本文探讨了从序列中随机抽取元素的方法,包括使用随机洗牌算法和Python的random.shuffle及random.sample函数。通过分析代码和算法效率,解释了为何在不同情况下sample会选择不同的实现方式,并讨论了两种算法的时间复杂度。
摘要由CSDN通过智能技术生成

对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣。但是,今天决定写一篇跟算法有关的文章。起因是读了吴师兄的文章《扫雷与算法:如何随机化的布雷(二)之洗牌算法》。因为扫雷这个游戏我是写过的,具体见:《Python:游戏:扫雷》。

游戏开始的时候需要随机布雷。扫雷的高级是 16 × 30 的网格,一共有 99 个雷。如果从 0 开始给所有网格做标记,那么布雷的问题就成了从 480 个数中随机选取 99 个数。

第一反应自然是记录已选项:

import random

mines = set()

for i in range(99):

j = random.randint(0, 480)

while j in mines:

j = random.randint(0, 480)

mines.add(j)

print(mines)

复制代码

不过这算法看着似乎有点 low 啊。

其实从 480 个数中随机抽取 99 个数,那么只要将这 480 个数打乱,取前 99 个数就好了。这就引出了:高纳德置乱算法(洗牌算法)。

这个算法很牛逼却很好理解,通俗的解释就是:将最后一个数和前面任意 n-1 个数中的一个数进行交换,然后倒数第二个数和前面任意 n-2 个数中的一个数进行交换......以此类推。

这个原理很好理解,通俗得不能再通俗,稍微想一下就会明白,确实如此。

洗牌算法的 Python 实现如下:

import random

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值