假如有一个数组是这样子:
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 2 3 4 5 6 7 8 9 10 11 12 13
| (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循环的。其它的就不说了。
1 2 3 4 5 6 7 8 9 10 11 12 13
| /**
* 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)
1 2 3 4 5 6 7 8
| 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 ;
} |
使用:
发现中文搜索随机算法一大堆,但究竟是不是完全随机,效率和兼容性都有待考究,建议后面如果有需要用到随机打乱数组元素,可以用上面这个。
「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」
共 0 条评论关于"了解Javascript随机数组,js洗牌算法"
最新评论