#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
цикл, чтобы вы могли вырваться, как только получите ответ.