Проблема с генератором случайных Чисел Java-скрипта

#javascript #numbers #javascript-objects #nft

Вопрос:

У меня есть код для генерации случайного числа, и он, похоже, переключается туда и обратно между 1 или 2.

 const isDnaUnique = (_DnaList = [], _dna = []) => {   let foundDna =
_DnaList.find((i) => i.join("") === _dna.join(""));   return foundDna == undefined ? true : false; };

const createDna = (_races, _race) => {   let randNum = [];  
_races[_race].layers.forEach((layer) => {
    let randElementNum = Math.floor(Math.random() * 100)   1;
    let num = 0;
    layer.elements.forEach((element) => {
      if (randElementNum >= 100 - element.weight) {
        num = element.id;
      }
    });
    randNum.push(num);   });   return randNum; };
 

Моя проблема в том, что генератор случайных чисел продолжает возвращаться только к значениям, вместо того чтобы перебирать их все.

  {
        name: "Eyes",
        elements: [
          {
            id: 0,
            name: "E1",
            path: `${dir}/3-eyes/E1.png`,
            weight: 25,
          },
          {
            id: 1,
            name: "E2",
            path: `${dir}/3-eyes/E2.png`,
            weight: 25,
          },
          {
            id: 2,
            name: "E3",
            path: `${dir}/3-eyes/E3.png`,
            weight: 25,
          },
          {
            id: 3,
            name: "E4",
            path: `${dir}/3-eyes/E4.png`,
            weight: 25,
          },
        ],
        position: { x: 0, y: 0 },
        size: { width: width, height: height },
      },
 

Комментарии:

1. Javascript-это не Java.

2. Где здесь есть Java-код?

3. Вы не возвращаете случайные числа. Вы возвращаете идентификатор элемента последнего элемента, который соответствует вашим критериям. Обратите внимание, что ваш randElementNum будет варьироваться от 1 до 100, поэтому только 1% чисел будет «>= 100».

4. @TimRoberts Я также включил вторую часть своего кода. Возвращаемое число, по-видимому, когда-либо возвращало только 2 из четырех элементов. Не знаю почему.

Ответ №1:

Ваши результаты именно такие, каких я ожидал бы. Давайте взглянем.

У randElementNum вас будет число от 1 до 100. Все четыре ваших элемента имеют weight по 25. Вы каждый раз проходите через цикл для всех элементов. Таким образом, если число меньше 75 (100-25), то if оператор никогда не срабатывает и num будет равен 0. Если число больше или равно 75, то if оператор срабатывает все четыре раза, и вы получите элемент № 3. Других возможностей нет.

Следующая большая проблема заключается в том, что «forEach» — это неправильный инструмент. Я показал вам, как это работает ниже, но вам действительно следует использовать старомодный цикл «для», чтобы вы могли разорвать цикл, как только найдете ответ.

Я не уверен, какого эффекта вы добивались, но это определенно не то, что вы хотели. Основываясь на названии weight , вы пытались, чтобы каждый элемент выбирался в 25% случаев? Вы можете сделать это с помощью чего-то вроде этого:

 const createDna = () => {
    let randElementNum = Math.floor(Math.random() * 100);
    console.log( randElementNum );
    let num = -1;
    layer.elements.forEach((element) => {
      if( num >= 0 )
          return;
      if (randElementNum < element.weight)
      {
        num = element.id;
        return;
      }
      randElementNum -= element.weight;
    });
    return num;
};

 

Комментарии:

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

2. Как я уже отмечал в своем редактировании, большая проблема в том, что forEach это неправильный инструмент. Он ВСЕГДА посещает каждый узел в списке. Вам следует использовать старомодный for цикл, чтобы вы могли вырваться, как только получите ответ.