You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:48:00