JavaScript - мой цикл for в машине котировок не будет .push () переменную из другого цикла for в массив

1

Я пытаюсь создать генератор взвешенных случайных чисел для машины котировки, которая, если выбран какой-то элемент, выбирается из другого набора без необходимости входить и изменять все числа.

По существу, существует основной массив кавычек, в котором числа смешаны. Эти числа соответствуют спискам, и их нужно будет с большей вероятностью выбирать в зависимости от количества элементов в списке. (например, если 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]
  • 0
    Существуют лучшие способы реализации генератора взвешенных случайных чисел.
Теги:
arrays
for-loop
random

4 ответа

0

Это не делает то, что вы хотите:

if (!Number.isNaN(main[i])) { 

Number.isNaN("one") возвращает false.

Измените его на:

if(typeof main[i] == "number") {

Если вы хотите разрешить ввод чисел в виде строк, вы можете использовать:

if(!Number.isNaN(parseInt(main[i]))) {
0

Здесь результат, как вы хотите, вы должны просто проверить свои условия, лучше использовать 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]
0

Замена

if (!Number.isNaN(main[i])) { 

С

if ( ! isNaN(main[i] ) ) { 

Я получил:

[ 0, 1, 2, 3, 3, 3, 4, 6, 7, 7, 7, 7 ]
0

Я думаю, что вы слишком усложняете это, если я правильно вас понимаю, я думаю, что это может решить вашу проблему чище:

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));
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню