JavaScript随机打乱数组顺序之随机洗牌算法_Javascript教程-查字典教程网
JavaScript随机打乱数组顺序之随机洗牌算法
JavaScript随机打乱数组顺序之随机洗牌算法
发布时间:2016-12-30 来源:查字典编辑
摘要:假如有一个数组是这样子:vararr1=["a","b","c","d"];如何随机打乱数组顺序,也即洗牌。有一个比较广为传播的简单随机算法...

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

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教程学习
    编程开发子分类