-1

我有生成随机数的代码,它似乎在 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 },
      },
4

1 回答 1

1

你的结果正是我所期望的。让我们来看看。

randElementNum将是一个从 1 到 100 的数字。所有四个元素都有weight25。您每次都在循环中运行所有元素。因此,如果数字小于 75 (100-25),则if语句永远不会触发,并且num将为 0。如果数字大于或等于 75,则if语句会全部触发四次,然后您将结束与元素#3一起。没有其他可能性。

下一个大问题是“forEach”是错误的工具。我已经向您展示了如何使其在下面工作,但您确实应该使用老式的“for”循环,这样您就可以在找到答案后打破循环。

我不确定你想要什么效果,但这肯定不是你想要的。根据名称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;
};

于 2021-10-06T04:00:30.540 回答