关于洗牌算法的错误认识
2018-06-24 02:02:09来源:未知 阅读 ()
下面是我之前一直使用的一个洗牌算法:
let arr = [1,2,3,4,5,6,7,8,9]; Array.prototype.shuffle = function() { let temp = this; for (let i = 0; i < temp.length; i++) { let index = Math.floor(Math.random()*temp.length); let itemAtIndex = temp[index]; temp[index] = temp[i] temp[i] = itemAtIndex; } return this; } console.log(arr.shuffle());
但仔细想想,其实这是非常不合理的,因为已经交换过的位置,下次仍然可能会被选上。
比较好的做法是排除已经交换过的位置,将剩下的位置洗牌,如下:
/* 1. 选中第一个元素,将其与n个元素中的任意一个交换(包括自己)。这时可以确定第一个元素 2. 选中第二个元素,将其与n-1个元素中的任意一个交换(包括自己)。确定第二个元素 3. 重复上面步骤,直到剩下一个。 4. 该算法事件复杂度为O(n),无偏差,各元素随机概率相等 */ let arr = [1,2,3,4,5,6,7,8,9]; Array.prototype.shuffle = function() { let temp = this; for (let i = temp.length - 1; i >= 0; i--) { let index = Math.floor(Math.random()*(i+1)); let itemAtIndex = temp[index]; temp[index] = temp[i] temp[i] = itemAtIndex; } return this; } console.log(arr.shuffle());
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 关于jQuery UI 使用心得及技巧 2020-03-29
- 如何用算法删除重复数据 2020-03-18
- javascript 中关于array的常用方法详解 2020-03-16
- 关于JS array的数组 2020-03-08
- Javascript排序算法的介绍 2019-10-29
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash