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

请求帮助:使用JavaScript生成10个不重复随机数

生成10个不重复随机数的解决方案

嘿,我来帮你搞定这个问题!你的代码目前的问题是循环次数和目标生成的10个数没有绑定,而且随机数的范围随着j变化,导致可能凑不够10个不重复的数。咱们调整一下逻辑,确保每次都能精准生成10个不重复的随机数,这里给你两种实用的方案:

方法1:循环生成直到满足数量

这个方法逻辑直观,适合快速上手:

// 初始化空数组存储结果
const randomNumbers = [];
// 目标生成10个数
const targetCount = 10;
// 随机数范围:1到21(和你原代码的范围一致)
const min = 1;
const max = 21;

// 只要数组长度没到10,就继续生成
while (randomNumbers.length < targetCount) {
  // 生成1到21之间的随机整数
  const num = Math.floor(Math.random() * (max - min + 1)) + min;
  // 检查数是否已存在,不存在就加入数组
  if (!randomNumbers.includes(num)) {
    randomNumbers.push(num);
  }
}

console.log(randomNumbers); // 输出10个不重复的随机数

为什么这个能行? 它直接以“凑够10个不重复数”为终止条件,不管循环多少次,直到数组长度达标为止,完全保证结果数量。

方法2:Fisher-Yates洗牌法(更高效)

如果你的随机数范围不大(比如1到21),这种方法性能更好,而且不用反复检查重复:

// 先创建包含1到21的完整数组
const numbersArray = Array.from({ length: 21 }, (_, index) => index + 1);

// 实现Fisher-Yates高效洗牌算法
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    // 交换数组元素位置
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

// 打乱数组后取前10个元素
const randomNumbers = shuffleArray(numbersArray).slice(0, 10);
console.log(randomNumbers);

优势是什么? 先把所有可能的数列出来,打乱顺序后直接取前10个,从根源上避免了重复,而且比反复检查的循环更高效,尤其当目标数量接近总范围时。

对你原代码的小分析

你原来的循环是从1到21,每次生成1到j的随机数,这会导致前期生成的数范围很小,重复概率高,就算循环完21次,也可能凑不够10个不重复的数。上面两种方法都解决了这个问题,选哪种全看你的需求~

内容的提问来源于stack exchange,提问作者Mariusz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:32:56