Complete FenUtil draft. Untested
[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() * 19840));
26 return Math.floor(Random.rand() * (max - min)) + min;
27 },
28
29 randBool: function() {
30 return Random.randInt(0, 2) == 0;
31 },
32
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++) {
38 const rand = Random.randInt(index, arr.length);
39 [ cpArr[index], cpArr[rand] ] = [ cpArr[rand], cpArr[index] ];
40 }
41 const res = cpArr.slice(0, n);
42 return (n >= 2 ? res : res[0]);
43 },
44
45 shuffle: function(arr) {
46 return Random.sample(arr, arr.length);
47 }
48
49 };