如何避免JavaScript随机选取JSON题目时连续重复?
避免连续选中相同题目的实现方案
要解决连续2-3次选中相同题目的问题,核心思路是维护最近选中的题目索引记录,生成新索引时排除这些历史记录中的值。以下是具体实现:
实现步骤
- 定义变量保存最近选中的索引(长度根据需要限制,比如保存最近2个,避免连续3次重复)
- 编写随机索引生成函数,循环生成直到找到不在历史记录中的有效索引
- 更新历史记录,保持其长度不超过设定的限制
代码示例
const fs = require('fs'); // 读取并解析题目JSON const quizData = JSON.parse(fs.readFileSync('quiz.json')); // 题目总数 const TOTAL_QUIZ_COUNT = 22; // 保存最近选中的索引,最多保留2个(防止连续3次重复) let recentQuizIndices = []; // 历史记录最大长度,设为2则避免连续2-3次重复;设为1则仅避免连续2次重复 const MAX_HISTORY_LENGTH = 2; // 生成符合要求的随机题目索引 function generateValidQuizIndex() { let newIndex; // 循环生成随机数,直到找到不在最近历史中的索引 do { newIndex = Math.floor(Math.random() * TOTAL_QUIZ_COUNT); } while (recentQuizIndices.includes(newIndex)); // 更新历史记录:添加新索引,超出长度则移除最早的记录 recentQuizIndices.push(newIndex); if (recentQuizIndices.length > MAX_HISTORY_LENGTH) { recentQuizIndices.shift(); } return newIndex; } // 使用示例 const selectedQuizIndex = generateValidQuizIndex(); const selectedQuiz = quizData[selectedQuizIndex];
说明
- 如果只需要避免连续2次选中同一题目,将
MAX_HISTORY_LENGTH改为1即可,此时仅保存上一次的索引,新索引只需与上一次不同。 - 由于题目总数(22)远大于历史记录长度(最多2),循环一定会找到有效索引,不会出现死循环。
- 该方案仅限制连续重复,不限制非连续的重复选中,符合题目随机选取的需求。
内容的提问来源于stack exchange,提问作者Camilo Tobon
相关产品推荐
相关产品推荐

