Commit | Line | Data |
---|---|---|
41534b92 BA |
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) | |
33b42748 | 25 | Random.setSeed(Math.floor(Math.random() * 19840)); |
41534b92 BA |
26 | return Math.floor(Random.rand() * (max - min)) + min; |
27 | }, | |
28 | ||
0adfbdb5 BA |
29 | randBool: function() { |
30 | return Random.randInt(0, 2) == 0; | |
31 | }, | |
32 | ||
41534b92 BA |
33 | // Inspired by https://github.com/jashkenas/underscore |
34 | sample: function(arr, n) { | |
35 | n = n || 1; | |
36 | let cpArr = arr.map(e => e); | |
37 | for (let index = 0; index < n; index++) { | |
bc2bc396 | 38 | const rand = Random.randInt(index, arr.length); |
41534b92 BA |
39 | [ cpArr[index], cpArr[rand] ] = [ cpArr[rand], cpArr[index] ]; |
40 | } | |
3b641716 BA |
41 | const res = cpArr.slice(0, n); |
42 | return (n >= 2 ? res : res[0]); | |
41534b92 BA |
43 | }, |
44 | ||
45 | shuffle: function(arr) { | |
bc2bc396 | 46 | return Random.sample(arr, arr.length); |
41534b92 BA |
47 | } |
48 | ||
49 | }; |