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.
- package/README.md +52 -66
- package/lib/index.d.ts +6 -7
- package/lib/index.js +6 -7
- package/lib/index.js.map +1 -1
- package/lib/random-bool.js +2 -2
- package/lib/random-bool.js.map +1 -1
- package/lib/random-float.d.ts +3 -0
- package/lib/{random.js → random-float.js} +4 -4
- package/lib/random-float.js.map +1 -0
- package/lib/random-int-inclusive.js +2 -2
- package/lib/random-int-inclusive.js.map +1 -1
- package/lib/random-int.js +2 -2
- package/lib/random-int.js.map +1 -1
- package/lib/random-number.d.ts +17 -0
- package/lib/random-number.js +42 -0
- package/lib/random-number.js.map +1 -0
- package/lib/random-pick-index.d.ts +4 -0
- package/lib/random-pick-index.js +15 -0
- package/lib/random-pick-index.js.map +1 -0
- package/lib/random-pick-item.d.ts +4 -0
- package/lib/random-pick-item.js +16 -0
- package/lib/random-pick-item.js.map +1 -0
- package/lib/random-pick-weighted-index.d.ts +4 -0
- package/lib/{random-index-by-weight.js → random-pick-weighted-index.js} +4 -4
- package/lib/random-pick-weighted-index.js.map +1 -0
- package/lib/random-pick-weighted-item.d.ts +7 -0
- package/lib/random-pick-weighted-item.js +17 -0
- package/lib/random-pick-weighted-item.js.map +1 -0
- package/package.json +2 -2
- package/src/index.ts +6 -8
- package/src/random-bool.ts +2 -2
- package/src/{random.ts → random-float.ts} +7 -7
- package/src/random-int-inclusive.ts +4 -4
- package/src/random-int.ts +4 -4
- package/src/{random-by-model.ts → random-number.ts} +18 -18
- package/src/random-pick-index.ts +26 -0
- package/src/random-pick-item.ts +27 -0
- package/src/{random-index-by-weight.ts → random-pick-weighted-index.ts} +6 -6
- package/src/random-pick-weighted-item.ts +32 -0
- package/lib/map-to-index-by-weight.d.ts +0 -2
- package/lib/map-to-index-by-weight.js +0 -29
- package/lib/map-to-index-by-weight.js.map +0 -1
- package/lib/map-to-range.d.ts +0 -1
- package/lib/map-to-range.js +0 -5
- package/lib/map-to-range.js.map +0 -1
- package/lib/random-by-model.d.ts +0 -17
- package/lib/random-by-model.js +0 -42
- package/lib/random-by-model.js.map +0 -1
- package/lib/random-by-weight-model.d.ts +0 -8
- package/lib/random-by-weight-model.js +0 -16
- package/lib/random-by-weight-model.js.map +0 -1
- package/lib/random-index-by-weight.d.ts +0 -4
- package/lib/random-index-by-weight.js.map +0 -1
- package/lib/random-weighted.d.ts +0 -7
- package/lib/random-weighted.js +0 -17
- package/lib/random-weighted.js.map +0 -1
- package/lib/random.d.ts +0 -3
- package/lib/random.js.map +0 -1
- package/src/map-to-index-by-weight.ts +0 -36
- package/src/map-to-range.ts +0 -12
- package/src/random-by-weight-model.ts +0 -32
- package/src/random-weighted.ts +0 -32
package/README.md
CHANGED
|
@@ -15,13 +15,13 @@ interface IRandomNumberGenerator {
|
|
|
15
15
|
}
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
###
|
|
18
|
+
### randomFloat
|
|
19
19
|
```ts
|
|
20
|
-
function
|
|
21
|
-
function
|
|
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
|
|
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
|
-
###
|
|
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
|
|
48
|
+
enum NumberType {
|
|
90
49
|
Float
|
|
91
50
|
, Integer
|
|
92
51
|
, IntegerInclusive
|
|
93
52
|
}
|
|
94
53
|
|
|
95
|
-
type
|
|
54
|
+
type INumberModel =
|
|
96
55
|
| number
|
|
97
56
|
| Getter<number>
|
|
98
57
|
| {
|
|
99
|
-
type:
|
|
58
|
+
type: NumberType
|
|
100
59
|
min: number
|
|
101
60
|
max: number
|
|
102
61
|
}
|
|
103
62
|
| NonEmptyArray<{
|
|
104
63
|
weight: number
|
|
105
|
-
|
|
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
|
-
|
|
110
|
-
|
|
71
|
+
### randomBool
|
|
72
|
+
```ts
|
|
73
|
+
function randomBool(probabilityOfTrue: number): boolean
|
|
74
|
+
function randomBool(generator: IRandomNumberGenerator, probabilityOfTrue: number): boolean
|
|
111
75
|
```
|
|
112
76
|
|
|
113
|
-
###
|
|
77
|
+
### randomPickItem
|
|
114
78
|
```ts
|
|
115
|
-
function
|
|
116
|
-
function
|
|
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
|
-
###
|
|
99
|
+
### randomPickIndex
|
|
120
100
|
```ts
|
|
121
|
-
function
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
,
|
|
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
|
-
|
|
108
|
+
The function returns an integer in the range `[0, items.length]`.
|
|
129
109
|
|
|
130
|
-
###
|
|
110
|
+
### randomPickWeightedIndex
|
|
131
111
|
```ts
|
|
132
|
-
function
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
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-
|
|
7
|
-
export * from './random-weighted.js';
|
|
8
|
-
export * from './random-
|
|
9
|
-
export * from './random-
|
|
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-
|
|
7
|
-
export * from './random-weighted.js';
|
|
8
|
-
export * from './random-
|
|
9
|
-
export * from './random-
|
|
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,
|
|
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"}
|
package/lib/random-bool.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
2
|
-
import {
|
|
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
|
|
13
|
+
return randomFloat(generator, 0, 1) < probabilityOfTrue;
|
|
14
14
|
}
|
|
15
15
|
//# sourceMappingURL=random-bool.js.map
|
package/lib/random-bool.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { remap } from 'extra-utils';
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
3
|
-
export function
|
|
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
|
|
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 {
|
|
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(
|
|
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,
|
|
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 {
|
|
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(
|
|
14
|
+
return Math.floor(remap(generator.next(), [0, 1], [Math.ceil(min), Math.floor(max)]));
|
|
15
15
|
}
|
|
16
16
|
//# 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,
|
|
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 {
|
|
1
|
+
import { remapToWeightedIndex } from 'extra-utils';
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js';
|
|
3
|
-
export function
|
|
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
|
|
13
|
+
return remapToWeightedIndex(generator.next(), [0, 1], weights);
|
|
14
14
|
}
|
|
15
|
-
//# sourceMappingURL=random-
|
|
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
|
+
"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.
|
|
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-
|
|
8
|
-
export * from './random-weighted.js'
|
|
9
|
-
export * from './random-
|
|
10
|
-
export * from './random-
|
|
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'
|
package/src/random-bool.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IRandomNumberGenerator } from './types.js'
|
|
2
2
|
import { nativeRandomNumberGenerator } from './native-random-number-generator.js'
|
|
3
|
-
import {
|
|
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
|
|
24
|
+
return randomFloat(generator, 0, 1) < probabilityOfTrue
|
|
25
25
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
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
|
|
6
|
-
export function
|
|
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
|
|
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
|
|
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 {
|
|
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(
|
|
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 {
|
|
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(
|
|
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 {
|
|
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
|
|
10
|
+
export enum NumberType {
|
|
11
11
|
Float
|
|
12
12
|
, Integer
|
|
13
13
|
, IntegerInclusive
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export type
|
|
16
|
+
export type INumberModel =
|
|
17
17
|
| number
|
|
18
18
|
| Getter<number>
|
|
19
19
|
| {
|
|
20
|
-
type:
|
|
20
|
+
type: NumberType
|
|
21
21
|
min: number
|
|
22
22
|
max: number
|
|
23
23
|
}
|
|
24
24
|
| NonEmptyArray<{
|
|
25
25
|
weight: number
|
|
26
|
-
|
|
26
|
+
model: INumberModel
|
|
27
27
|
}>
|
|
28
28
|
|
|
29
|
-
export function
|
|
30
|
-
export function
|
|
29
|
+
export function randomNumber(model: INumberModel): number
|
|
30
|
+
export function randomNumber(
|
|
31
31
|
generator: IRandomNumberGenerator
|
|
32
|
-
, model:
|
|
32
|
+
, model: INumberModel
|
|
33
33
|
): number
|
|
34
|
-
export function
|
|
35
|
-
| [model:
|
|
36
|
-
| [generator: IRandomNumberGenerator, model:
|
|
34
|
+
export function randomNumber(...args:
|
|
35
|
+
| [model: INumberModel]
|
|
36
|
+
| [generator: IRandomNumberGenerator, model: INumberModel]
|
|
37
37
|
): number {
|
|
38
38
|
let generator: IRandomNumberGenerator
|
|
39
|
-
let model:
|
|
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
|
|
54
|
-
return
|
|
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
|
|
59
|
-
case
|
|
60
|
-
case
|
|
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 {
|
|
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
|
|
7
|
-
export function
|
|
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
|
|
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
|
|
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,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"}
|
package/lib/map-to-range.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function mapToRange(value: number, oldMin: number, oldMax: number, newMin: number, newMax: number): number;
|
package/lib/map-to-range.js
DELETED
package/lib/map-to-range.js.map
DELETED
|
@@ -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"}
|
package/lib/random-by-model.d.ts
DELETED
|
@@ -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;
|
package/lib/random-by-model.js
DELETED
|
@@ -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"}
|
package/lib/random-weighted.d.ts
DELETED
|
@@ -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;
|
package/lib/random-weighted.js
DELETED
|
@@ -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
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
|
-
}
|
package/src/map-to-range.ts
DELETED
|
@@ -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
|
-
}
|
package/src/random-weighted.ts
DELETED
|
@@ -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
|
-
}
|