假如有一个数组是这样子:
1 | var arr1 = ["a", "b", "c", "d"]; |
如何随机打乱数组顺序,也即洗牌。
有一个比较广为传播的简单随机算法:
1 | function RandomSort (a,b){ return (0.5 - Math.random()); } |
实际证明上面这个并不完全随机。
随便一搜网上太多这种东西了,看一下stackoverflow上的一个高分回答,答案出自github上。
knuth-shuffle
The Fisher-Yates (aka Knuth) shuffle for Browser and Node.js
下面一起看看上面说的这个算法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /*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)); |
作者推荐使用浏览器写法:
1 2 3 4 5 6 7 8 9 10 11 12 | (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:
1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
还有其它从这个算法中变形去的,比如下面这个for循环的。其它的就不说了。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
使用ES2015(ES6)
1 2 3 4 5 6 7 8 |
使用:
1 |
发现中文搜索随机算法一大堆,但究竟是不是完全随机,效率和兼容性都有待考究,建议后面如果有需要用到随机打乱数组元素,可以用上面这个。
支付宝扫一扫打赏
微信扫一扫打赏
共 0 条评论关于"了解Javascript随机数组,js洗牌算法"
最新评论