1 | import { flatten } from '../../utils/array.js';
|
2 | import { factory } from '../../utils/factory.js';
|
3 | import { isMatrix, isNumber } from '../../utils/is.js';
|
4 | import { createRng } from './util/seededRNG.js';
|
5 | var name = 'pickRandom';
|
6 | var dependencies = ['typed', 'config', '?on'];
|
7 | export var createPickRandom = factory(name, dependencies, (_ref) => {
|
8 | var {
|
9 | typed,
|
10 | config,
|
11 | on
|
12 | } = _ref;
|
13 |
|
14 | var rng = createRng(config.randomSeed);
|
15 |
|
16 | if (on) {
|
17 | on('config', function (curr, prev) {
|
18 | if (curr.randomSeed !== prev.randomSeed) {
|
19 | rng = createRng(curr.randomSeed);
|
20 | }
|
21 | });
|
22 | }
|
23 | |
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | return typed({
|
61 | 'Array | Matrix': function ArrayMatrix(possibles) {
|
62 | return _pickRandom(possibles, {});
|
63 | },
|
64 | 'Array | Matrix, Object': function ArrayMatrixObject(possibles, options) {
|
65 | return _pickRandom(possibles, options);
|
66 | },
|
67 | 'Array | Matrix, number': function ArrayMatrixNumber(possibles, number) {
|
68 | return _pickRandom(possibles, {
|
69 | number
|
70 | });
|
71 | },
|
72 | 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(possibles, weights) {
|
73 | return _pickRandom(possibles, {
|
74 | weights
|
75 | });
|
76 | },
|
77 | 'Array | Matrix, Array | Matrix, number': function ArrayMatrixArrayMatrixNumber(possibles, weights, number) {
|
78 | return _pickRandom(possibles, {
|
79 | number,
|
80 | weights
|
81 | });
|
82 | },
|
83 | 'Array | Matrix, number, Array | Matrix': function ArrayMatrixNumberArrayMatrix(possibles, number, weights) {
|
84 | return _pickRandom(possibles, {
|
85 | number,
|
86 | weights
|
87 | });
|
88 | }
|
89 | });
|
90 | |
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | function _pickRandom(possibles, _ref2) {
|
102 | var {
|
103 | number,
|
104 | weights,
|
105 | elementWise = true
|
106 | } = _ref2;
|
107 | var single = typeof number === 'undefined';
|
108 |
|
109 | if (single) {
|
110 | number = 1;
|
111 | }
|
112 |
|
113 | var createMatrix = isMatrix(possibles) ? possibles.create : isMatrix(weights) ? weights.create : null;
|
114 | possibles = possibles.valueOf();
|
115 |
|
116 | if (weights) {
|
117 | weights = weights.valueOf();
|
118 | }
|
119 |
|
120 | if (elementWise === true) {
|
121 | possibles = flatten(possibles);
|
122 | weights = flatten(weights);
|
123 | }
|
124 |
|
125 | var totalWeights = 0;
|
126 |
|
127 | if (typeof weights !== 'undefined') {
|
128 | if (weights.length !== possibles.length) {
|
129 | throw new Error('Weights must have the same length as possibles');
|
130 | }
|
131 |
|
132 | for (var i = 0, len = weights.length; i < len; i++) {
|
133 | if (!isNumber(weights[i]) || weights[i] < 0) {
|
134 | throw new Error('Weights must be an array of positive numbers');
|
135 | }
|
136 |
|
137 | totalWeights += weights[i];
|
138 | }
|
139 | }
|
140 |
|
141 | var length = possibles.length;
|
142 | var result = [];
|
143 | var pick;
|
144 |
|
145 | while (result.length < number) {
|
146 | if (typeof weights === 'undefined') {
|
147 | pick = possibles[Math.floor(rng() * length)];
|
148 | } else {
|
149 | var randKey = rng() * totalWeights;
|
150 |
|
151 | for (var _i = 0, _len = possibles.length; _i < _len; _i++) {
|
152 | randKey -= weights[_i];
|
153 |
|
154 | if (randKey < 0) {
|
155 | pick = possibles[_i];
|
156 | break;
|
157 | }
|
158 | }
|
159 | }
|
160 |
|
161 | result.push(pick);
|
162 | }
|
163 |
|
164 | return single ? result[0] : createMatrix ? createMatrix(result) : result;
|
165 | }
|
166 | }); |
\ | No newline at end of file |