JavaScript随机打乱数组顺序之随机洗牌算法


Posted in Javascript onAugust 02, 2016

假如有一个数组是这样子:

var arr1 = ["a", "b", "c", "d"];

如何随机打乱数组顺序,也即洗牌。

有一个比较广为传播的简单随机算法:

function RandomSort (a,b){ return (0.5 - Math.random()); }

实际证明上面这个并不完全随机。

随便一搜网上太多这种东西了,看一下stackoverflow上的一个高分回答,答案出自github上。

knuth-shuffle
The Fisher-Yates (aka Knuth) shuffle for Browser and Node.JS

下面一起看看上面说的这个算法,代码如下:

/*jshint -W054 */
(function (exports) {
'use strict';
// http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
function shuffle(array) {
var currentIndex = array.length
, temporaryValue
, randomIndex
;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
exports.knuthShuffle = shuffle;
}('undefined' !== typeof exports && exports || 'undefined' !== typeof window && window || global));

作者推荐使用浏览器写法:

(function () {
'use strict';
var a = [2,11,37,42]
, b
;
// The shuffle modifies the original array
// calling a.slice(0) creates a copy, which is assigned to b
b = window.knuthShuffle(a.slice(0));
console.log(b);
}());

Nodejs:

npm install -S knuth-shuffle
(function () {
'use strict';
var shuffle = require('knuth-shuffle').knuthShuffle
, a = [2,11,37,42]
, b
;
// The shuffle modifies the original array
// calling a.slice(0) creates a copy, which is assigned to b
b = shuffle(a.slice(0));
console.log(b);
}());

还有其它从这个算法中变形去的,比如下面这个for循环的。其它的就不说了。

/**
* Randomize array element order in-place.
* Using Durstenfeld shuffle algorithm.
*/
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}

使用ES2015(ES6)

Array.prototype.shuffle = function() {
let m = this.length, i;
while (m) {
i = (Math.random() * m--) >>> 0;
[this[m], this[i]] = [this[i], this[m]]
}
return this;
}

使用:

[1, 2, 3, 4, 5, 6, 7].shuffle();

发现中文搜索随机算法一大堆,但究竟是不是完全随机,效率和兼容性都有待考究,建议后面如果有需要用到随机打乱数组元素,可以用上面这个。

Javascript 相关文章推荐
javascript中的关于类型转换的性能优化
Dec 14 Javascript
基于jquery实现的省市区级联无ajax
Sep 24 Javascript
Javascript判断图片尺寸大小实例分析
Jun 16 Javascript
JavaScript中对象property的删除方法介绍
Dec 30 Javascript
JavaScript多图片上传案例
Sep 28 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
新手学习前端之js模仿淘宝主页网站
Oct 31 Javascript
EasyUI实现下拉框多选功能
Nov 07 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
layui 监听select选择 获取当前select的ID名称方法
Sep 24 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
AngularJS基础 ng-mouseleave 指令详解
Aug 02 #Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
Aug 02 #Javascript
实现React单页应用的方法详解
Aug 02 #Javascript
AngularJS基础 ng-mouseenter 指令示例代码
Aug 02 #Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
Aug 02 #Javascript
AngularJS ng-mousedown 指令
Aug 02 #Javascript
JS从数组中随机取出几个数组元素的方法
Aug 02 #Javascript
You might like
提问的智慧(2)
2006/10/09 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
python基于event实现线程间通信控制
2020/01/13 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
高中毕业自我鉴定
2013/12/19 职场文书
护士思想汇报
2014/01/12 职场文书
优秀员工表扬信
2014/01/17 职场文书
采购求职信
2014/03/17 职场文书
机关会计岗位职责
2014/04/08 职场文书
小学班主任培训方案
2014/06/04 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
项目申请汇报材料
2014/08/16 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
介绍信模板
2015/01/31 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
校长一岗双责责任书
2015/05/09 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python