| 1 | // https://stackoverflow.com/a/47593316/12660887 |
| 2 | function mulberry32(a) { |
| 3 | return function() { |
| 4 | let t = a += 0x6D2B79F5; |
| 5 | t = Math.imul(t ^ t >>> 15, t | 1); |
| 6 | t ^= t + Math.imul(t ^ t >>> 7, t | 61); |
| 7 | return ((t ^ t >>> 14) >>> 0) / 4294967296; |
| 8 | } |
| 9 | } |
| 10 | |
| 11 | export const Random = { |
| 12 | |
| 13 | rand: null, |
| 14 | |
| 15 | setSeed: function(a) { |
| 16 | Random.rand = mulberry32(a); |
| 17 | }, |
| 18 | |
| 19 | randInt: function(min, max) { |
| 20 | if (!max) { |
| 21 | max = min; |
| 22 | min = 0; |
| 23 | } |
| 24 | if (!Random.rand) |
| 25 | Random.setSeed(Math.floor(Math.random() * 1984)); |
| 26 | return Math.floor(Random.rand() * (max - min)) + min; |
| 27 | }, |
| 28 | |
| 29 | // Inspired by https://github.com/jashkenas/underscore |
| 30 | sample: function(arr, n) { |
| 31 | n = n || 1; |
| 32 | let cpArr = arr.map(e => e); |
| 33 | for (let index = 0; index < n; index++) { |
| 34 | const rand = randInt(index, arr.length); |
| 35 | [ cpArr[index], cpArr[rand] ] = [ cpArr[rand], cpArr[index] ]; |
| 36 | } |
| 37 | return cpArr.slice(0, n); |
| 38 | }, |
| 39 | |
| 40 | shuffle: function(arr) { |
| 41 | return sample(arr, arr.length); |
| 42 | } |
| 43 | |
| 44 | }; |