extra-rand 0.3.3 → 0.4.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.
Files changed (62) hide show
  1. package/README.md +52 -66
  2. package/lib/index.d.ts +6 -7
  3. package/lib/index.js +6 -7
  4. package/lib/index.js.map +1 -1
  5. package/lib/random-bool.js +2 -2
  6. package/lib/random-bool.js.map +1 -1
  7. package/lib/random-float.d.ts +3 -0
  8. package/lib/{random.js → random-float.js} +4 -4
  9. package/lib/random-float.js.map +1 -0
  10. package/lib/random-int-inclusive.js +2 -2
  11. package/lib/random-int-inclusive.js.map +1 -1
  12. package/lib/random-int.js +2 -2
  13. package/lib/random-int.js.map +1 -1
  14. package/lib/random-number.d.ts +17 -0
  15. package/lib/random-number.js +42 -0
  16. package/lib/random-number.js.map +1 -0
  17. package/lib/random-pick-index.d.ts +4 -0
  18. package/lib/random-pick-index.js +15 -0
  19. package/lib/random-pick-index.js.map +1 -0
  20. package/lib/random-pick-item.d.ts +4 -0
  21. package/lib/random-pick-item.js +16 -0
  22. package/lib/random-pick-item.js.map +1 -0
  23. package/lib/random-pick-weighted-index.d.ts +4 -0
  24. package/lib/{random-index-by-weight.js → random-pick-weighted-index.js} +4 -4
  25. package/lib/random-pick-weighted-index.js.map +1 -0
  26. package/lib/random-pick-weighted-item.d.ts +7 -0
  27. package/lib/random-pick-weighted-item.js +17 -0
  28. package/lib/random-pick-weighted-item.js.map +1 -0
  29. package/package.json +2 -2
  30. package/src/index.ts +6 -8
  31. package/src/random-bool.ts +2 -2
  32. package/src/{random.ts → random-float.ts} +7 -7
  33. package/src/random-int-inclusive.ts +4 -4
  34. package/src/random-int.ts +4 -4
  35. package/src/{random-by-model.ts → random-number.ts} +18 -18
  36. package/src/random-pick-index.ts +26 -0
  37. package/src/random-pick-item.ts +27 -0
  38. package/src/{random-index-by-weight.ts → random-pick-weighted-index.ts} +6 -6
  39. package/src/random-pick-weighted-item.ts +32 -0
  40. package/lib/map-to-index-by-weight.d.ts +0 -2
  41. package/lib/map-to-index-by-weight.js +0 -29
  42. package/lib/map-to-index-by-weight.js.map +0 -1
  43. package/lib/map-to-range.d.ts +0 -1
  44. package/lib/map-to-range.js +0 -5
  45. package/lib/map-to-range.js.map +0 -1
  46. package/lib/random-by-model.d.ts +0 -17
  47. package/lib/random-by-model.js +0 -42
  48. package/lib/random-by-model.js.map +0 -1
  49. package/lib/random-by-weight-model.d.ts +0 -8
  50. package/lib/random-by-weight-model.js +0 -16
  51. package/lib/random-by-weight-model.js.map +0 -1
  52. package/lib/random-index-by-weight.d.ts +0 -4
  53. package/lib/random-index-by-weight.js.map +0 -1
  54. package/lib/random-weighted.d.ts +0 -7
  55. package/lib/random-weighted.js +0 -17
  56. package/lib/random-weighted.js.map +0 -1
  57. package/lib/random.d.ts +0 -3
  58. package/lib/random.js.map +0 -1
  59. package/src/map-to-index-by-weight.ts +0 -36
  60. package/src/map-to-range.ts +0 -12
  61. package/src/random-by-weight-model.ts +0 -32
  62. package/src/random-weighted.ts +0 -32
package/README.md CHANGED
@@ -15,13 +15,13 @@ interface IRandomNumberGenerator {
15
15
  }
16
16
  ```
17
17
 
18
- ### random
18
+ ### randomFloat
19
19
  ```ts
20
- function random(min: number, max: number): number
21
- function random(generator: IRandomNumberGenerator, min: number, max: number): number
20
+ function randomFloat(min: number, max: number): number
21
+ function randomFloat(generator: IRandomNumberGenerator, min: number, max: number): number
22
22
  ```
23
23
 
24
- The function returns a number in the range `[min, max)`.
24
+ The function returns a float in the range `[min, max)`.
25
25
 
26
26
  ### randomInt
27
27
  ```ts
@@ -43,97 +43,83 @@ function randomIntInclusive(
43
43
 
44
44
  The function returns an integer in the range `[Math.ceil(min), Math.floor(max)]`.
45
45
 
46
- ### randomBool
47
- ```ts
48
- function randomBool(probabilityOfTrue: number): boolean
49
- function randomBool(generator: IRandomNumberGenerator, probabilityOfTrue: number): boolean
50
- ```
51
-
52
- ### randomIndexByWeight
53
- ```ts
54
- function randomIndexByWeight(weights: NonEmptyArray<number>): number
55
- function randomIndexByWeight(
56
- generator: IRandomNumberGenerator
57
- , weights: NonEmptyArray<number>
58
- ): number
59
- ```
60
-
61
- The function returns an index of one of weights.
62
-
63
- ### randomWeighted
64
- ```ts
65
- interface IWeighted {
66
- weight: number
67
- }
68
-
69
- function randomWeighted<T extends IWeighted>(values: NonEmptyArray<T>): T
70
- function randomWeighted<T extends IWeighted>(
71
- generator: IRandomNumberGenerator
72
- , values: NonEmptyArray<T>
73
- ): T
74
- ```
75
-
76
- ### randomByWeightModel
77
- ```ts
78
- type IWeightModel<T> = NonEmptyArray<{
79
- weight: number
80
- value: T
81
- }>
82
-
83
- function randomByWeightModel<T>(model: IWeightModel<T>): T
84
- function randomByWeightModel<T>(generator: IRandomNumberGenerator, model: IWeightModel<T>): T
85
- ```
86
-
87
- ### randomByModel
46
+ ### randomNumber
88
47
  ```ts
89
- enum Type {
48
+ enum NumberType {
90
49
  Float
91
50
  , Integer
92
51
  , IntegerInclusive
93
52
  }
94
53
 
95
- type IRandomModel =
54
+ type INumberModel =
96
55
  | number
97
56
  | Getter<number>
98
57
  | {
99
- type: Type
58
+ type: NumberType
100
59
  min: number
101
60
  max: number
102
61
  }
103
62
  | NonEmptyArray<{
104
63
  weight: number
105
- value: IRandomModel
64
+ model: INumberModel
106
65
  }>
107
66
 
67
+ function randomNumber(model: INumberModel): number
68
+ function randomNumber(generator: IRandomNumberGenerator, model: INumberModel): number
69
+ ```
108
70
 
109
- function randomByModel(model: IRandomModel): number
110
- function randomByModel(generator: IRandomNumberGenerator, model: IRandomModel): number
71
+ ### randomBool
72
+ ```ts
73
+ function randomBool(probabilityOfTrue: number): boolean
74
+ function randomBool(generator: IRandomNumberGenerator, probabilityOfTrue: number): boolean
111
75
  ```
112
76
 
113
- ### shuffle
77
+ ### randomPickItem
114
78
  ```ts
115
- function shuffle(arr: unknown[]): void
116
- function shuffle(generator: IRandomNumberGenerator, arr: unknown[]): void
79
+ function randomPickItem<T>(items: NonEmptyArray<T>): T
80
+ function randomPickItem<T>(
81
+ generator: IRandomNumberGenerator
82
+ , items: NonEmptyArray<T>
83
+ ): T
84
+ ```
85
+
86
+ ### randomPickWeightedItem
87
+ ```ts
88
+ interface IWeightedItem {
89
+ weight: number
90
+ }
91
+
92
+ function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
93
+ function randomPickWeightedItem<T extends IWeightedItem>(
94
+ generator: IRandomNumberGenerator
95
+ , items: NonEmptyArray<T>
96
+ ): T
117
97
  ```
118
98
 
119
- ### mapToRange
99
+ ### randomPickIndex
120
100
  ```ts
121
- function mapToRange(
122
- value: number
123
- , oldMin: number, oldMax: number
124
- , newMin: number, newMax: number
101
+ function randomPickIndex(items: NonEmptyArray<unknown>): number
102
+ function randomPickIndex(
103
+ generator: IRandomNumberGenerator
104
+ , items: NonEmptyArray<unknown>
125
105
  ): number
126
106
  ```
127
107
 
128
- A low-level function helps you to use random number generators other than `Math.random()`.
108
+ The function returns an integer in the range `[0, items.length]`.
129
109
 
130
- ### mapToIndexByWeight
110
+ ### randomPickWeightedIndex
131
111
  ```ts
132
- function mapToIndexByWeight(
133
- value: number
134
- , oldMin: number, oldMax: number
112
+ function randomPickWeightedIndex(weights: NonEmptyArray<number>): number
113
+ function randomPickWeightedIndex(
114
+ generator: IRandomNumberGenerator
135
115
  , weights: NonEmptyArray<number>
136
116
  ): number
137
117
  ```
138
118
 
139
- A low-level function helps you to use random number generators other than `Math.random()`.
119
+ The function returns an integer in the range `[0, weights.length]`.
120
+
121
+ ### shuffle
122
+ ```ts
123
+ function shuffle(arr: unknown[]): void
124
+ function shuffle(generator: IRandomNumberGenerator, arr: unknown[]): void
125
+ ```
package/lib/index.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  export * from './types.js';
2
- export * from './random.js';
2
+ export * from './random-float.js';
3
3
  export * from './random-int.js';
4
4
  export * from './random-int-inclusive.js';
5
+ export * from './random-number.js';
5
6
  export * from './random-bool.js';
6
- export * from './random-index-by-weight.js';
7
- export * from './random-weighted.js';
8
- export * from './random-by-weight-model.js';
9
- export * from './random-by-model.js';
7
+ export * from './random-pick-item.js';
8
+ export * from './random-pick-weighted-item.js';
9
+ export * from './random-pick-index.js';
10
+ export * from './random-pick-weighted-index.js';
10
11
  export * from './shuffle.js';
11
- export * from './map-to-range.js';
12
- export * from './map-to-index-by-weight.js';
package/lib/index.js CHANGED
@@ -1,13 +1,12 @@
1
1
  export * from './types.js';
2
- export * from './random.js';
2
+ export * from './random-float.js';
3
3
  export * from './random-int.js';
4
4
  export * from './random-int-inclusive.js';
5
+ export * from './random-number.js';
5
6
  export * from './random-bool.js';
6
- export * from './random-index-by-weight.js';
7
- export * from './random-weighted.js';
8
- export * from './random-by-weight-model.js';
9
- export * from './random-by-model.js';
7
+ export * from './random-pick-item.js';
8
+ export * from './random-pick-weighted-item.js';
9
+ export * from './random-pick-index.js';
10
+ export * from './random-pick-weighted-index.js';
10
11
  export * from './shuffle.js';
11
- export * from './map-to-range.js';
12
- export * from './map-to-index-by-weight.js';
13
12
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAE5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,6BAA6B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,cAAc,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
- import { random } from './random.js';
2
+ import { randomFloat } from './random-float.js';
3
3
  export function randomBool(...args) {
4
4
  let generator;
5
5
  let probabilityOfTrue;
@@ -10,6 +10,6 @@ export function randomBool(...args) {
10
10
  else {
11
11
  [generator, probabilityOfTrue] = args;
12
12
  }
13
- return random(generator, 0, 1) < probabilityOfTrue;
13
+ return randomFloat(generator, 0, 1) < probabilityOfTrue;
14
14
  }
15
15
  //# sourceMappingURL=random-bool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"random-bool.js","sourceRoot":"","sources":["../src/random-bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOpC,MAAM,UAAU,UAAU,CAAC,GAAG,IAEkC;IAE9D,IAAI,SAAiC,CAAA;IACrC,IAAI,iBAAyB,CAAA;IAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAA;IACvC,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"random-bool.js","sourceRoot":"","sources":["../src/random-bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,MAAM,UAAU,UAAU,CAAC,GAAG,IAEkC;IAE9D,IAAI,SAAiC,CAAA;IACrC,IAAI,iBAAyB,CAAA;IAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAA;IACvC,CAAC;IAED,OAAO,WAAW,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAA;AACzD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { IRandomNumberGenerator } from './types.js';
2
+ export declare function randomFloat(min: number, max: number): number;
3
+ export declare function randomFloat(generator: IRandomNumberGenerator, min: number, max: number): number;
@@ -1,6 +1,6 @@
1
- import { mapToRange } from './map-to-range.js';
1
+ import { remap } from 'extra-utils';
2
2
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
- export function random(...args) {
3
+ export function randomFloat(...args) {
4
4
  let generator;
5
5
  let min;
6
6
  let max;
@@ -11,6 +11,6 @@ export function random(...args) {
11
11
  else {
12
12
  [generator, min, max] = args;
13
13
  }
14
- return mapToRange(generator.next(), 0, 1, min, max);
14
+ return remap(generator.next(), [0, 1], [min, max]);
15
15
  }
16
- //# sourceMappingURL=random.js.map
16
+ //# sourceMappingURL=random-float.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-float.js","sourceRoot":"","sources":["../src/random-float.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAQjF,MAAM,UAAU,WAAW,CAAC,GAAG,IAEgC;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,KAAK,CACV,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,GAAG,EAAE,GAAG,CAAC,CACX,CAAA;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import { mapToRange } from './map-to-range.js';
1
+ import { remap } from 'extra-utils';
2
2
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
3
  export function randomIntInclusive(...args) {
4
4
  let generator;
@@ -11,6 +11,6 @@ export function randomIntInclusive(...args) {
11
11
  else {
12
12
  [generator, min, max] = args;
13
13
  }
14
- return Math.floor(mapToRange(generator.next(), 0, 1, Math.ceil(min), Math.floor(max) + 1));
14
+ return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max) + 1]));
15
15
  }
16
16
  //# 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,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,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,UAAU,CAC1B,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,EAAE,CAAC,EACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CACpC,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;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"}
package/lib/random-int.js CHANGED
@@ -1,4 +1,4 @@
1
- import { mapToRange } from './map-to-range.js';
1
+ import { remap } from 'extra-utils';
2
2
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
3
  export function randomInt(...args) {
4
4
  let generator;
@@ -11,6 +11,6 @@ export function randomInt(...args) {
11
11
  else {
12
12
  [generator, min, max] = args;
13
13
  }
14
- return Math.floor(mapToRange(generator.next(), 0, 1, Math.ceil(min), Math.floor(max)));
14
+ return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max)]));
15
15
  }
16
16
  //# 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,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,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,UAAU,CAC1B,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,EAAE,CAAC,EACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAChC,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;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"}
@@ -0,0 +1,17 @@
1
+ import { Getter, NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare enum NumberType {
4
+ Float = 0,
5
+ Integer = 1,
6
+ IntegerInclusive = 2
7
+ }
8
+ export type INumberModel = number | Getter<number> | {
9
+ type: NumberType;
10
+ min: number;
11
+ max: number;
12
+ } | NonEmptyArray<{
13
+ weight: number;
14
+ model: INumberModel;
15
+ }>;
16
+ export declare function randomNumber(model: INumberModel): number;
17
+ export declare function randomNumber(generator: IRandomNumberGenerator, model: INumberModel): number;
@@ -0,0 +1,42 @@
1
+ import { isArray, isFunction, isNumber } from 'extra-utils';
2
+ import { randomFloat } from './random-float.js';
3
+ import { randomInt } from './random-int.js';
4
+ import { randomIntInclusive } from './random-int-inclusive.js';
5
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
6
+ import { randomPickWeightedItem } from './random-pick-weighted-item.js';
7
+ export var NumberType;
8
+ (function (NumberType) {
9
+ NumberType[NumberType["Float"] = 0] = "Float";
10
+ NumberType[NumberType["Integer"] = 1] = "Integer";
11
+ NumberType[NumberType["IntegerInclusive"] = 2] = "IntegerInclusive";
12
+ })(NumberType || (NumberType = {}));
13
+ export function randomNumber(...args) {
14
+ let generator;
15
+ let model;
16
+ if (args.length === 1) {
17
+ generator = nativeRandomNumberGenerator;
18
+ [model] = args;
19
+ }
20
+ else {
21
+ [generator, model] = args;
22
+ }
23
+ if (isNumber(model)) {
24
+ return model;
25
+ }
26
+ else if (isFunction(model)) {
27
+ return model();
28
+ }
29
+ else if (isArray(model)) {
30
+ const item = randomPickWeightedItem(generator, model);
31
+ return randomNumber(generator, item.model);
32
+ }
33
+ else {
34
+ const { type, min, max } = model;
35
+ switch (type) {
36
+ case NumberType.Float: return randomFloat(generator, min, max);
37
+ case NumberType.Integer: return randomInt(generator, min, max);
38
+ case NumberType.IntegerInclusive: return randomIntInclusive(generator, min, max);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=random-number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-number.js","sourceRoot":"","sources":["../src/random-number.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,6CAAK,CAAA;IACL,iDAAO,CAAA;IACP,mEAAgB,CAAA;AAClB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAoBD,MAAM,UAAU,YAAY,CAAC,GAAG,IAE0B;IAExD,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAmB,CAAA;IAEvB,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,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,EAAE,CAAA;IAChB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACrD,OAAO,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;QAChC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAC9D,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAC9D,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAC,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare function randomPickIndex(items: NonEmptyArray<unknown>): number;
4
+ export declare function randomPickIndex(generator: IRandomNumberGenerator, items: NonEmptyArray<unknown>): number;
@@ -0,0 +1,15 @@
1
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
+ import { randomInt } from './random-int.js';
3
+ export function randomPickIndex(...args) {
4
+ let generator;
5
+ let items;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [items] = args;
9
+ }
10
+ else {
11
+ [generator, items] = args;
12
+ }
13
+ return randomInt(generator, 0, items.length);
14
+ }
15
+ //# sourceMappingURL=random-pick-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-pick-index.js","sourceRoot":"","sources":["../src/random-pick-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAO3C,MAAM,UAAU,eAAe,CAAC,GAAG,IAEiC;IAElE,IAAI,SAAiC,CAAA;IACrC,IAAI,KAA6B,CAAA;IAEjC,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,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare function randomPickItem<T>(items: NonEmptyArray<T>): T;
4
+ export declare function randomPickItem<T>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
@@ -0,0 +1,16 @@
1
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
2
+ import { randomPickIndex } from './random-pick-index.js';
3
+ export function randomPickItem(...args) {
4
+ let generator;
5
+ let items;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [items] = args;
9
+ }
10
+ else {
11
+ [generator, items] = args;
12
+ }
13
+ const index = randomPickIndex(generator, items);
14
+ return items[index];
15
+ }
16
+ //# sourceMappingURL=random-pick-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-pick-item.js","sourceRoot":"","sources":["../src/random-pick-item.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAOxD,MAAM,UAAU,cAAc,CAAI,GAAG,IAEyB;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,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export declare function randomPickWeightedIndex(weights: NonEmptyArray<number>): number;
4
+ export declare function randomPickWeightedIndex(generator: IRandomNumberGenerator, weights: NonEmptyArray<number>): number;
@@ -1,6 +1,6 @@
1
- import { mapToIndexByWeight } from './map-to-index-by-weight.js';
1
+ import { remapToWeightedIndex } from 'extra-utils';
2
2
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
- export function randomIndexByWeight(...args) {
3
+ export function randomPickWeightedIndex(...args) {
4
4
  let generator;
5
5
  let weights;
6
6
  if (args.length === 1) {
@@ -10,6 +10,6 @@ export function randomIndexByWeight(...args) {
10
10
  else {
11
11
  [generator, weights] = args;
12
12
  }
13
- return mapToIndexByWeight(generator.next(), 0, 1, weights);
13
+ return remapToWeightedIndex(generator.next(), [0, 1], weights);
14
14
  }
15
- //# sourceMappingURL=random-index-by-weight.js.map
15
+ //# sourceMappingURL=random-pick-weighted-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-pick-weighted-index.js","sourceRoot":"","sources":["../src/random-pick-weighted-index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAOjF,MAAM,UAAU,uBAAuB,CAAC,GAAG,IAE0B;IAEnE,IAAI,SAAiC,CAAA;IACrC,IAAI,OAA8B,CAAA;IAElC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACnB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;IAED,OAAO,oBAAoB,CACzB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,OAAO,CACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { NonEmptyArray } from 'justypes';
2
+ import { IRandomNumberGenerator } from './types.js';
3
+ export interface IWeightedItem {
4
+ weight: number;
5
+ }
6
+ export declare function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T;
7
+ export declare function randomPickWeightedItem<T extends IWeightedItem>(generator: IRandomNumberGenerator, items: NonEmptyArray<T>): T;
@@ -0,0 +1,17 @@
1
+ import { randomPickWeightedIndex } from './random-pick-weighted-index.js';
2
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
+ export function randomPickWeightedItem(...args) {
4
+ let generator;
5
+ let items;
6
+ if (args.length === 1) {
7
+ generator = nativeRandomNumberGenerator;
8
+ [items] = args;
9
+ }
10
+ else {
11
+ [generator, items] = args;
12
+ }
13
+ const weights = items.map(option => option.weight);
14
+ const index = randomPickWeightedIndex(generator, weights);
15
+ return items[index];
16
+ }
17
+ //# sourceMappingURL=random-pick-weighted-item.js.map
@@ -0,0 +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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-rand",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Yet another random library",
5
5
  "keywords": [
6
6
  "random"
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@blackglory/errors": "^3.0.3",
57
- "extra-utils": "^5.10.0",
57
+ "extra-utils": "^5.15.0",
58
58
  "justypes": "^4.2.1"
59
59
  }
60
60
  }
package/src/index.ts CHANGED
@@ -1,14 +1,12 @@
1
1
  export * from './types.js'
2
2
 
3
- export * from './random.js'
3
+ export * from './random-float.js'
4
4
  export * from './random-int.js'
5
5
  export * from './random-int-inclusive.js'
6
+ export * from './random-number.js'
6
7
  export * from './random-bool.js'
7
- export * from './random-index-by-weight.js'
8
- export * from './random-weighted.js'
9
- export * from './random-by-weight-model.js'
10
- export * from './random-by-model.js'
8
+ export * from './random-pick-item.js'
9
+ export * from './random-pick-weighted-item.js'
10
+ export * from './random-pick-index.js'
11
+ export * from './random-pick-weighted-index.js'
11
12
  export * from './shuffle.js'
12
-
13
- export * from './map-to-range.js'
14
- export * from './map-to-index-by-weight.js'
@@ -1,6 +1,6 @@
1
1
  import { IRandomNumberGenerator } from './types.js'
2
2
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
3
- import { random } from './random.js'
3
+ import { randomFloat } from './random-float.js'
4
4
 
5
5
  export function randomBool(probabilityOfTrue: number): boolean
6
6
  export function randomBool(
@@ -21,5 +21,5 @@ export function randomBool(...args:
21
21
  [generator, probabilityOfTrue] = args
22
22
  }
23
23
 
24
- return random(generator, 0, 1) < probabilityOfTrue
24
+ return randomFloat(generator, 0, 1) < probabilityOfTrue
25
25
  }
@@ -1,14 +1,14 @@
1
- import { mapToRange } from './map-to-range.js'
1
+ import { remap } from 'extra-utils'
2
2
  import { IRandomNumberGenerator } from './types.js'
3
3
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
4
4
 
5
- export function random(min: number, max: number): number
6
- export function random(
5
+ export function randomFloat(min: number, max: number): number
6
+ export function randomFloat(
7
7
  generator: IRandomNumberGenerator
8
8
  , min: number
9
9
  , max: number
10
10
  ): number
11
- export function random(...args:
11
+ export function randomFloat(...args:
12
12
  | [min: number, max: number]
13
13
  | [generator: IRandomNumberGenerator, min: number, max: number]
14
14
  ): number {
@@ -23,9 +23,9 @@ export function random(...args:
23
23
  [generator, min, max] = args
24
24
  }
25
25
 
26
- return mapToRange(
26
+ return remap(
27
27
  generator.next()
28
- , 0, 1
29
- , min, max
28
+ , [0, 1]
29
+ , [min, max]
30
30
  )
31
31
  }
@@ -1,4 +1,4 @@
1
- import { mapToRange } from './map-to-range.js'
1
+ import { remap } from 'extra-utils'
2
2
  import { IRandomNumberGenerator } from './types.js'
3
3
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
4
4
 
@@ -26,9 +26,9 @@ export function randomIntInclusive(...args:
26
26
  [generator, min, max] = args
27
27
  }
28
28
 
29
- return Math.floor(mapToRange(
29
+ return Math.floor(remap(
30
30
  generator.next()
31
- , 0, 1
32
- , Math.ceil(min), Math.floor(max) + 1
31
+ , [0, 1]
32
+ , [Math.ceil(min), Math.floor(max) + 1]
33
33
  ))
34
34
  }
package/src/random-int.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { mapToRange } from './map-to-range.js'
1
+ import { remap } from 'extra-utils'
2
2
  import { IRandomNumberGenerator } from './types.js'
3
3
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
4
4
 
@@ -23,9 +23,9 @@ export function randomInt(...args:
23
23
  [generator, min, max] = args
24
24
  }
25
25
 
26
- return Math.floor(mapToRange(
26
+ return Math.floor(remap(
27
27
  generator.next()
28
- , 0, 1
29
- , Math.ceil(min), Math.floor(max)
28
+ , [0, 1]
29
+ , [Math.ceil(min), Math.floor(max)]
30
30
  ))
31
31
  }
@@ -1,42 +1,42 @@
1
1
  import { Getter, NonEmptyArray } from 'justypes'
2
2
  import { isArray, isFunction, isNumber } from 'extra-utils'
3
- import { randomByWeightModel } from './random-by-weight-model.js'
4
- import { random } from './random.js'
3
+ import { randomFloat } from './random-float.js'
5
4
  import { randomInt } from './random-int.js'
6
5
  import { randomIntInclusive } from './random-int-inclusive.js'
7
6
  import { IRandomNumberGenerator } from './types.js'
8
7
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
8
+ import { randomPickWeightedItem } from './random-pick-weighted-item.js'
9
9
 
10
- export enum Type {
10
+ export enum NumberType {
11
11
  Float
12
12
  , Integer
13
13
  , IntegerInclusive
14
14
  }
15
15
 
16
- export type IRandomModel =
16
+ export type INumberModel =
17
17
  | number
18
18
  | Getter<number>
19
19
  | {
20
- type: Type
20
+ type: NumberType
21
21
  min: number
22
22
  max: number
23
23
  }
24
24
  | NonEmptyArray<{
25
25
  weight: number
26
- value: IRandomModel
26
+ model: INumberModel
27
27
  }>
28
28
 
29
- export function randomByModel(model: IRandomModel): number
30
- export function randomByModel(
29
+ export function randomNumber(model: INumberModel): number
30
+ export function randomNumber(
31
31
  generator: IRandomNumberGenerator
32
- , model: IRandomModel
32
+ , model: INumberModel
33
33
  ): number
34
- export function randomByModel(...args:
35
- | [model: IRandomModel]
36
- | [generator: IRandomNumberGenerator, model: IRandomModel]
34
+ export function randomNumber(...args:
35
+ | [model: INumberModel]
36
+ | [generator: IRandomNumberGenerator, model: INumberModel]
37
37
  ): number {
38
38
  let generator: IRandomNumberGenerator
39
- let model: IRandomModel
39
+ let model: INumberModel
40
40
 
41
41
  if (args.length === 1) {
42
42
  generator = nativeRandomNumberGenerator
@@ -50,14 +50,14 @@ export function randomByModel(...args:
50
50
  } else if (isFunction(model)) {
51
51
  return model()
52
52
  } else if (isArray(model)) {
53
- const subModel = randomByWeightModel(generator, model)
54
- return randomByModel(generator, subModel)
53
+ const item = randomPickWeightedItem(generator, model)
54
+ return randomNumber(generator, item.model)
55
55
  } else {
56
56
  const { type, min, max } = model
57
57
  switch (type) {
58
- case Type.Float: return random(generator, min, max)
59
- case Type.Integer: return randomInt(generator, min, max)
60
- case Type.IntegerInclusive: return randomIntInclusive(generator, min, max)
58
+ case NumberType.Float: return randomFloat(generator, min, max)
59
+ case NumberType.Integer: return randomInt(generator, min, max)
60
+ case NumberType.IntegerInclusive: return randomIntInclusive(generator, min, max)
61
61
  }
62
62
  }
63
63
  }
@@ -0,0 +1,26 @@
1
+ import { NonEmptyArray } from 'justypes'
2
+ import { IRandomNumberGenerator } from './types.js'
3
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
4
+ import { randomInt } from './random-int.js'
5
+
6
+ export function randomPickIndex(items: NonEmptyArray<unknown>): number
7
+ export function randomPickIndex(
8
+ generator: IRandomNumberGenerator
9
+ , items: NonEmptyArray<unknown>
10
+ ): number
11
+ export function randomPickIndex(...args:
12
+ | [items: NonEmptyArray<unknown>]
13
+ | [generator: IRandomNumberGenerator, items: NonEmptyArray<unknown>]
14
+ ): number {
15
+ let generator: IRandomNumberGenerator
16
+ let items: NonEmptyArray<unknown>
17
+
18
+ if (args.length === 1) {
19
+ generator = nativeRandomNumberGenerator
20
+ ;[items] = args
21
+ } else {
22
+ [generator, items] = args
23
+ }
24
+
25
+ return randomInt(generator, 0, items.length)
26
+ }
@@ -0,0 +1,27 @@
1
+ import { NonEmptyArray } from 'justypes'
2
+ import { IRandomNumberGenerator } from './types.js'
3
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
4
+ import { randomPickIndex } from './random-pick-index.js'
5
+
6
+ export function randomPickItem<T>(items: NonEmptyArray<T>): T
7
+ export function randomPickItem<T>(
8
+ generator: IRandomNumberGenerator
9
+ , items: NonEmptyArray<T>
10
+ ): T
11
+ export function randomPickItem<T>(...args:
12
+ | [items: NonEmptyArray<T>]
13
+ | [generator: IRandomNumberGenerator, items: NonEmptyArray<T>]
14
+ ): T {
15
+ let generator: IRandomNumberGenerator
16
+ let items: NonEmptyArray<T>
17
+
18
+ if (args.length === 1) {
19
+ generator = nativeRandomNumberGenerator
20
+ ;[items] = args
21
+ } else {
22
+ [generator, items] = args
23
+ }
24
+
25
+ const index = randomPickIndex(generator, items)
26
+ return items[index]
27
+ }
@@ -1,14 +1,14 @@
1
1
  import { NonEmptyArray } from 'justypes'
2
- import { mapToIndexByWeight } from './map-to-index-by-weight.js'
2
+ import { remapToWeightedIndex } from 'extra-utils'
3
3
  import { IRandomNumberGenerator } from './types.js'
4
4
  import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
5
5
 
6
- export function randomIndexByWeight(weights: NonEmptyArray<number>): number
7
- export function randomIndexByWeight(
6
+ export function randomPickWeightedIndex(weights: NonEmptyArray<number>): number
7
+ export function randomPickWeightedIndex(
8
8
  generator: IRandomNumberGenerator
9
9
  , weights: NonEmptyArray<number>
10
10
  ): number
11
- export function randomIndexByWeight(...args:
11
+ export function randomPickWeightedIndex(...args:
12
12
  | [weights: NonEmptyArray<number>]
13
13
  | [generator: IRandomNumberGenerator, weights: NonEmptyArray<number>]
14
14
  ): number {
@@ -22,9 +22,9 @@ export function randomIndexByWeight(...args:
22
22
  [generator, weights] = args
23
23
  }
24
24
 
25
- return mapToIndexByWeight(
25
+ return remapToWeightedIndex(
26
26
  generator.next()
27
- , 0, 1
27
+ , [0, 1]
28
28
  , weights
29
29
  )
30
30
  }
@@ -0,0 +1,32 @@
1
+ import { randomPickWeightedIndex } from './random-pick-weighted-index.js'
2
+ import { NonEmptyArray } from 'justypes'
3
+ import { IRandomNumberGenerator } from './types.js'
4
+ import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
5
+
6
+ export interface IWeightedItem {
7
+ weight: number
8
+ }
9
+
10
+ export function randomPickWeightedItem<T extends IWeightedItem>(items: NonEmptyArray<T>): T
11
+ export function randomPickWeightedItem<T extends IWeightedItem>(
12
+ generator: IRandomNumberGenerator
13
+ , items: NonEmptyArray<T>
14
+ ): T
15
+ export function randomPickWeightedItem<T extends IWeightedItem>(...args:
16
+ | [items: NonEmptyArray<T>]
17
+ | [generator: IRandomNumberGenerator, items: NonEmptyArray<T>]
18
+ ): T {
19
+ let generator: IRandomNumberGenerator
20
+ let items: NonEmptyArray<T>
21
+
22
+ if (args.length === 1) {
23
+ generator = nativeRandomNumberGenerator
24
+ ;[items] = args
25
+ } else {
26
+ [generator, items] = args
27
+ }
28
+
29
+ const weights = items.map(option => option.weight) as NonEmptyArray<number>
30
+ const index = randomPickWeightedIndex(generator, weights)
31
+ return items[index]
32
+ }
@@ -1,2 +0,0 @@
1
- import { NonEmptyArray } from 'justypes';
2
- export declare function mapToIndexByWeight(value: number, oldMin: number, oldMax: number, weights: NonEmptyArray<number>): number;
@@ -1,29 +0,0 @@
1
- import { mapToRange } from './map-to-range.js';
2
- export function mapToIndexByWeight(value, oldMin, oldMax, weights) {
3
- const newMin = 0;
4
- const newMax = weights.reduce((acc, cur) => acc + Math.max(cur, 0));
5
- if (newMax === 0) {
6
- const index = Math.floor(mapToRange(value, oldMin, oldMax, newMin, weights.length));
7
- return index === weights.length
8
- ? weights.length - 1
9
- : index;
10
- }
11
- else {
12
- const newValue = mapToRange(value, oldMin, oldMax, newMin, newMax);
13
- let remains = newMax;
14
- for (let i = weights.length; i--;) {
15
- const weight = weights[i];
16
- if (weight <= 0) {
17
- continue;
18
- }
19
- else {
20
- remains -= weight;
21
- if (newValue >= remains) {
22
- return i;
23
- }
24
- }
25
- }
26
- throw new Error('Impossible route');
27
- }
28
- }
29
- //# sourceMappingURL=map-to-index-by-weight.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"map-to-index-by-weight.js","sourceRoot":"","sources":["../src/map-to-index-by-weight.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,MAAc,EAAE,MAAc,EAC9B,OAA8B;IAE9B,MAAM,MAAM,GAAG,CAAC,CAAA;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IACnE,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAEnF,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM;YAC1B,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC,KAAK,CAAA;IACd,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAElE,IAAI,OAAO,GAAG,MAAM,CAAA;QACpB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC;YAClC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACzB,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChB,SAAQ;YACV,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,MAAM,CAAA;gBACjB,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;oBACxB,OAAO,CAAC,CAAA;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- export declare function mapToRange(value: number, oldMin: number, oldMax: number, newMin: number, newMax: number): number;
@@ -1,5 +0,0 @@
1
- import { remap } from 'extra-utils';
2
- export function mapToRange(value, oldMin, oldMax, newMin, newMax) {
3
- return remap(value, [oldMin, oldMax], [newMin, newMax]);
4
- }
5
- //# sourceMappingURL=map-to-range.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"map-to-range.js","sourceRoot":"","sources":["../src/map-to-range.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAKnC,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,MAAc,EAAE,MAAc,EAC9B,MAAc,EAAE,MAAc;IAE9B,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AACzD,CAAC"}
@@ -1,17 +0,0 @@
1
- import { Getter, NonEmptyArray } from 'justypes';
2
- import { IRandomNumberGenerator } from './types.js';
3
- export declare enum Type {
4
- Float = 0,
5
- Integer = 1,
6
- IntegerInclusive = 2
7
- }
8
- export type IRandomModel = number | Getter<number> | {
9
- type: Type;
10
- min: number;
11
- max: number;
12
- } | NonEmptyArray<{
13
- weight: number;
14
- value: IRandomModel;
15
- }>;
16
- export declare function randomByModel(model: IRandomModel): number;
17
- export declare function randomByModel(generator: IRandomNumberGenerator, model: IRandomModel): number;
@@ -1,42 +0,0 @@
1
- import { isArray, isFunction, isNumber } from 'extra-utils';
2
- import { randomByWeightModel } from './random-by-weight-model.js';
3
- import { random } from './random.js';
4
- import { randomInt } from './random-int.js';
5
- import { randomIntInclusive } from './random-int-inclusive.js';
6
- import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
7
- export var Type;
8
- (function (Type) {
9
- Type[Type["Float"] = 0] = "Float";
10
- Type[Type["Integer"] = 1] = "Integer";
11
- Type[Type["IntegerInclusive"] = 2] = "IntegerInclusive";
12
- })(Type || (Type = {}));
13
- export function randomByModel(...args) {
14
- let generator;
15
- let model;
16
- if (args.length === 1) {
17
- generator = nativeRandomNumberGenerator;
18
- [model] = args;
19
- }
20
- else {
21
- [generator, model] = args;
22
- }
23
- if (isNumber(model)) {
24
- return model;
25
- }
26
- else if (isFunction(model)) {
27
- return model();
28
- }
29
- else if (isArray(model)) {
30
- const subModel = randomByWeightModel(generator, model);
31
- return randomByModel(generator, subModel);
32
- }
33
- else {
34
- const { type, min, max } = model;
35
- switch (type) {
36
- case Type.Float: return random(generator, min, max);
37
- case Type.Integer: return randomInt(generator, min, max);
38
- case Type.IntegerInclusive: return randomIntInclusive(generator, min, max);
39
- }
40
- }
41
- }
42
- //# sourceMappingURL=random-by-model.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random-by-model.js","sourceRoot":"","sources":["../src/random-by-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAEjF,MAAM,CAAN,IAAY,IAIX;AAJD,WAAY,IAAI;IACd,iCAAK,CAAA;IACL,qCAAO,CAAA;IACP,uDAAgB,CAAA;AAClB,CAAC,EAJW,IAAI,KAAJ,IAAI,QAIf;AAoBD,MAAM,UAAU,aAAa,CAAC,GAAG,IAEyB;IAExD,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAmB,CAAA;IAEvB,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,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,EAAE,CAAA;IAChB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACtD,OAAO,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;QAChC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACnD,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACxD,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,8 +0,0 @@
1
- import { NonEmptyArray } from 'justypes';
2
- import { IRandomNumberGenerator } from './types.js';
3
- export type IWeightModel<T> = NonEmptyArray<{
4
- weight: number;
5
- value: T;
6
- }>;
7
- export declare function randomByWeightModel<T>(model: IWeightModel<T>): T;
8
- export declare function randomByWeightModel<T>(generator: IRandomNumberGenerator, model: IWeightModel<T>): T;
@@ -1,16 +0,0 @@
1
- import { randomWeighted } from './random-weighted.js';
2
- import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
- export function randomByWeightModel(...args) {
4
- let generator;
5
- let model;
6
- if (args.length === 1) {
7
- generator = nativeRandomNumberGenerator;
8
- [model] = args;
9
- }
10
- else {
11
- [generator, model] = args;
12
- }
13
- const { value } = randomWeighted(generator, model);
14
- return value;
15
- }
16
- //# sourceMappingURL=random-by-weight-model.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random-by-weight-model.js","sourceRoot":"","sources":["../src/random-by-weight-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAYjF,MAAM,UAAU,mBAAmB,CAAI,GAAG,IAEmB;IAE3D,IAAI,SAAiC,CAAA;IACrC,IAAI,KAAsB,CAAA;IAE1B,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,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAClD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -1,4 +0,0 @@
1
- import { NonEmptyArray } from 'justypes';
2
- import { IRandomNumberGenerator } from './types.js';
3
- export declare function randomIndexByWeight(weights: NonEmptyArray<number>): number;
4
- export declare function randomIndexByWeight(generator: IRandomNumberGenerator, weights: NonEmptyArray<number>): number;
@@ -1 +0,0 @@
1
- {"version":3,"file":"random-index-by-weight.js","sourceRoot":"","sources":["../src/random-index-by-weight.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAOjF,MAAM,UAAU,mBAAmB,CAAC,GAAG,IAE8B;IAEnE,IAAI,SAAiC,CAAA;IACrC,IAAI,OAA8B,CAAA;IAElC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACnB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC7B,CAAC;IAED,OAAO,kBAAkB,CACvB,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,EAAE,CAAC,EACJ,OAAO,CACR,CAAA;AACH,CAAC"}
@@ -1,7 +0,0 @@
1
- import { NonEmptyArray } from 'justypes';
2
- import { IRandomNumberGenerator } from './types.js';
3
- export interface IWeighted {
4
- weight: number;
5
- }
6
- export declare function randomWeighted<T extends IWeighted>(values: NonEmptyArray<T>): T;
7
- export declare function randomWeighted<T extends IWeighted>(generator: IRandomNumberGenerator, values: NonEmptyArray<T>): T;
@@ -1,17 +0,0 @@
1
- import { randomIndexByWeight } from './random-index-by-weight.js';
2
- import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
3
- export function randomWeighted(...args) {
4
- let generator;
5
- let values;
6
- if (args.length === 1) {
7
- generator = nativeRandomNumberGenerator;
8
- [values] = args;
9
- }
10
- else {
11
- [generator, values] = args;
12
- }
13
- const weights = values.map(option => option.weight);
14
- const index = randomIndexByWeight(generator, weights);
15
- return values[index];
16
- }
17
- //# sourceMappingURL=random-weighted.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random-weighted.js","sourceRoot":"","sources":["../src/random-weighted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAGjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAWjF,MAAM,UAAU,cAAc,CAAsB,GAAG,IAEQ;IAE7D,IAAI,SAAiC,CAAA;IACrC,IAAI,MAAwB,CAAA;IAE5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,SAAS,GAAG,2BAA2B,CACtC;QAAA,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;IAClB,CAAC;SAAM,CAAC;QACN,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAA0B,CAAA;IAC5E,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC"}
package/lib/random.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { IRandomNumberGenerator } from './types.js';
2
- export declare function random(min: number, max: number): number;
3
- export declare function random(generator: IRandomNumberGenerator, min: number, max: number): number;
package/lib/random.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"random.js","sourceRoot":"","sources":["../src/random.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAQjF,MAAM,UAAU,MAAM,CAAC,GAAG,IAEqC;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,UAAU,CACf,SAAS,CAAC,IAAI,EAAE,EAChB,CAAC,EAAE,CAAC,EACJ,GAAG,EAAE,GAAG,CACT,CAAA;AACH,CAAC"}
@@ -1,36 +0,0 @@
1
- import { NonEmptyArray } from 'justypes'
2
- import { mapToRange } from './map-to-range.js'
3
-
4
- export function mapToIndexByWeight(
5
- value: number
6
- , oldMin: number, oldMax: number
7
- , weights: NonEmptyArray<number>
8
- ): number {
9
- const newMin = 0
10
- const newMax = weights.reduce((acc, cur) => acc + Math.max(cur, 0))
11
- if (newMax === 0) {
12
- // 只有在所有权重都小于等于0的情况下会进入此路径, 这时将所有权重都视为1.
13
- const index = Math.floor(mapToRange(value, oldMin, oldMax, newMin, weights.length))
14
-
15
- return index === weights.length
16
- ? weights.length - 1
17
- : index
18
- } else {
19
- const newValue = mapToRange(value, oldMin, oldMax, newMin, newMax)
20
-
21
- let remains = newMax
22
- for (let i = weights.length; i--;) {
23
- const weight = weights[i]
24
- if (weight <= 0) {
25
- continue
26
- } else {
27
- remains -= weight
28
- if (newValue >= remains) {
29
- return i
30
- }
31
- }
32
- }
33
-
34
- throw new Error('Impossible route')
35
- }
36
- }
@@ -1,12 +0,0 @@
1
- import { remap } from 'extra-utils'
2
-
3
- /**
4
- * @deprecated use `remap` of `extra-utils` instead
5
- */
6
- export function mapToRange(
7
- value: number
8
- , oldMin: number, oldMax: number
9
- , newMin: number, newMax: number
10
- ): number {
11
- return remap(value, [oldMin, oldMax], [newMin, newMax])
12
- }
@@ -1,32 +0,0 @@
1
- import { NonEmptyArray } from 'justypes'
2
- import { randomWeighted } from './random-weighted.js'
3
- import { IRandomNumberGenerator } from './types.js'
4
- import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
5
-
6
- export type IWeightModel<T> = NonEmptyArray<{
7
- weight: number
8
- value: T
9
- }>
10
-
11
- export function randomByWeightModel<T>(model: IWeightModel<T>): T
12
- export function randomByWeightModel<T>(
13
- generator: IRandomNumberGenerator
14
- , model: IWeightModel<T>
15
- ): T
16
- export function randomByWeightModel<T>(...args:
17
- | [model: IWeightModel<T>]
18
- | [generator: IRandomNumberGenerator, model: IWeightModel<T>]
19
- ): T {
20
- let generator: IRandomNumberGenerator
21
- let model: IWeightModel<T>
22
-
23
- if (args.length === 1) {
24
- generator = nativeRandomNumberGenerator
25
- ;[model] = args
26
- } else {
27
- [generator, model] = args
28
- }
29
-
30
- const { value } = randomWeighted(generator, model)
31
- return value
32
- }
@@ -1,32 +0,0 @@
1
- import { randomIndexByWeight } from './random-index-by-weight.js'
2
- import { NonEmptyArray } from 'justypes'
3
- import { IRandomNumberGenerator } from './types.js'
4
- import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
5
-
6
- export interface IWeighted {
7
- weight: number
8
- }
9
-
10
- export function randomWeighted<T extends IWeighted>(values: NonEmptyArray<T>): T
11
- export function randomWeighted<T extends IWeighted>(
12
- generator: IRandomNumberGenerator
13
- , values: NonEmptyArray<T>
14
- ): T
15
- export function randomWeighted<T extends IWeighted>(...args:
16
- | [values: NonEmptyArray<T>]
17
- | [generator: IRandomNumberGenerator, values: NonEmptyArray<T>]
18
- ): T {
19
- let generator: IRandomNumberGenerator
20
- let values: NonEmptyArray<T>
21
-
22
- if (args.length === 1) {
23
- generator = nativeRandomNumberGenerator
24
- ;[values] = args
25
- } else {
26
- [generator, values] = args
27
- }
28
-
29
- const weights = values.map(option => option.weight) as NonEmptyArray<number>
30
- const index = randomIndexByWeight(generator, weights)
31
- return values[index]
32
- }