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 相关文章推荐
一个网马的tips实现分析
Nov 28 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
JavaScript 封装一个tab效果源码分享
Sep 15 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
Nov 23 Javascript
jQuery 实时保存页面动态添加的数据的示例
Aug 14 jQuery
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
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
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
javascript基本常用排序算法解析
2017/09/27 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
python机器学习之神经网络(二)
2017/12/20 Python
python 实现dict转json并保存文件
2019/12/05 Python
python和php学习哪个更有发展
2020/06/17 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
python 下载文件的多种方法汇总
2020/11/17 Python
python 实用工具状态机transitions
2020/11/21 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
《可爱的动物》教学反思
2014/02/22 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书