如何在 HTML/JavaScript 测验应用中实现题目随机化

雨浩姑娘_3903

雨浩姑娘_3903

2026-01-18

1015人浏览

原创

如何在 HTML/JavaScript 测验应用中实现题目随机化

本文教你用 javascript 为测验应用添加题目随机显示功能,通过生成不重复的随机索引从题库中抽取题目,并解释其工作原理与关键注意事项。

在构建一个专业级的在线测验应用时,确保每次练习都呈现不同顺序的题目,不仅能提升学习效果,还能防止记忆位置而非内容。你当前的代码已具备完整结构(题库分离、DOM 渲染、选项渲染),只需将固定索引 index 替换为可控的随机索引即可实现题目乱序——但需注意:真正的“随机”不等于“重复”,尤其在单次测验中,我们通常希望每道题仅出现一次。

✅ 正确做法:使用「洗牌 + 迭代」或「带去重的随机索引生成」

虽然答案中提供的 getRandomIndexFromArray 函数看似可行,但它存在逻辑缺陷:while 循环内重新赋值 randomIndex 时未更新判断条件,且未处理所有题目已抽完的边界情况(可能导致无限循环)。更可靠、简洁且符合工程实践的方式是——先打乱题库数组顺序,再按顺序逐题展示。

✅ 推荐方案:Fisher-Yates 洗牌算法(高效 & 真随机)

在加载题库后、开始答题前,对 questions 数组进行原地随机排序:

DeepBI DHTML 页面生成器
DeepBI DHTML 页面生成器

生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur

下载
// 在 script.js 开头或初始化阶段调用
function shuffleArray(arr) {
  for (let i = arr.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [arr[i], arr[j]] = [arr[j], arr[i]]; // ES6 解构交换
  }
  return arr;
}

// 假设 questions 已从 questions.js 加载完成
const shuffledQuestions = shuffleArray([...questions]); // 浅拷贝避免污染原始数据
let currentQuestionIndex = 0;

随后,在显示题目时,不再依赖外部 index 变量,而是使用 currentQuestionIndex 从 shuffledQuestions 中取题:

function showQuestion() {
  if (currentQuestionIndex >= shuffledQuestions.length) {
    alert("测验结束!");
    return;
  }

  const q = shuffledQuestions[currentQuestionIndex];
  questionText.textContent = q.question;

  const optionTag = `
    <div class="option"><span>${q.options[0]}</span></div>
    <div class="option"><span>${q.options[1]}</span></div>
    <div class="option"><span>${q.options[2]}</span></div>
    <div class="option"><span>${q.options[3]}</span></div>
  `;
  document.querySelector('.options').innerHTML = optionTag;
}

// 启动测验时调用
showQuestion();
? 为什么这比“边抽边查重”更好? 时间复杂度稳定 O(n),无死循环风险; 保证所有题目恰好出现一次,且顺序完全随机; 符合人类认知习惯(如考试卷本身是固定题序,只是题序被预先打乱); 易于扩展:支持“只抽 10 题”可改为 shuffleArray(questions).slice(0, 10)。

⚠️ 注意事项

  • ❌ 不要直接修改 questions.js 中的原始数组(如全局 questions = shuffleArray(questions)),否则多次重启测验会复用同一乱序结果;应每次新建副本。
  • ✅ 若需支持“重新测验”,只需再次调用 shuffleArray([...questions]) 并重置 currentQuestionIndex = 0。
  • ? 确保 questions.js 是通过 <script> &#27491;&#30830;&#24341;&#20837;&#19988;&#25191;&#34892;&#26089;&#20110; script.js&#65292;&#25110;&#20351;&#29992; ES &#27169;&#22359; import &#26174;&#24335;&#22768;&#26126;&#20381;&#36182;&#12290;</script>
  • ? 如需保留题号显示(如“第 7 题”),可改用 shuffledQuestions[currentQuestionIndex].numb,但注意它反映的是原始编号,非当前顺序。

通过这一改进,你的工作培训测验将真正具备专业性与可复用性——每一次练习,都是全新的挑战。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

javascript es6 java html js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.25

354

5

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

5016

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1455

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1938

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

10563

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

1060

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3204

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1669

5

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

2023.09.21

5489

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习