JavaScript随机打乱数组元素的算法

Fisher–Yates算法

随机打乱数组元素有一种算法:Fisher–Yates,JavaScript实现如下:

function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// 循环打乱剩下的元素
while (0 !== currentIndex) {
// 抽取剩下的元素
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// 和当前元素交换
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}

使用:

var arr = [2, 11, 37, 42];
shuffle(arr);
console.log(arr);

Durstenfeld shuffle算法

Fisher-Yates优化版Durstenfeld shuffle, JavaScript实现如下:

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;
}
}

ES6b版本:

function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}


版权声明:著作权归作者所有。

相关推荐

Python随机挑选列表的元素

Python提供了几种方法用于随机抽样。random.choice如果对随机的结果要求不严格,可以使用Python提供的random.choice。import random list = ['a','b','c','d'] print(random.choice(list)) random.choice可以称为伪随机,如果对random给定种子,那么它随机出来的结

JavaScript删除数组里重复的元素

JavaScript里有多种方法可以用来对数组元素去重。ES6 SetES6提供了一个Set对象,用它可以很简单便可以对数组元素去重。function uniq(arr) {    return Array.from(new Set(arr)); } filter另外也可以通过filter来对数组元素去重。functi