probability-picker 1.0.1 → 1.2.0
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/README.md +4 -4
- package/dist/index.cjs +59 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -5
- package/probability-picker.js +0 -68
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Probability Picker
|
|
2
|
-
A library
|
|
2
|
+
A lightweight library for selecting random values based on weighted probabilities.
|
|
3
3
|
|
|
4
4
|
## Installation
|
|
5
5
|
|
|
6
6
|
```bash
|
|
7
|
-
npm
|
|
7
|
+
npm i probability-picker
|
|
8
8
|
```
|
|
9
9
|
|
|
10
10
|
## Usage
|
|
@@ -12,9 +12,9 @@ npm install probability-picker
|
|
|
12
12
|
The `probabilityPicker` function will return `a`, `b`, or `c`. The probability of each one is defined as a value in the object.
|
|
13
13
|
|
|
14
14
|
```javascript
|
|
15
|
-
import
|
|
15
|
+
import picker from 'probability-picker';
|
|
16
16
|
|
|
17
|
-
const value =
|
|
17
|
+
const value = picker({
|
|
18
18
|
a: 10,
|
|
19
19
|
b: 70,
|
|
20
20
|
c: 20,
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
function filterNumbers(entries) {
|
|
5
|
+
return entries.filter((e) => typeof e[1] === "number" && !Number.isNaN(e[1]));
|
|
6
|
+
}
|
|
7
|
+
function sortEntries(entries) {
|
|
8
|
+
return entries.sort((a, b) => a[1] - b[1]);
|
|
9
|
+
}
|
|
10
|
+
function sumProbabilities(entries) {
|
|
11
|
+
return entries.reduce((acc, e) => acc + e[1], 0);
|
|
12
|
+
}
|
|
13
|
+
function normalizeProbabilities(entries, total) {
|
|
14
|
+
return entries.map(([k, v]) => [k, Math.round(v / total * 100)]);
|
|
15
|
+
}
|
|
16
|
+
function prepareEntries(entries) {
|
|
17
|
+
const filtered = filterNumbers(entries);
|
|
18
|
+
if (filtered.length === 0) return;
|
|
19
|
+
const sorted = sortEntries(filtered);
|
|
20
|
+
const sum = sumProbabilities(sorted);
|
|
21
|
+
if (sum === 0) return;
|
|
22
|
+
if (sum === 100) return sorted;
|
|
23
|
+
return normalizeProbabilities(sorted, sum);
|
|
24
|
+
}
|
|
25
|
+
function secureRandom() {
|
|
26
|
+
if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.getRandomValues !== "function") {
|
|
27
|
+
return Math.random();
|
|
28
|
+
}
|
|
29
|
+
const array = new Uint32Array(1);
|
|
30
|
+
globalThis.crypto.getRandomValues(array);
|
|
31
|
+
return array[0] / 4294967296;
|
|
32
|
+
}
|
|
33
|
+
function random(min, max) {
|
|
34
|
+
return secureRandom() * (max - min) + min;
|
|
35
|
+
}
|
|
36
|
+
function chooseOne(entries) {
|
|
37
|
+
const num = random(1, 100);
|
|
38
|
+
let count = 0;
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
count += entry[1];
|
|
41
|
+
if (num <= count) return entry[0];
|
|
42
|
+
}
|
|
43
|
+
return entries[entries.length - 1][0];
|
|
44
|
+
}
|
|
45
|
+
function probabilityPicker(map) {
|
|
46
|
+
if (!(map instanceof Object)) return null;
|
|
47
|
+
const entries = Object.entries(map);
|
|
48
|
+
if (entries.length === 0) return void 0;
|
|
49
|
+
const first = entries[0];
|
|
50
|
+
if (first && entries.length === 1) return first[0];
|
|
51
|
+
const prepared = prepareEntries(entries);
|
|
52
|
+
if (!prepared) return void 0;
|
|
53
|
+
return chooseOne(prepared);
|
|
54
|
+
}
|
|
55
|
+
var index_default = probabilityPicker;
|
|
56
|
+
|
|
57
|
+
module.exports = index_default;
|
|
58
|
+
//# sourceMappingURL=index.cjs.map
|
|
59
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;AAGA,SAAS,cAAc,OAAA,EAAkB;AACrC,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,OAAO,EAAE,CAAC,CAAA,KAAM,QAAA,IAAY,CAAC,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC9E;AAEA,SAAS,YAAY,OAAA,EAAkB;AACnC,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAC7C;AAEA,SAAS,iBAAiB,OAAA,EAAkB;AACxC,EAAA,OAAO,OAAA,CAAQ,OAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,EAAG,CAAC,CAAA;AACnD;AAEA,SAAS,sBAAA,CAAuB,SAAkB,KAAA,EAAe;AAC7D,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,KAAK,KAAA,CAAO,CAAA,GAAI,KAAA,GAAS,GAAG,CAAC,CAAU,CAAA;AAC9E;AAEA,SAAS,eAAe,OAAA,EAAkB;AACtC,EAAA,MAAM,QAAA,GAAW,cAAc,OAAO,CAAA;AACtC,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,EAAA,MAAM,MAAA,GAAS,YAAY,QAAQ,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,iBAAiB,MAAM,CAAA;AACnC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACf,EAAA,IAAI,GAAA,KAAQ,KAAK,OAAO,MAAA;AACxB,EAAA,OAAO,sBAAA,CAAuB,QAAQ,GAAG,CAAA;AAC7C;AAEA,SAAS,YAAA,GAAuB;AAC5B,EAAA,IAAI,OAAO,WAAW,MAAA,KAAW,WAAA,IAAe,OAAO,UAAA,CAAW,MAAA,CAAO,oBAAoB,UAAA,EAAY;AACrG,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACvB;AACA,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,CAAC,CAAA;AAC/B,EAAA,UAAA,CAAW,MAAA,CAAO,gBAAgB,KAAK,CAAA;AACvC,EAAA,OAAO,KAAA,CAAM,CAAC,CAAA,GAAK,UAAA;AACvB;AAEA,SAAS,MAAA,CAAO,KAAa,GAAA,EAAa;AACtC,EAAA,OAAO,YAAA,EAAa,IAAK,GAAA,GAAM,GAAA,CAAA,GAAO,GAAA;AAC1C;AAEA,SAAS,UAAU,OAAA,EAAkB;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,GAAG,CAAA;AACzB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AACzB,IAAA,KAAA,IAAS,MAAM,CAAC,CAAA;AAChB,IAAA,IAAI,GAAA,IAAO,KAAA,EAAO,OAAO,KAAA,CAAM,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,EAAG,CAAC,CAAA;AACzC;AAEA,SAAS,kBAAkB,GAAA,EAAgD;AACvE,EAAA,IAAI,EAAE,GAAA,YAAe,MAAA,CAAA,EAAS,OAAO,IAAA;AACrC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,SAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,OAAO,UAAU,QAAQ,CAAA;AAC7B;AAEA,IAAO,aAAA,GAAQ","file":"index.cjs","sourcesContent":["type ProbabilityMap = Record<string, number>\r\ntype Entry = [string, number]\r\n\r\nfunction filterNumbers(entries: Entry[]) {\r\n return entries.filter(e => typeof e[1] === 'number' && !Number.isNaN(e[1]))\r\n}\r\n\r\nfunction sortEntries(entries: Entry[]) {\r\n return entries.sort((a, b) => a[1] - b[1])\r\n}\r\n\r\nfunction sumProbabilities(entries: Entry[]) {\r\n return entries.reduce((acc, e) => acc + e[1], 0)\r\n}\r\n\r\nfunction normalizeProbabilities(entries: Entry[], total: number) {\r\n return entries.map(([k, v]) => [k, Math.round((v / total) * 100)] as Entry)\r\n}\r\n\r\nfunction prepareEntries(entries: Entry[]) {\r\n const filtered = filterNumbers(entries)\r\n if (filtered.length === 0) return\r\n const sorted = sortEntries(filtered)\r\n const sum = sumProbabilities(sorted)\r\n if (sum === 0) return\r\n if (sum === 100) return sorted\r\n return normalizeProbabilities(sorted, sum)\r\n}\r\n\r\nfunction secureRandom(): number {\r\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.getRandomValues !== 'function') {\r\n return Math.random()\r\n }\r\n const array = new Uint32Array(1)\r\n globalThis.crypto.getRandomValues(array)\r\n return array[0]! / 0x100000000\r\n}\r\n\r\nfunction random(min: number, max: number) {\r\n return secureRandom() * (max - min) + min\r\n}\r\n\r\nfunction chooseOne(entries: Entry[]) {\r\n const num = random(1, 100)\r\n let count = 0\r\n for (const entry of entries) {\r\n count += entry[1]\r\n if (num <= count) return entry[0]\r\n }\r\n return entries[entries.length - 1]![0]\r\n}\r\n\r\nfunction probabilityPicker(map: ProbabilityMap): string | null | undefined {\r\n if (!(map instanceof Object)) return null\r\n const entries = Object.entries(map) as Entry[]\r\n if (entries.length === 0) return undefined\r\n const first = entries[0]\r\n if (first && entries.length === 1) return first[0]\r\n const prepared = prepareEntries(entries)\r\n if (!prepared) return undefined\r\n return chooseOne(prepared)\r\n}\r\n\r\nexport default probabilityPicker;"]}
|
package/dist/index.d.cts
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
function filterNumbers(entries) {
|
|
3
|
+
return entries.filter((e) => typeof e[1] === "number" && !Number.isNaN(e[1]));
|
|
4
|
+
}
|
|
5
|
+
function sortEntries(entries) {
|
|
6
|
+
return entries.sort((a, b) => a[1] - b[1]);
|
|
7
|
+
}
|
|
8
|
+
function sumProbabilities(entries) {
|
|
9
|
+
return entries.reduce((acc, e) => acc + e[1], 0);
|
|
10
|
+
}
|
|
11
|
+
function normalizeProbabilities(entries, total) {
|
|
12
|
+
return entries.map(([k, v]) => [k, Math.round(v / total * 100)]);
|
|
13
|
+
}
|
|
14
|
+
function prepareEntries(entries) {
|
|
15
|
+
const filtered = filterNumbers(entries);
|
|
16
|
+
if (filtered.length === 0) return;
|
|
17
|
+
const sorted = sortEntries(filtered);
|
|
18
|
+
const sum = sumProbabilities(sorted);
|
|
19
|
+
if (sum === 0) return;
|
|
20
|
+
if (sum === 100) return sorted;
|
|
21
|
+
return normalizeProbabilities(sorted, sum);
|
|
22
|
+
}
|
|
23
|
+
function secureRandom() {
|
|
24
|
+
if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.getRandomValues !== "function") {
|
|
25
|
+
return Math.random();
|
|
26
|
+
}
|
|
27
|
+
const array = new Uint32Array(1);
|
|
28
|
+
globalThis.crypto.getRandomValues(array);
|
|
29
|
+
return array[0] / 4294967296;
|
|
30
|
+
}
|
|
31
|
+
function random(min, max) {
|
|
32
|
+
return secureRandom() * (max - min) + min;
|
|
33
|
+
}
|
|
34
|
+
function chooseOne(entries) {
|
|
35
|
+
const num = random(1, 100);
|
|
36
|
+
let count = 0;
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
count += entry[1];
|
|
39
|
+
if (num <= count) return entry[0];
|
|
40
|
+
}
|
|
41
|
+
return entries[entries.length - 1][0];
|
|
42
|
+
}
|
|
43
|
+
function probabilityPicker(map) {
|
|
44
|
+
if (!(map instanceof Object)) return null;
|
|
45
|
+
const entries = Object.entries(map);
|
|
46
|
+
if (entries.length === 0) return void 0;
|
|
47
|
+
const first = entries[0];
|
|
48
|
+
if (first && entries.length === 1) return first[0];
|
|
49
|
+
const prepared = prepareEntries(entries);
|
|
50
|
+
if (!prepared) return void 0;
|
|
51
|
+
return chooseOne(prepared);
|
|
52
|
+
}
|
|
53
|
+
var index_default = probabilityPicker;
|
|
54
|
+
|
|
55
|
+
export { index_default as default };
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["type ProbabilityMap = Record<string, number>\r\ntype Entry = [string, number]\r\n\r\nfunction filterNumbers(entries: Entry[]) {\r\n return entries.filter(e => typeof e[1] === 'number' && !Number.isNaN(e[1]))\r\n}\r\n\r\nfunction sortEntries(entries: Entry[]) {\r\n return entries.sort((a, b) => a[1] - b[1])\r\n}\r\n\r\nfunction sumProbabilities(entries: Entry[]) {\r\n return entries.reduce((acc, e) => acc + e[1], 0)\r\n}\r\n\r\nfunction normalizeProbabilities(entries: Entry[], total: number) {\r\n return entries.map(([k, v]) => [k, Math.round((v / total) * 100)] as Entry)\r\n}\r\n\r\nfunction prepareEntries(entries: Entry[]) {\r\n const filtered = filterNumbers(entries)\r\n if (filtered.length === 0) return\r\n const sorted = sortEntries(filtered)\r\n const sum = sumProbabilities(sorted)\r\n if (sum === 0) return\r\n if (sum === 100) return sorted\r\n return normalizeProbabilities(sorted, sum)\r\n}\r\n\r\nfunction secureRandom(): number {\r\n if (typeof globalThis.crypto === 'undefined' || typeof globalThis.crypto.getRandomValues !== 'function') {\r\n return Math.random()\r\n }\r\n const array = new Uint32Array(1)\r\n globalThis.crypto.getRandomValues(array)\r\n return array[0]! / 0x100000000\r\n}\r\n\r\nfunction random(min: number, max: number) {\r\n return secureRandom() * (max - min) + min\r\n}\r\n\r\nfunction chooseOne(entries: Entry[]) {\r\n const num = random(1, 100)\r\n let count = 0\r\n for (const entry of entries) {\r\n count += entry[1]\r\n if (num <= count) return entry[0]\r\n }\r\n return entries[entries.length - 1]![0]\r\n}\r\n\r\nfunction probabilityPicker(map: ProbabilityMap): string | null | undefined {\r\n if (!(map instanceof Object)) return null\r\n const entries = Object.entries(map) as Entry[]\r\n if (entries.length === 0) return undefined\r\n const first = entries[0]\r\n if (first && entries.length === 1) return first[0]\r\n const prepared = prepareEntries(entries)\r\n if (!prepared) return undefined\r\n return chooseOne(prepared)\r\n}\r\n\r\nexport default probabilityPicker;"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "probability-picker",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "A lightweight library for selecting random values based on weighted probabilities.",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"lint": "tsc --noEmit"
|
|
24
|
+
},
|
|
6
25
|
"keywords": [
|
|
7
|
-
"probability"
|
|
8
|
-
|
|
26
|
+
"probability",
|
|
27
|
+
"weighted",
|
|
28
|
+
"random"
|
|
29
|
+
],
|
|
30
|
+
"author": "qgave (https://github.com/qgave)",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/qgave/probability-picker"
|
|
35
|
+
},
|
|
36
|
+
"type": "module",
|
|
37
|
+
"sideEffects": false,
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"tsup": "^8.5.1",
|
|
40
|
+
"typescript": "^5.9.3"
|
|
41
|
+
}
|
|
9
42
|
}
|
package/probability-picker.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
function probabilityPicker(e) {
|
|
2
|
-
if (e instanceof Object === false) return null;
|
|
3
|
-
let values = Object.entries(e);
|
|
4
|
-
if (values.length === 0) return undefined;
|
|
5
|
-
if (values.length === 1) return values[0][0];
|
|
6
|
-
values = prepareValues(values);
|
|
7
|
-
if (values === undefined) return;
|
|
8
|
-
return chooseOne(values);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function prepareValues(values) {
|
|
12
|
-
values = filterNumbers(values);
|
|
13
|
-
if (values.length === 0) return;
|
|
14
|
-
values = sortValues(values);
|
|
15
|
-
return prepareProbability(values);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function filterNumbers(values) {
|
|
19
|
-
const result = [];
|
|
20
|
-
for (let i = 0; i < values.length; i++) {
|
|
21
|
-
if (typeof values[i][1] === 'number' && !Number.isNaN(values[i][1])) {
|
|
22
|
-
result.push(values[i]);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function sortValues(values) {
|
|
29
|
-
return values.sort((a, b) => a[1] - b[1]);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function prepareProbability(values) {
|
|
33
|
-
const sum = sumProbabilities(values);
|
|
34
|
-
if (sum === 0) return;
|
|
35
|
-
if (sum === 100) return values;
|
|
36
|
-
return changeProbability(values, sum);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function changeProbability(values, totalProbability) {
|
|
40
|
-
for (let i = 0; i < values.length; i++) {
|
|
41
|
-
values[i][1] = Math.round((values[i][1] / totalProbability) * 100);
|
|
42
|
-
}
|
|
43
|
-
return values;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function sumProbabilities(values) {
|
|
47
|
-
let s = 0;
|
|
48
|
-
for (let i = 0; i < values.length; i++) {
|
|
49
|
-
s += values[i][1];
|
|
50
|
-
}
|
|
51
|
-
return s;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function chooseOne(values) {
|
|
55
|
-
const num = random(1, 100);
|
|
56
|
-
let count = 0;
|
|
57
|
-
for (let i = 0; i < values.length; i++) {
|
|
58
|
-
count += values[i][1];
|
|
59
|
-
if (num <= count) return values[i][0];
|
|
60
|
-
}
|
|
61
|
-
return values;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function random(min, max) {
|
|
65
|
-
return Math.random() * (max - min) + min;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export default probabilityPicker;
|