这个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;
答案 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)
并查看输出。