根据百分比选择数组并对其进行洗牌

Picking array based off of percentage and shuffling it

我已经确定了我的百分比和数组。我知道我需要做到这一点,以便百分比决定选择哪个数组,然后我需要洗牌该数组以使其吐出三个“东西”之一。我知道有一种 easier/more 有效的方法可以做到这一点,而不会用一百万个洗牌函数来确定“Thing”变量来阻塞我的代码。

目前,它不工作(吐出“未定义”)但它让我挠头,因为我不确定问题是什么,以及想要简化它。

代码的全部要点是根据滚动百分比选择一个数组,随机化该数组,然后吐出它从洗牌中获得的值。

我正在使用的当前绝对垃圾箱火:

function generate(){

  var tierOne = ["thing one", "thing two", "thing three"]
  var tierTwo = ["thing four", "thing five", "thing six"]
  var tierThree = ["thing seven", "thing eight", "thing nine"]
  var tierFour = ["thing ten", "thing eleven", "thing twelve"]
  var tierFive = ["thing thirteen", "thing fourteen", "thing fifteen"]
  
    var percent = r();

    if (percent >= 0 && percent < 25) {
        shuffle(tierOne)
        thing = tierOne;
        return thing[0];
    } else if (percent >= 25 && percent < 36) {
        shuffle(tierTwo)
        thing = tierTwo;
        return thing[0];
    } else if (percent >= 36 && percent < 60) {
        shuffle(tierThree)
        thing = tierThree;
        return thing[0];
    } else if (percent >= 60 && percent < 76) {
        shuffle(tierFour)
        thing = tierFour;
        return thing[0];
    } else {
        shuffle(tierFive)
        thing = tierFive;
        return thing[0];
    }
} 

function r() {
    Math.floor(Math.random() * 100) + 1;
    return Math.floor(Math.random() * 100) + 1;
}```
  1. 您的随机播放例程可能 return 一个包含结果的新数组。

  2. 您需要声明thing,并且不使用全局变量

if (percent >= 0 && percent < 20) {
        const thing = shuffle(tierOne)
        return thing[0];
    }

let thing
if (percent >= 0 && percent < 20) {
       thing = shuffle(tierOne)
        return thing[0];
    }

首先,我认为没有必要设置不同的数组,然后使用 if-then-else 逻辑将百分比与一系列值进行比较。只需制作一个数组数组,然后使用 return 的索引来洗牌。这也意味着除非你真的需要 1-100 的数字来做其他事情,否则你应该只生成一个 0 到 4 之间的随机数。假设你需要我留下的百分比并将其缩放到 0 到 4 之间.

我可能也不会将 shuffle 逻辑与生成函数分开,但我将其分开,以便您可以更轻松地实现所需的 shuffle 逻辑。我不相信 js 中有内置的 shuffle 函数,就像其他一些语言一样,所以你将不得不有一个 shuffle 函数。这是一个关于洗牌的线程,我无耻地窃取了我从中包含的洗牌功能。不是说这是最好的,只是看起来很漂亮。 post 中有很多关于不同改组算法的不同含义的讨论。

How to randomize (shuffle) a JavaScript array?

console.log(generate());

function generate(){
  
  const raw = [
    ["thing one", "thing two", "thing three"],
    ["thing four", "thing five", "thing six"],
    ["thing seven", "thing eight", "thing nine"],
    ["thing ten", "thing eleven", "thing twelve"],
    ["thing thirteen", "thing fourteen", "thing fifteen"]
  ];
  
  var percent = Math.floor(Math.random() * 100) + 1;
  var i = Math.ceil(percent/20)-1;
  return shuffle(raw[i])[0];
  
}
function shuffle(unshuffled){

  return unshuffled
    .map((value) => ({ value, sort: Math.random() }))
    .sort((a, b) => a.sort - b.sort)
    .map(({ value }) => value)
  ;
  
}