From d9fe4b84cc22da26b03815732773e4c7a7e17b2d Mon Sep 17 00:00:00 2001 From: Bill Mei Date: Mon, 25 Dec 2017 18:43:55 -0800 Subject: [PATCH] User Fisher-Yates shuffle implementation --- snippets/shuffle.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/snippets/shuffle.md b/snippets/shuffle.md index 27d7fd783..c23d5296a 100644 --- a/snippets/shuffle.md +++ b/snippets/shuffle.md @@ -1,10 +1,20 @@ ### shuffle -Randomizes the order of the values of an array. +Randomizes the order of the values of an array, in place. -Use `Array.sort()` to reorder elements, using `Math.random()` in the comparator. +Users the Fisher-Yates reorder the elements, based on the [Lodash implementation](https://github.com/lodash/lodash/blob/b2ea6b1cd251796dcb5f9700c4911a7b6223920b/shuffle.js). ```js -const shuffle = arr => arr.sort(() => Math.random() - 0.5); +const shuffle = (arr = []) => { + let i = -1; + const lastIndex = arr.length - 1; + while (++i < arr.length) { + const rand = i + Math.floor(Math.random() * (lastIndex - i + 1)); + const value = arr[rand]; + arr[rand] = arr[i]; + arr[i] = value; + } + return arr +}; // shuffle([1,2,3]) -> [2,3,1] ```