@esportsplus/random 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/coinflip.d.ts +2 -0
- package/build/coinflip.js +4 -0
- package/build/float.d.ts +2 -0
- package/build/float.js +2 -0
- package/build/floats.d.ts +2 -0
- package/build/floats.js +9 -0
- package/build/index.d.ts +6 -14
- package/build/index.js +7 -78
- package/build/integer.d.ts +2 -0
- package/build/integer.js +4 -0
- package/build/integers.d.ts +2 -0
- package/build/integers.js +9 -0
- package/build/item.d.ts +2 -0
- package/build/item.js +23 -0
- package/build/range.d.ts +2 -0
- package/build/range.js +9 -0
- package/build/rng.d.ts +2 -0
- package/build/rng.js +11 -0
- package/build/roll.d.ts +2 -0
- package/build/roll.js +4 -0
- package/build/shuffle.d.ts +2 -0
- package/build/shuffle.js +11 -0
- package/package.json +1 -1
- package/src/coinflip.ts +6 -0
- package/src/index.ts +7 -113
- package/src/item.ts +33 -0
- package/src/range.ts +13 -0
- package/src/rng.ts +16 -0
- package/src/roll.ts +6 -0
- package/src/shuffle.ts +20 -0
package/build/float.d.ts
ADDED
package/build/float.js
ADDED
package/build/floats.js
ADDED
package/build/index.d.ts
CHANGED
|
@@ -1,22 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
declare const item: <T>(items: T[], weights?: number[]) => T;
|
|
7
|
-
declare const range: (min: number, max: number, integer?: boolean) => number;
|
|
8
|
-
declare const roll: (percentage: number) => boolean;
|
|
9
|
-
declare const shuffle: (values: any[]) => any[];
|
|
1
|
+
import coinflip from './coinflip';
|
|
2
|
+
import item from './item';
|
|
3
|
+
import range from './range';
|
|
4
|
+
import roll from './roll';
|
|
5
|
+
import shuffle from './shuffle';
|
|
10
6
|
declare const _default: {
|
|
11
7
|
coinflip: () => boolean;
|
|
12
|
-
float: () => number;
|
|
13
|
-
floats: (n: number) => number[];
|
|
14
|
-
integer: () => number;
|
|
15
|
-
integers: (n: number) => any[];
|
|
16
8
|
item: <T>(items: T[], weights?: number[] | undefined) => T;
|
|
17
9
|
range: (min: number, max: number, integer?: boolean) => number;
|
|
18
10
|
roll: (percentage: number) => boolean;
|
|
19
11
|
shuffle: (values: any[]) => any[];
|
|
20
12
|
};
|
|
21
13
|
export default _default;
|
|
22
|
-
export { coinflip,
|
|
14
|
+
export { coinflip, item, range, roll, shuffle };
|
package/build/index.js
CHANGED
|
@@ -1,78 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
else {
|
|
9
|
-
throw new Error('Random: no suitable random number generator found');
|
|
10
|
-
}
|
|
11
|
-
const coinflip = () => {
|
|
12
|
-
return rng() < 0.5;
|
|
13
|
-
};
|
|
14
|
-
const float = rng;
|
|
15
|
-
const floats = (n) => {
|
|
16
|
-
let values = [];
|
|
17
|
-
for (let i = 0; i < n; i++) {
|
|
18
|
-
values.push(rng());
|
|
19
|
-
}
|
|
20
|
-
return shuffle(values);
|
|
21
|
-
};
|
|
22
|
-
const integer = () => {
|
|
23
|
-
return Math.floor(rng());
|
|
24
|
-
};
|
|
25
|
-
const integers = (n) => {
|
|
26
|
-
let values = [];
|
|
27
|
-
for (let i = 0; i < n; i++) {
|
|
28
|
-
values.push(Math.floor(rng()));
|
|
29
|
-
}
|
|
30
|
-
return shuffle(values);
|
|
31
|
-
};
|
|
32
|
-
const item = (items, weights) => {
|
|
33
|
-
let random = rng();
|
|
34
|
-
if (weights === undefined) {
|
|
35
|
-
return items[Math.floor(random * items.length)];
|
|
36
|
-
}
|
|
37
|
-
if (items.length !== weights.length) {
|
|
38
|
-
throw new Error('Random: each option requires a chance number');
|
|
39
|
-
}
|
|
40
|
-
let sum = 0;
|
|
41
|
-
for (let i = 0, n = weights.length; i < n; i++) {
|
|
42
|
-
sum += weights[i];
|
|
43
|
-
}
|
|
44
|
-
if (sum < .9) {
|
|
45
|
-
throw new Error('Random: chance numbers need to exceed a total value of .9');
|
|
46
|
-
}
|
|
47
|
-
let total = 0;
|
|
48
|
-
for (let i = 0, n = items.length; i < n; i++) {
|
|
49
|
-
total += weights[i];
|
|
50
|
-
if (random <= total) {
|
|
51
|
-
return items[i];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
throw new Error('Random: weighted option pick failed');
|
|
55
|
-
};
|
|
56
|
-
const range = (min, max, integer = false) => {
|
|
57
|
-
if (!integer) {
|
|
58
|
-
return rng() * (max - min) + min;
|
|
59
|
-
}
|
|
60
|
-
min = Math.ceil(min);
|
|
61
|
-
max = Math.floor(max) + 1;
|
|
62
|
-
return Math.floor(rng() * (max - min) + min);
|
|
63
|
-
};
|
|
64
|
-
const roll = (percentage) => {
|
|
65
|
-
return rng() <= percentage;
|
|
66
|
-
};
|
|
67
|
-
const shuffle = (values) => {
|
|
68
|
-
let n = values.length, random, value;
|
|
69
|
-
while (--n > 0) {
|
|
70
|
-
random = Math.floor(rng() * (n + 1));
|
|
71
|
-
value = values[random];
|
|
72
|
-
values[random] = values[n];
|
|
73
|
-
values[n] = value;
|
|
74
|
-
}
|
|
75
|
-
return values;
|
|
76
|
-
};
|
|
77
|
-
export default { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
|
|
78
|
-
export { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
|
|
1
|
+
import coinflip from './coinflip';
|
|
2
|
+
import item from './item';
|
|
3
|
+
import range from './range';
|
|
4
|
+
import roll from './roll';
|
|
5
|
+
import shuffle from './shuffle';
|
|
6
|
+
export default { coinflip, item, range, roll, shuffle };
|
|
7
|
+
export { coinflip, item, range, roll, shuffle };
|
package/build/integer.js
ADDED
package/build/item.d.ts
ADDED
package/build/item.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import rng from "./rng";
|
|
2
|
+
export default (items, weights) => {
|
|
3
|
+
if (weights === undefined) {
|
|
4
|
+
return items[Math.floor(rng() * items.length)];
|
|
5
|
+
}
|
|
6
|
+
if (items.length !== weights.length) {
|
|
7
|
+
throw new Error('Random: each item requires a weight');
|
|
8
|
+
}
|
|
9
|
+
let random = rng(), total = 10000;
|
|
10
|
+
for (let i = 0, n = weights.length; i < n; i++) {
|
|
11
|
+
total += weights[i];
|
|
12
|
+
}
|
|
13
|
+
if (total !== 0) {
|
|
14
|
+
throw new Error('Random: weights use basis point math, they must add up to 10000 ( 100% )');
|
|
15
|
+
}
|
|
16
|
+
for (let i = 0, n = items.length; i < n; i++) {
|
|
17
|
+
total += weights[i];
|
|
18
|
+
if (random <= total) {
|
|
19
|
+
return items[i];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new Error('Random: weighted item pick failed');
|
|
23
|
+
};
|
package/build/range.d.ts
ADDED
package/build/range.js
ADDED
package/build/rng.d.ts
ADDED
package/build/rng.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
let max = Math.pow(2, 32), rng;
|
|
2
|
+
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
|
|
3
|
+
rng = () => window.crypto.getRandomValues(new Uint32Array(1))[0] / max;
|
|
4
|
+
}
|
|
5
|
+
else if (typeof process !== 'undefined' && process.versions != null && process.versions.node != null) {
|
|
6
|
+
rng = () => require('crypto').randomBytes(4).readUInt32BE(0) / max;
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
throw new Error('Random: no suitable random number generator found');
|
|
10
|
+
}
|
|
11
|
+
export default rng;
|
package/build/roll.d.ts
ADDED
package/build/roll.js
ADDED
package/build/shuffle.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import rng from './rng';
|
|
2
|
+
export default (values) => {
|
|
3
|
+
let n = values.length, random, value;
|
|
4
|
+
while (--n > 0) {
|
|
5
|
+
random = Math.floor(rng() * (n + 1));
|
|
6
|
+
value = values[random];
|
|
7
|
+
values[random] = values[n];
|
|
8
|
+
values[n] = value;
|
|
9
|
+
}
|
|
10
|
+
return values;
|
|
11
|
+
};
|
package/package.json
CHANGED
package/src/coinflip.ts
ADDED
package/src/index.ts
CHANGED
|
@@ -1,115 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import coinflip from './coinflip';
|
|
2
|
+
import item from './item';
|
|
3
|
+
import range from './range';
|
|
4
|
+
import roll from './roll';
|
|
5
|
+
import shuffle from './shuffle';
|
|
3
6
|
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
else if (typeof process !== 'undefined' && process.versions != null && process.versions.node != null) {
|
|
9
|
-
rng = () => require('crypto').randomBytes(4).readUInt32BE(0) / max;
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
throw new Error('Random: no suitable random number generator found');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const coinflip = () => {
|
|
17
|
-
return rng() < 0.5;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const float = rng;
|
|
21
|
-
|
|
22
|
-
const floats = (n: number): number[] => {
|
|
23
|
-
let values: number[] = [];
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i < n; i++) {
|
|
26
|
-
values.push(rng());
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return shuffle(values);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const integer = () => {
|
|
33
|
-
return Math.floor(rng());
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const integers = (n: number) => {
|
|
37
|
-
let values: number[] = [];
|
|
38
|
-
|
|
39
|
-
for (let i = 0; i < n; i++) {
|
|
40
|
-
values.push( Math.floor(rng()) );
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return shuffle(values);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const item = <T>(items: T[], weights?: number[]): T => {
|
|
47
|
-
let random = rng();
|
|
48
|
-
|
|
49
|
-
if (weights === undefined) {
|
|
50
|
-
return items[ Math.floor(random * items.length) ];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (items.length !== weights.length) {
|
|
54
|
-
throw new Error('Random: each option requires a chance number');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
let sum = 0;
|
|
58
|
-
|
|
59
|
-
for (let i = 0, n = weights.length; i < n; i++) {
|
|
60
|
-
sum += weights[i];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (sum < .9) {
|
|
64
|
-
throw new Error('Random: chance numbers need to exceed a total value of .9');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
let total = 0;
|
|
68
|
-
|
|
69
|
-
for (let i = 0, n = items.length; i < n; i++) {
|
|
70
|
-
total += weights[i];
|
|
71
|
-
|
|
72
|
-
if (random <= total) {
|
|
73
|
-
return items[i];
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
throw new Error('Random: weighted option pick failed');
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const range = (min: number, max: number, integer = false) => {
|
|
81
|
-
if (!integer) {
|
|
82
|
-
return rng() * (max - min) + min;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
min = Math.ceil(min);
|
|
86
|
-
max = Math.floor(max) + 1;
|
|
87
|
-
|
|
88
|
-
return Math.floor(rng() * (max - min) + min);
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const roll = (percentage: number) => {
|
|
92
|
-
return rng() <= percentage;
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Fisher-Yates shuffle
|
|
96
|
-
// - https://wikipedia.org/wiki/Fisher-Yates_shuffle
|
|
97
|
-
const shuffle = (values: any[]) => {
|
|
98
|
-
let n = values.length,
|
|
99
|
-
random: number,
|
|
100
|
-
value;
|
|
101
|
-
|
|
102
|
-
while (--n > 0) {
|
|
103
|
-
random = Math.floor(rng() * (n + 1));
|
|
104
|
-
value = values[random];
|
|
105
|
-
|
|
106
|
-
values[random] = values[n];
|
|
107
|
-
values[n] = value;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return values;
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
export default { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
|
|
115
|
-
export { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
|
|
8
|
+
export default { coinflip, item, range, roll, shuffle };
|
|
9
|
+
export { coinflip, item, range, roll, shuffle };
|
package/src/item.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import rng from "./rng";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export default <T>(items: T[], weights?: number[]): T => {
|
|
5
|
+
if (weights === undefined) {
|
|
6
|
+
return items[ Math.floor(rng() * items.length) ];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
if (items.length !== weights.length) {
|
|
10
|
+
throw new Error('Random: each item requires a weight');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let random = rng(),
|
|
14
|
+
total = 10000;
|
|
15
|
+
|
|
16
|
+
for (let i = 0, n = weights.length; i < n; i++) {
|
|
17
|
+
total += weights[i];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (total !== 0) {
|
|
21
|
+
throw new Error('Random: weights use basis point math, they must add up to 10000 ( 100% )');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
for (let i = 0, n = items.length; i < n; i++) {
|
|
25
|
+
total += weights[i];
|
|
26
|
+
|
|
27
|
+
if (random <= total) {
|
|
28
|
+
return items[i];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
throw new Error('Random: weighted item pick failed');
|
|
33
|
+
};
|
package/src/range.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import rng from './rng';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export default (min: number, max: number, integer = false) => {
|
|
5
|
+
if (!integer) {
|
|
6
|
+
return rng() * (max - min) + min;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
min = Math.ceil(min);
|
|
10
|
+
max = Math.floor(max) + 1;
|
|
11
|
+
|
|
12
|
+
return Math.floor(rng() * (max - min) + min);
|
|
13
|
+
};
|
package/src/rng.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
let max = Math.pow(2, 32),
|
|
2
|
+
rng: () => number;
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
|
|
6
|
+
rng = () => window.crypto.getRandomValues(new Uint32Array(1))[0] / max;
|
|
7
|
+
}
|
|
8
|
+
else if (typeof process !== 'undefined' && process.versions != null && process.versions.node != null) {
|
|
9
|
+
rng = () => require('crypto').randomBytes(4).readUInt32BE(0) / max;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
throw new Error('Random: no suitable random number generator found');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
export default rng;
|
package/src/roll.ts
ADDED
package/src/shuffle.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import rng from './rng';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// Fisher-Yates shuffle
|
|
5
|
+
// - https://wikipedia.org/wiki/Fisher-Yates_shuffle
|
|
6
|
+
export default (values: any[]) => {
|
|
7
|
+
let n = values.length,
|
|
8
|
+
random: number,
|
|
9
|
+
value;
|
|
10
|
+
|
|
11
|
+
while (--n > 0) {
|
|
12
|
+
random = Math.floor(rng() * (n + 1));
|
|
13
|
+
value = values[random];
|
|
14
|
+
|
|
15
|
+
values[random] = values[n];
|
|
16
|
+
values[n] = value;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return values;
|
|
20
|
+
};
|