Я пытаюсь создать генератор взвешенных случайных чисел для машины котировки, которая, если выбран какой-то элемент, выбирается из другого набора без необходимости входить и изменять все числа.
По существу, существует основной массив кавычек, в котором числа смешаны. Эти числа соответствуют спискам, и их нужно будет с большей вероятностью выбирать в зависимости от количества элементов в списке. (например, если 1 выбрано и соответствует массиву с десятью элементами в нем, то он должен быть в десять раз больше вероятен для выбора в виде строки, потому что он соответствует десяти строкам.)
Итак, я решил преобразовать индекс из простого несмещенного генератора случайных чисел в то, что по существу является лотерейной машиной, запускаемой генератором случайных чисел, в котором каждый элемент в основном массиве помещает один "билет" (или их индексный номер для каждого которые они имеют. Например, если мы используем одну из предыдущих и двух других строк, она должна работать примерно так:
input=["I am a string!",1,"Me Too!"];
output=[0,1,1,1,1,1,1,1,1,1,1,2];
Затем из случайного массива выбирается случайное число, которое затем соответствует элементу в основном массиве. Если выбрано 1, то строка выбирается из массива 1 соответствует.
Но я планирую иметь много вещей в нем. У меня уже есть сорок, и я планирую добавить больше, поэтому я сделал что-то, что делает выходной массив для меня. Единственная проблема заключается в том, что это не работает правильно. Он должен выводить [0,1,2,3,3,3,4,6,6,6,6,7,7], вместо этого он выводит [3,3,3,7,7,7,7].
//main array
var main=["one","two","three",1,"fourth",2,"fifth",3]
//array corresponding to 1
var first=["a","b","c"];
//array corresponding to 2. 2 will not be par of this array
var second=["1","2","3"];
//array corresponding to 3
var third=["red","yellow","green","blue"];
//weights
var weights=[];
//weight pusher
for (var i = 0; i < main.length; i++) {
//weight adder
if (!Number.isNaN(main[i])) {
switch (main[i]) { //If it gets to this point, main[i] should be 1, 2, or 3.
case 1:
//add i to the array once for every item in first (three times)
for (var j = 0; j < first.length; j++) {
weights.push(i)
}
break;
case 2:
//do nothing
break;
case 3:
//add i to the array once for every item in third (four times)
for (var j = 0; j < third.length; j++) {
weights.push(i)
}
break;
}
}else {
//If it a regular string, add one i to the array.
weights.push(i);
};
};
console.log(weights); //Should output [0,1,2,3,3,3,4,6,6,6,6,7],instead outputs [3,3,3,7,7,7,7]
Это не делает то, что вы хотите:
if (!Number.isNaN(main[i])) {
Number.isNaN("one")
возвращает false
.
Измените его на:
if(typeof main[i] == "number") {
Если вы хотите разрешить ввод чисел в виде строк, вы можете использовать:
if(!Number.isNaN(parseInt(main[i]))) {
Здесь результат, как вы хотите, вы должны просто проверить свои условия, лучше использовать console.log после каждого условия, чтобы проверить, работает ли он нормально
//main array
var main = ["one", "two", "three", 1, "fourth", 2, "fifth", 3]
//array corresponding to 1
var first = ["a", "b", "c"];
//array corresponding to 2. 2 will not be par of this array
var second = ["1", "2", "3"];
//array corresponding to 3
var third = ["red", "yellow", "green", "blue"];
//weights
var weights = [];
//weight pusher
for (var i = 0; i < main.length; i++) {
//weight adder
//console.log(main[i]);
if (main[i] == 1) {
//add i to the array once for every item in first (three times)
for (var j = 0; j < first.length; j++) {
weights.push(i)
}
} else if (main[i] == 2)
for (var j = 0; j < third.length; j++) {
weights.push(i)
}
else {
//If it a regular string, add one i to the array.
weights.push(i);
};
};
console.log(weights); //Should output [0,1,2,3,3,3,4,6,6,6,6,7],instead outputs [3,3,3,7,7,7,7]
Замена
if (!Number.isNaN(main[i])) {
С
if ( ! isNaN(main[i] ) ) {
Я получил:
[ 0, 1, 2, 3, 3, 3, 4, 6, 7, 7, 7, 7 ]
Я думаю, что вы слишком усложняете это, если я правильно вас понимаю, я думаю, что это может решить вашу проблему чище:
const quotes = [
'one',
'two',
'three',
['a', 'b', 'c'],
['1', '2', '3'],
['red', 'yellow', 'green', 'blue']
];
function pickQuote(quotes) {
const index = Math.floor(Math.random() * quotes.length);
if (Array.isArray(quotes[index])) {
return pickQuote(quotes[index]);
}
return quotes[index];
}
for (let itr = 0; itr < 20; ++itr) {
console.log(pickQuote(quotes));
}