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 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 `[Math.ceil(min), Math.floor(max))`.
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 `[Math.ceil(min), Math.floor(max)]`.
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
- return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max) + 1]));
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;AAWjF,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;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CACtC,CAAC,CAAA;AACJ,CAAC"}
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
- return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max)]));
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
@@ -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;AAQjF,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;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClC,CAAC,CAAA;AACJ,CAAC"}
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"}
@@ -1,4 +1,4 @@
1
- import { Getter, NonEmptyArray } from 'justypes';
1
+ import { Getter, NonEmptyArray } from '@blackglory/prelude';
2
2
  import { IRandomNumberGenerator } from './types.js';
3
3
  export declare enum NumberType {
4
4
  Float = 0,
@@ -1,4 +1,4 @@
1
- import { NonEmptyArray } from 'justypes';
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 'justypes';
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 'justypes';
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 'justypes';
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
- if (args.length === 1) {
7
- generator = nativeRandomNumberGenerator;
8
- [items] = args;
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;AAWjF,MAAM,UAAU,sBAAsB,CAA0B,GAAG,IAEL;IAE5D,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAuB,CAAA;IAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAA;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;IAC3E,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}
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 > 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];
@@ -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,GAAG,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC;QACtE,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"}
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.4.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": ">=18.17.0"
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/errors": "^3.0.3",
57
- "extra-utils": "^5.15.0",
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
- , [Math.ceil(min), Math.floor(max) + 1]
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
- , [Math.ceil(min), Math.floor(max)]
33
+ , [min, max]
30
34
  ))
31
35
  }
@@ -1,4 +1,4 @@
1
- import { Getter, NonEmptyArray } from 'justypes'
1
+ import { Getter, NonEmptyArray } from '@blackglory/prelude'
2
2
  import { isArray, isFunction, isNumber } from 'extra-utils'
3
3
  import { randomFloat } from './random-float.js'
4
4
  import { randomInt } from './random-int.js'
@@ -1,4 +1,4 @@
1
- import { NonEmptyArray } from 'justypes'
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'
@@ -1,4 +1,4 @@
1
- import { NonEmptyArray } from 'justypes'
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 'justypes'
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 'justypes'
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
- if (args.length === 1) {
23
- generator = nativeRandomNumberGenerator
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 > 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]