From 7fdbfa84b5b2071527daa6aa40ed91b851a69f5a Mon Sep 17 00:00:00 2001 From: pyoor Date: Tue, 4 Sep 2018 13:34:20 -0400 Subject: [PATCH] Refactor choose and weighted --- lib/random/random.js | 44 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/lib/random/random.js b/lib/random/random.js index 7ae584d..85794f2 100644 --- a/lib/random/random.js +++ b/lib/random/random.js @@ -144,43 +144,35 @@ class random { throw new TypeError(`random.choose() received non-array type: (${list})`) } - let total = 0 - for (let i = 0; i < list.length; i++) { - total += list[i][0] - } - - let n = random.number(total) - for (let i = 0; i < list.length; i++) { - if (n < list[i][0]) { - if (flat === true) { - return list[i][1] - } else { - return random.pick([list[i][1]]) - } + const expanded = [] + list.forEach(([weight, value]) => { + while (weight--) { + expanded.push(value) } - n = n - list[i][0] - } + }) if (flat) { - return list[0][1] + return random.item(expanded) } - return random.pick([list[0][1]]) + return random.pick(expanded) } /** - * More memory-hungry but hopefully faster than random.choose$flat. - * @param {*} wa + * Return a flattened list of weighted values + * [{w: 1, v: 'foo'}, {w: 1, v: 'bar'}] + * @param {Array} list + * @param {Array} */ - static weighted (wa) { - let a = [] - for (let i = 0; i < wa.length; ++i) { - for (let j = 0; j < wa[i].w; ++j) { - a.push(wa[i].v) + static weighted (list) { + const expanded = [] + list.forEach((item) => { + while (item.w--) { + expanded.push(item.v) } - } + }) - return a + return expanded } static use (obj) {