Java 脚本随机数生成器问题

Java Script Random Number Generator Issue

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

您的结果正是我所期望的。一起来看看吧。

您的 randElementNum 将是一个从 1 到 100 的数字。您的所有四个元素的 weight 都是 25。您正在 运行 通过所有的循环每次都有元素。因此,如果数字小于 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;
};