extra-rand 0.4.0 → 0.5.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 +8 -2
- package/lib/random-int-inclusive.js +5 -1
- package/lib/random-int-inclusive.js.map +1 -1
- package/lib/random-int.js +5 -1
- package/lib/random-int.js.map +1 -1
- package/lib/random-number.d.ts +1 -1
- package/lib/random-pick-index.d.ts +1 -1
- package/lib/random-pick-item.d.ts +1 -1
- package/lib/random-pick-weighted-index.d.ts +1 -1
- package/lib/random-pick-weighted-item.d.ts +3 -1
- package/lib/random-pick-weighted-item.js +25 -7
- package/lib/random-pick-weighted-item.js.map +1 -1
- package/lib/shuffle.js +1 -1
- package/lib/shuffle.js.map +1 -1
- package/package.json +5 -5
- package/src/random-int-inclusive.ts +5 -1
- package/src/random-int.ts +5 -1
- package/src/random-number.ts +1 -1
- package/src/random-pick-index.ts +1 -1
- package/src/random-pick-item.ts +1 -1
- package/src/random-pick-weighted-index.ts +1 -1
- package/src/random-pick-weighted-item.ts +45 -7
- package/src/shuffle.ts +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ function randomInt(min: number, max: number): number
|
|
|
29
29
|
function randomInt(generator: IRandomNumberGenerator, min: number, max: number): number
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
The function returns an integer in the range `[
|
|
32
|
+
The function returns an integer in the range `[min, max)`.
|
|
33
33
|
|
|
34
34
|
### randomIntInclusive
|
|
35
35
|
```ts
|
|
@@ -41,7 +41,7 @@ function randomIntInclusive(
|
|
|
41
41
|
): number
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
The function returns an integer in the range `[
|
|
44
|
+
The function returns an integer in the range `[min, max]`.
|
|
45
45
|
|
|
46
46
|
### randomNumber
|
|
47
47
|
```ts
|
|
@@ -89,7 +89,13 @@ interface IWeightedItem {
|
|
|
89
89
|
weight: number
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
function randomPickWeightedItem<T>(items: NonEmptyArray<T>, weights: NonEmptyArray<number>): T
|
|
92
93
|
function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
|
|
94
|
+
function randomPickWeightedItem<T>(
|
|
95
|
+
generator: IRandomNumberGenerator
|
|
96
|
+
, items: NonEmptyArray<T>
|
|
97
|
+
, weights: NonEmptyArray<number>
|
|
98
|
+
): T
|
|
93
99
|
function randomPickWeightedItem<T extends IWeightedItem>(
|
|
94
100
|
generator: IRandomNumberGenerator
|
|
95
101
|
, items: NonEmptyArray<T>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { remap } from 'extra-utils';
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
3
|
+
import { assert } from '@blackglory/prelude';
|
|
3
4
|
export function randomIntInclusive(...args) {
|
|
4
5
|
let generator;
|
|
5
6
|
let min;
|
|
@@ -11,6 +12,9 @@ export function randomIntInclusive(...args) {
|
|
|
11
12
|
else {
|
|
12
13
|
[generator, min, max] = args;
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
assert(Number.isInteger(min), 'The parameter min must be an integer');
|
|
16
|
+
assert(Number.isInteger(max), 'The parameter max must be an integer');
|
|
17
|
+
assert(min <= max, 'The parameter min must be less than or equal to the parameter max');
|
|
18
|
+
return Math.floor(remap(generator.next(), [0, 1], [min, max + 1]));
|
|
15
19
|
}
|
|
16
20
|
//# sourceMappingURL=random-int-inclusive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-int-inclusive.js","sourceRoot":"","sources":["../src/random-int-inclusive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"random-int-inclusive.js","sourceRoot":"","sources":["../src/random-int-inclusive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAW5C,MAAM,UAAU,kBAAkB,CAAC,GAAG,IAEyB;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAA;IACrE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAA;IACrE,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,mEAAmE,CAAC,CAAA;IAEvF,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CACf,CAAC,CAAA;AACJ,CAAC"}
|
package/lib/random-int.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { remap } from 'extra-utils';
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
3
|
+
import { assert } from '@blackglory/prelude';
|
|
3
4
|
export function randomInt(...args) {
|
|
4
5
|
let generator;
|
|
5
6
|
let min;
|
|
@@ -11,6 +12,9 @@ export function randomInt(...args) {
|
|
|
11
12
|
else {
|
|
12
13
|
[generator, min, max] = args;
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
assert(Number.isInteger(min), 'The parameter min must be an integer');
|
|
16
|
+
assert(Number.isInteger(max), 'The parameter max must be an integer');
|
|
17
|
+
assert(min < max, 'The parameter min must be less than the parameter max');
|
|
18
|
+
return Math.floor(remap(generator.next(), [0, 1], [min, max]));
|
|
15
19
|
}
|
|
16
20
|
//# sourceMappingURL=random-int.js.map
|
package/lib/random-int.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-int.js","sourceRoot":"","sources":["../src/random-int.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"random-int.js","sourceRoot":"","sources":["../src/random-int.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQ5C,MAAM,UAAU,SAAS,CAAC,GAAG,IAEkC;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAW,CAAA;IACf,IAAI,GAAW,CAAA;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9B,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAA;IACrE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAA;IACrE,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,uDAAuD,CAAC,CAAA;IAE1E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,GAAG,EAAE,GAAG,CAAC,CACX,CAAC,CAAA;AACJ,CAAC"}
|
package/lib/random-number.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude';
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js';
|
|
3
3
|
export declare function randomPickIndex(items: NonEmptyArray<unknown>): number;
|
|
4
4
|
export declare function randomPickIndex(generator: IRandomNumberGenerator, items: NonEmptyArray<unknown>): number;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude';
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js';
|
|
3
3
|
export declare function randomPickItem<T>(items: NonEmptyArray<T>): T;
|
|
4
4
|
export declare function randomPickItem<T>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude';
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js';
|
|
3
3
|
export declare function randomPickWeightedIndex(weights: NonEmptyArray<number>): number;
|
|
4
4
|
export declare function randomPickWeightedIndex(generator: IRandomNumberGenerator, weights: NonEmptyArray<number>): number;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude';
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js';
|
|
3
3
|
export interface IWeightedItem {
|
|
4
4
|
weight: number;
|
|
5
5
|
}
|
|
6
|
+
export declare function randomPickWeightedItem<T>(items: NonEmptyArray<T>, weights: NonEmptyArray<number>): T;
|
|
6
7
|
export declare function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T;
|
|
8
|
+
export declare function randomPickWeightedItem<T>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>, weights: NonEmptyArray<number>): T;
|
|
7
9
|
export declare function randomPickWeightedItem<T extends IWeightedItem>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
|
|
@@ -1,16 +1,34 @@
|
|
|
1
1
|
import { randomPickWeightedIndex } from './random-pick-weighted-index.js';
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
3
|
+
import { isArray } from 'extra-utils';
|
|
3
4
|
export function randomPickWeightedItem(...args) {
|
|
4
5
|
let generator;
|
|
5
6
|
let items;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
let weights;
|
|
8
|
+
switch (args.length) {
|
|
9
|
+
case 1: {
|
|
10
|
+
generator = nativeRandomNumberGenerator;
|
|
11
|
+
[items] = args;
|
|
12
|
+
weights = items.map(option => option.weight);
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
case 2: {
|
|
16
|
+
if (isArray(args[0])) {
|
|
17
|
+
generator = nativeRandomNumberGenerator;
|
|
18
|
+
[items, weights] = args;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
[generator, items] = args;
|
|
22
|
+
weights = items.map(option => option.weight);
|
|
23
|
+
}
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case 3: {
|
|
27
|
+
;
|
|
28
|
+
[generator, items, weights] = args;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
9
31
|
}
|
|
10
|
-
else {
|
|
11
|
-
[generator, items] = args;
|
|
12
|
-
}
|
|
13
|
-
const weights = items.map(option => option.weight);
|
|
14
32
|
const index = randomPickWeightedIndex(generator, weights);
|
|
15
33
|
return items[index];
|
|
16
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-pick-weighted-item.js","sourceRoot":"","sources":["../src/random-pick-weighted-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"random-pick-weighted-item.js","sourceRoot":"","sources":["../src/random-pick-weighted-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAoBrC,MAAM,UAAU,sBAAsB,CAA0B,GAAG,IAQL;IAE5D,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAuB,CAAA;IAC3B,IAAI,OAA8B,CAAA;IAElC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,SAAS,GAAG,2BAA2B,CACtC;YAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YACf,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;YAErE,MAAK;QACP,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,SAAS,GAAG,2BAA2B,CACtC;gBAAA,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,IAAiE,CAAA;YACvF,CAAC;iBAAM,CAAC;gBACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAGpB,CAAA;gBACD,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;YACvE,CAAC;YAED,MAAK;QACP,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,CAAC;YAAA,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;YAEnC,MAAK;QACP,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}
|
package/lib/shuffle.js
CHANGED
|
@@ -10,7 +10,7 @@ export function shuffle(...args) {
|
|
|
10
10
|
else {
|
|
11
11
|
[generator, arr] = args;
|
|
12
12
|
}
|
|
13
|
-
for (let targetIndex = arr.length - 1; targetIndex
|
|
13
|
+
for (let targetIndex = arr.length - 1; targetIndex >= 1; targetIndex--) {
|
|
14
14
|
const index = randomInt(generator, 0, targetIndex);
|
|
15
15
|
const temp = arr[targetIndex];
|
|
16
16
|
arr[targetIndex] = arr[index];
|
package/lib/shuffle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shuffle.js","sourceRoot":"","sources":["../src/shuffle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,UAAU,OAAO,CAAC,GAAG,IAE0B;IAEnD,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAc,CAAA;IAElB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACf,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACzB,CAAC;IAED,KAAK,IAAI,WAAW,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"shuffle.js","sourceRoot":"","sources":["../src/shuffle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,UAAU,OAAO,CAAC,GAAG,IAE0B;IAEnD,IAAI,SAAiC,CAAA;IACrC,IAAI,GAAc,CAAA;IAElB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACf,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IACzB,CAAC;IAED,KAAK,IAAI,WAAW,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;QAC7B,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACnB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-rand",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Yet another random library",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"random"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"sideEffects": false,
|
|
15
15
|
"type": "module",
|
|
16
16
|
"engines": {
|
|
17
|
-
"node": ">=
|
|
17
|
+
"node": ">=22"
|
|
18
18
|
},
|
|
19
19
|
"repository": "git@github.com:BlackGlory/extra-rand.git",
|
|
20
20
|
"author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"@commitlint/config-conventional": "^19.2.2",
|
|
40
40
|
"@eslint/js": "^9.0.0",
|
|
41
41
|
"eslint": "^9.0.0",
|
|
42
|
+
"extra-generator": "^0.7.1",
|
|
42
43
|
"husky": "^4.3.8",
|
|
43
44
|
"npm-run-all": "^4.1.5",
|
|
44
45
|
"rimraf": "^5.0.5",
|
|
@@ -53,8 +54,7 @@
|
|
|
53
54
|
"vitest": "^1.5.0"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"@blackglory/
|
|
57
|
-
"extra-utils": "^5.
|
|
58
|
-
"justypes": "^4.2.1"
|
|
57
|
+
"@blackglory/prelude": "^0.4.0",
|
|
58
|
+
"extra-utils": "^5.21.0"
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { remap } from 'extra-utils'
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js'
|
|
3
3
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
4
|
+
import { assert } from '@blackglory/prelude'
|
|
4
5
|
|
|
5
6
|
export function randomIntInclusive(
|
|
6
7
|
min: number
|
|
@@ -25,10 +26,13 @@ export function randomIntInclusive(...args:
|
|
|
25
26
|
} else {
|
|
26
27
|
[generator, min, max] = args
|
|
27
28
|
}
|
|
29
|
+
assert(Number.isInteger(min), 'The parameter min must be an integer')
|
|
30
|
+
assert(Number.isInteger(max), 'The parameter max must be an integer')
|
|
31
|
+
assert(min <= max, 'The parameter min must be less than or equal to the parameter max')
|
|
28
32
|
|
|
29
33
|
return Math.floor(remap(
|
|
30
34
|
generator.next()
|
|
31
35
|
, [0, 1]
|
|
32
|
-
, [
|
|
36
|
+
, [min, max + 1]
|
|
33
37
|
))
|
|
34
38
|
}
|
package/src/random-int.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { remap } from 'extra-utils'
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js'
|
|
3
3
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
4
|
+
import { assert } from '@blackglory/prelude'
|
|
4
5
|
|
|
5
6
|
export function randomInt(min: number, max: number): number
|
|
6
7
|
export function randomInt(
|
|
@@ -22,10 +23,13 @@ export function randomInt(...args:
|
|
|
22
23
|
} else {
|
|
23
24
|
[generator, min, max] = args
|
|
24
25
|
}
|
|
26
|
+
assert(Number.isInteger(min), 'The parameter min must be an integer')
|
|
27
|
+
assert(Number.isInteger(max), 'The parameter max must be an integer')
|
|
28
|
+
assert(min < max, 'The parameter min must be less than the parameter max')
|
|
25
29
|
|
|
26
30
|
return Math.floor(remap(
|
|
27
31
|
generator.next()
|
|
28
32
|
, [0, 1]
|
|
29
|
-
, [
|
|
33
|
+
, [min, max]
|
|
30
34
|
))
|
|
31
35
|
}
|
package/src/random-number.ts
CHANGED
package/src/random-pick-index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude'
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js'
|
|
3
3
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
4
4
|
import { randomInt } from './random-int.js'
|
package/src/random-pick-item.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude'
|
|
2
2
|
import { IRandomNumberGenerator } from './types.js'
|
|
3
3
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
4
4
|
import { randomPickIndex } from './random-pick-index.js'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NonEmptyArray } from '
|
|
1
|
+
import { NonEmptyArray } from '@blackglory/prelude'
|
|
2
2
|
import { remapToWeightedIndex } from 'extra-utils'
|
|
3
3
|
import { IRandomNumberGenerator } from './types.js'
|
|
4
4
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
@@ -1,32 +1,70 @@
|
|
|
1
1
|
import { randomPickWeightedIndex } from './random-pick-weighted-index.js'
|
|
2
|
-
import { NonEmptyArray } from '
|
|
2
|
+
import { NonEmptyArray } from '@blackglory/prelude'
|
|
3
3
|
import { IRandomNumberGenerator } from './types.js'
|
|
4
4
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
5
|
+
import { isArray } from 'extra-utils'
|
|
5
6
|
|
|
6
7
|
export interface IWeightedItem {
|
|
7
8
|
weight: number
|
|
8
9
|
}
|
|
9
10
|
|
|
11
|
+
export function randomPickWeightedItem<T>(
|
|
12
|
+
items: NonEmptyArray<T>
|
|
13
|
+
, weights: NonEmptyArray<number>
|
|
14
|
+
): T
|
|
10
15
|
export function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
|
|
16
|
+
export function randomPickWeightedItem<T>(
|
|
17
|
+
generator: IRandomNumberGenerator
|
|
18
|
+
, items: NonEmptyArray<T>
|
|
19
|
+
, weights: NonEmptyArray<number>
|
|
20
|
+
): T
|
|
11
21
|
export function randomPickWeightedItem<T extends IWeightedItem>(
|
|
12
22
|
generator: IRandomNumberGenerator
|
|
13
23
|
, items: NonEmptyArray<T>
|
|
14
24
|
): T
|
|
15
25
|
export function randomPickWeightedItem<T extends IWeightedItem>(...args:
|
|
26
|
+
| [items: NonEmptyArray<T>, weights: NonEmptyArray<number>]
|
|
16
27
|
| [items: NonEmptyArray<T>]
|
|
28
|
+
| [
|
|
29
|
+
generator: IRandomNumberGenerator
|
|
30
|
+
, items: NonEmptyArray<T>
|
|
31
|
+
, weights: NonEmptyArray<number>
|
|
32
|
+
]
|
|
17
33
|
| [generator: IRandomNumberGenerator, items: NonEmptyArray<T>]
|
|
18
34
|
): T {
|
|
19
35
|
let generator: IRandomNumberGenerator
|
|
20
36
|
let items: NonEmptyArray<T>
|
|
37
|
+
let weights: NonEmptyArray<number>
|
|
38
|
+
|
|
39
|
+
switch (args.length) {
|
|
40
|
+
case 1: {
|
|
41
|
+
generator = nativeRandomNumberGenerator
|
|
42
|
+
;[items] = args
|
|
43
|
+
weights = items.map(option => option.weight) as NonEmptyArray<number>
|
|
44
|
+
|
|
45
|
+
break
|
|
46
|
+
}
|
|
47
|
+
case 2: {
|
|
48
|
+
if (isArray(args[0])) {
|
|
49
|
+
generator = nativeRandomNumberGenerator
|
|
50
|
+
;[items, weights] = args as [items: NonEmptyArray<T>, weights: NonEmptyArray<number>]
|
|
51
|
+
} else {
|
|
52
|
+
[generator, items] = args as [
|
|
53
|
+
generator: IRandomNumberGenerator
|
|
54
|
+
, items: NonEmptyArray<T>
|
|
55
|
+
]
|
|
56
|
+
weights = items.map(option => option.weight) as NonEmptyArray<number>
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
break
|
|
60
|
+
}
|
|
61
|
+
case 3: {
|
|
62
|
+
;[generator, items, weights] = args
|
|
21
63
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
;[items] = args
|
|
25
|
-
} else {
|
|
26
|
-
[generator, items] = args
|
|
64
|
+
break
|
|
65
|
+
}
|
|
27
66
|
}
|
|
28
67
|
|
|
29
|
-
const weights = items.map(option => option.weight) as NonEmptyArray<number>
|
|
30
68
|
const index = randomPickWeightedIndex(generator, weights)
|
|
31
69
|
return items[index]
|
|
32
70
|
}
|
package/src/shuffle.ts
CHANGED
|
@@ -18,7 +18,7 @@ export function shuffle(...args:
|
|
|
18
18
|
[generator, arr] = args
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
for (let targetIndex = arr.length - 1; targetIndex
|
|
21
|
+
for (let targetIndex = arr.length - 1; targetIndex >= 1; targetIndex--) {
|
|
22
22
|
const index = randomInt(generator, 0, targetIndex)
|
|
23
23
|
const temp = arr[targetIndex]
|
|
24
24
|
arr[targetIndex] = arr[index]
|