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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:15:19