如何避免使用Math.random()时重复选中相同值 附JS代码示例
问题分析
现有代码存在以下核心问题,导致频繁出现重复值:
- 仅在初始化阶段生成了一次随机人名
randomNavn,所有问题拼接的都是同一个人名,无论抽到哪条问题都会出现相同人名 - 随机抽取逻辑错误:没有在抽取后移除已选中的元素;
næsteSpørgsmål函数仅在数组为空时执行内部逻辑,首次调用数组非空会直接返回undefined;还存在未定义变量index、对字符串调用数组专属方法splice等语法错误 - 数组耗尽后的填充逻辑不符合需求,填充的是0-49的数字,而非你需要的问题内容
修正方案
核心实现逻辑为抽取后立即从原数组中移除已选中的元素,所有元素抽取完毕后重新生成一轮随机问题池,即可完全避免重复问题。
修正后完整代码如下:
var navne = ["peter", "mads", "Per"] var spørgsmål = [] // 初始化/重新生成问题池方法 function initSpørgsmål() { // 每次生成问题时重新随机抽取人名,避免所有问题绑定同一个人名 var randomNavn = navne[Math.floor(Math.random() * navne.length)] spørgsmål = [ `bund din drink ${randomNavn}`, `tag 2 shots ${randomNavn}`, `del 2 tåre ud ${randomNavn}` ] } function næsteSpørgsmål() { // 问题池为空就重新生成 if (!spørgsmål.length) { initSpørgsmål() } // 生成随机下标 var randomIndex = Math.floor(Math.random() * spørgsmål.length) // 取出对应元素,同时将该元素从数组中移除 var randomItem = spørgsmål.splice(randomIndex, 1)[0] console.log(randomItem) return randomItem } // 测试调用 console.log(næsteSpørgsmål())
逻辑说明
- 每次生成问题池都会重新随机抽取人名,避免所有问题绑定同一个人名的情况
- 每次抽取问题时用
splice方法将已选中元素从数组中移除,确保同一个问题池内的内容不会被重复抽取 - 问题池所有内容抽取完毕后会自动生成新的问题池,无需手动操作
内容的提问来源于stack exchange,提问作者Wager2000
相关产品推荐
相关产品推荐

