while循环填充数组没有重复项不起作用

时间:2018-02-02 11:01:28

标签: typescript

这个while循环导致我的Angular应用程序停止。如果我用最简单的字符串替换最后一行中的randomdrug,例如' foo',则填充列表。当我添加randomdrug时,app停止了。我做错了什么?



  getDrugsForSale() {
    while (this.drugsforSale.length < this.locations[this.currentLocation].numDrugs) {
      const i = Math.floor(Math.random() * ((this.locations[this.currentLocation].numDrugs - 1) - 0) + 0);
      const randomdrug = this.drugNames[i];
      if (!(this.drugsforSale.includes(randomdrug))) {
        this.drugsforSale.push(randomdrug);
      }
    }
  }
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

问题是你有很多药物,你想要将它们全部移动到相似大小的数组中。 random,可能需要很长时间才能真正获得13个不同的索引。

例如,如果我们有13种药物并且我们想在结果数组中获得12种药物,random必须生成12个不同的数字,在1-13范围内,可能需要很长时间才能获得所有这些,random保证随机性不公平分配。在大型集合中,您将获得所有数字,但关键是

更好的方法是复制数组并执行随机交换,然后获取所需的金额。无论random生成什么,这都可以保证所需的时间相同:

getDrugsForSale() {
    let max = this.drugNames.length;
    let result = this.drugNames.slice(0);
    for (let i = 0; i < 30; i++) {
        let source = Math.floor(Math.random() * (max - 1) - 0);
        let dest = Math.floor(Math.random() * (max - 1) - 0);
        let aux = result[source];
        result[source] = result[dest];
        result[dest] = aux;
    }

    return result.slice(0, this.locations[this.currentLocation].numDrugs);
}

注意简单证明它不会轻易生成所有数字的事实,就是在原始代码中添加console.log(i)并查看输出。