In this post, we will write a function to randomize a JavaScript array.
Problem
Suppose we have an array of integer, how to randomize this array?
var arr = [1, 2, 3, 4, 5];
=> [3, 5, 4, 1, 2] // a possible result
Solution with Fisher-Yates algorithm
As explained in the post of Random Number, there is a Fisher-Yates shuffling algorithm to solve this task.
Durstenfeld shuffle is a variant of Fisher-Yates algorithm. The time complexity is O(N).
functionshuffle_array(array) { var cur_idx = array.length;
// While there remain elements to shuffle... while (0 !== cur_idx) { // Pick a remaining element... var rand_idx = Math.floor(Math.random() * cur_idx); cur_idx -= 1;
// And swap it with the current element. var tmp = array[cur_idx]; array[cur_idx] = array[rand_idx]; array[rand_idx] = tmp; } return array; }
// Usage of shuffle var arr = [1, 2, 3, 4, 5, 6]; arr = shuffle(arr); console.log(arr);
Make it shorter
functionshuffle_array(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var tmp = array[i]; array[i] = array[j]; array[j] = tmp; } }
If you code with ES6/ECMAScript 2015(which allow use to assign two variables at once), the code will be much shorter:
functionshuffle_array(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]]; } }