@esportsplus/random 0.0.1 → 0.0.2

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/index.d.ts CHANGED
@@ -1,8 +1,22 @@
1
- declare const float: () => number;
2
- declare const floats: (n: number) => number[];
3
- declare const _default: {
4
- float: () => number;
5
- floats: (n: number) => number[];
6
- };
7
- export default _default;
8
- export { float, floats };
1
+ declare const coinflip: () => boolean;
2
+ declare const float: () => number;
3
+ declare const floats: (n: number) => number[];
4
+ declare const integer: () => number;
5
+ declare const integers: (n: number) => any[];
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[];
10
+ declare const _default: {
11
+ coinflip: () => boolean;
12
+ float: () => number;
13
+ floats: (n: number) => number[];
14
+ integer: () => number;
15
+ integers: (n: number) => any[];
16
+ item: <T>(items: T[], weights?: number[] | undefined) => T;
17
+ range: (min: number, max: number, integer?: boolean) => number;
18
+ roll: (percentage: number) => boolean;
19
+ shuffle: (values: any[]) => any[];
20
+ };
21
+ export default _default;
22
+ export { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
package/build/index.js CHANGED
@@ -1,24 +1,78 @@
1
- let max = Math.pow(2, 32);
2
- function browser() {
3
- return window.crypto.getRandomValues(new Uint32Array(1))[0] / max;
4
- }
5
- function node() {
6
- return require('crypto').randomBytes(4).readUInt32BE(0) / max;
7
- }
8
- const float = () => {
9
- if (globalThis?.crypto) {
10
- return browser();
11
- }
12
- return node();
13
- };
14
- const floats = (n) => {
15
- let i, values = [];
16
- while (--n > -1) {
17
- i = Math.floor(Math.random() * (n + 1));
18
- values[i] = values[n];
19
- values[n] = float();
20
- }
21
- return values;
22
- };
23
- export default { float, floats };
24
- export { float, floats };
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
+ 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 };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "author": "ICJR",
3
3
  "description": "Random",
4
4
  "devDependencies": {
5
- "@esportsplus/rspack": "^0.0.1"
5
+ "@esportsplus/rspack": "^0.0.10"
6
6
  },
7
7
  "main": "build/index.js",
8
8
  "name": "@esportsplus/random",
@@ -14,5 +14,5 @@
14
14
  "prepublishOnly": "npm run build"
15
15
  },
16
16
  "types": "build/index.d.ts",
17
- "version": "0.0.1"
17
+ "version": "0.0.2"
18
18
  }
package/src/index.ts CHANGED
@@ -1,39 +1,115 @@
1
- let max = Math.pow(2, 32);
1
+ let max = Math.pow(2, 32),
2
+ rng: () => number;
2
3
 
3
4
 
4
- function browser() {
5
- return window.crypto.getRandomValues(new Uint32Array(1))[0] / max;
5
+ if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
6
+ rng = () => window.crypto.getRandomValues(new Uint32Array(1))[0] / max;
6
7
  }
7
-
8
- function node() {
9
- return require('crypto').randomBytes(4).readUInt32BE(0) / max;
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');
10
13
  }
11
14
 
12
15
 
13
- const float = (): number => {
14
- if (globalThis?.crypto) {
15
- return browser();
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) ];
16
51
  }
17
52
 
18
- return node();
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;
19
93
  };
20
94
 
21
95
  // Fisher-Yates shuffle
22
96
  // - https://wikipedia.org/wiki/Fisher-Yates_shuffle
23
- const floats = (n: number): number[] => {
24
- let i: number,
25
- values: number[] = [];
97
+ const shuffle = (values: any[]) => {
98
+ let n = values.length,
99
+ random: number,
100
+ value;
26
101
 
27
- while(--n > -1) {
28
- i = Math.floor(Math.random() * (n + 1));
102
+ while (--n > 0) {
103
+ random = Math.floor(rng() * (n + 1));
104
+ value = values[random];
29
105
 
30
- values[i] = values[n];
31
- values[n] = float();
106
+ values[random] = values[n];
107
+ values[n] = value;
32
108
  }
33
109
 
34
110
  return values;
35
111
  };
36
112
 
37
113
 
38
- export default { float, floats };
39
- export { float, floats };
114
+ export default { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
115
+ export { coinflip, float, floats, integer, integers, item, range, roll, shuffle };
package/readme.md DELETED
@@ -1,2 +0,0 @@
1
- https://github.com/maverick-js/signals
2
- https://github.com/modderme123/reactively