function shuffle(array) {
let counter = array.length;
// While there are elements in the array
while (counter > 0) {
// Pick a random index
let index = Math.floor(Math.random() * counter);
// Decrease counter by 1
counter--;
// And swap the last element with it
let temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
}
/**
* Shuffles array in place.
* @param {Array} a items An array containing the items.
*/
function shuffle(a) {
var j, x, i;
for (i = a.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
x = a[i];
a[i] = a[j];
a[j] = x;
}
return a;
}
Version ES2015 (ES6)
/**
* Shuffles array in place. ES6 version
* @param {Array} a items An array containing the items.
*/
function shuffle(a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
return a;
}
var myArray = ['1','2','3','4','5','6','7','8','9'];
shuffle(myArray);
Mettre en œuvre le prototype
En utilisant Object.defineProperty (Tiré de cette réponse SO Object.defineProperty(取自此SO答案的方法)我们还可以实现该函数作为数组的原型方法,而无需让它出现在诸如 for (i in arr) 之类的循环中。以下代码将允许您调用 arr.shuffle() 来随机排列数组 arr), nous pouvons également implémenter la fonction en tant que prototype de tableau méthode sans qu'elle apparaisse dans une boucle telle que for (i in arr). Le code suivant vous permettra de mélanger un tableau arr en appelant arr.shuffle() :
Object.defineProperty(Array.prototype, 'shuffle', {
value: function() {
for (let i = this.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[this[i], this[j]] = [this[j], this[i]];
}
return this;
}
});
Vous pouvez utiliser le Fisher-Yates Shuffle (code adapté de ce site) :
Utilise une version moderne de l'algorithme de lecture aléatoire Fisher-Yates :
Version ES2015 (ES6)
Mais sachez que l'utilisation de déstructurations de variables d'échange à partir d'octobre 2017, l'allocation entraînera de sévères pénalités de performances.
Utilisation
Mettre en œuvre le prototype
En utilisant
Object.defineProperty
(Tiré de cette réponse SOObject.defineProperty
(取自此SO答案的方法)我们还可以实现该函数作为数组的原型方法,而无需让它出现在诸如for (i in arr)
之类的循环中。以下代码将允许您调用arr.shuffle()
来随机排列数组arr
), nous pouvons également implémenter la fonction en tant que prototype de tableau méthode sans qu'elle apparaisse dans une boucle telle quefor (i in arr)
. Le code suivant vous permettra de mélanger un tableauarr
en appelantarr.shuffle()
: