First commit
[xogo.git] / utils / alea.js
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 };