HTML/JS测验应用实现题目随机化方案求助
测验题目随机化实现方案及原理
1. 题目顺序随机化
现有代码中questions是存储所有题目的数组,使用Fisher-Yates洗牌算法打乱数组,这是无偏随机打乱的标准方案,能避免元素位置概率不均的问题。
实现代码
在script.js初始化阶段加入以下代码:
// 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; } // 复制并打乱题目数组,避免修改原始数据 const shuffledQuestions = shuffleArray([...questions]);
之后将原代码中所有questions[index]替换为shuffledQuestions[index],例如:
questionText.textContent = `${shuffledQuestions[index].question}`;
原理说明
Fisher-Yates算法从数组末尾开始遍历,每一步将当前元素与前面随机选中的元素交换位置。每一个未处理的元素都有均等概率被放到当前位置,最终生成完全随机、无偏向的数组。
2. 选项顺序随机化(可选)
如果需要避免固定选项顺序带来的记忆漏洞,可以给每个题目单独打乱选项,由于你的答案存储的是选项文本而非索引,判断逻辑不受影响。
实现代码
替换原代码中硬写的optionTag部分:
// 获取当前题目的选项并打乱 const currentOptions = shuffleArray([...shuffledQuestions[index].options]); // 动态生成选项标签 let optionTag = ''; currentOptions.forEach(option => { optionTag += `<div class="option"><span>${option}</span></div>`; });
原理说明
同样使用Fisher-Yates算法打乱选项数组,因为答案是固定的文本内容(如"B. ad valorem"),只需比较用户选中的文本与题目answer字段是否一致,就能正常判断对错,完全适配现有逻辑。
适配注意事项
- 原代码中记录当前题目的
index变量可继续使用,按顺序遍历shuffledQuestions即可依次显示随机题目。 - 使用
[...array]扩展运算符复制数组后再打乱,能保留原始questions数组的完整性,方便后续复用。
内容的提问来源于stack exchange,提问作者user12244565
相关产品推荐
相关产品推荐

