随机骰子

// 随机数值
function randomNum(min, max) {
  return parseInt(Math.random() * (max - min + 1) + min, 10);
}

// 统计数值
function totalNumbers(numArr = [], initNum = 0) {
  return numArr.reduce((prev, curItem) => prev + curItem, initNum);
}

/**
 * @description 随机骰子
 * @param {Number} 骰子个数
 * @param {Number} 总点数
 * @return {Array}
 */
function randomDice(diceNum = 3, totalNum = 3) {
  if (totalNum < diceNum || totalNum > diceNum * 6) return [];

  // 🎲 生成点数
  let dices = [], dicesCount = 0;
  for (let index = 1; index <= diceNum; index++) {
    if (totalNum === diceNum) {
      dicesCount = 1;
    }
    if (totalNum === diceNum * 6) {
      dicesCount = 6;
    }
    if (totalNum > diceNum && totalNum < diceNum * 6) {
      dicesCount = index < diceNum
        ? randomNum(1, Math.min(totalNum - (diceNum - index) - totalNumbers(dices), 6))
        : totalNum - totalNumbers(dices);
    }
    dices.push(dicesCount);
  }

  // 🎲 总点数不等 || 存在点数大于六,重新生成点数
  const totalCount = totalNumbers(dices);
  const hasOverSix = dices.some((item) => item > 6);
  if (totalCount !== totalNum || hasOverSix) {
    try {
      return randomDice(diceNum, totalNum);
    } catch (error) {
      console.log(error);
      return [];
    }
  }

  return dices;
}

// 🎲 骰子测试
let diceNum = 10;
let totalNum = randomNum(diceNum, diceNum * 6);
const dices = randomDice(diceNum, totalNum);
console.log({diceNum, totalNum, dices});