New variant idea
[xogo.git] / utils / alea.js
CommitLineData
41534b92
BA
1// https://stackoverflow.com/a/47593316/12660887
2function 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
11export 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};