所以我试图将问题随机化,但我一直在失败。我试图使用此代码添加,但它有一些问题。我将currentQuestion更改为randomQuiz,但它仍然有效,但还有一些问题需要解决。
var randomQuiz = Math.floor(Math.random()*quiz.length);
.js文件
var quiz = [{
"question": "What is the full form of IP?",
"choices": ["Internet Provider", "Internet Port", "Internet Protocol"],
"correct": "Internet Protocol"
}, {
"question": "Who is the founder of Microsoft?",
"choices": ["Bill Gates", "Steve Jobs", "Steve Wozniak"],
"correct": "Bill Gates"
}, {
"question": "1 byte = ?",
"choices": ["8 bits", "64 bits", "1024 bits"],
"correct": "8 bits"
}, {
"question": "The C programming language was developed by?",
"choices": ["Brendan Eich", "Dennis Ritchie", "Guido van Rossum"],
"correct": "Dennis Ritchie"
}, {
"question": "What does CC mean in emails?",
"choices": ["Carbon Copy", "Creative Commons", "other"],
"correct": "Carbon Copy"
} , {
"question": "wsxwsxwsxwsxwsxwsx?",
"choices": ["wsx", "edc", "qaz"],
"correct": "wsx"
} , {
"question": "qazqazqazqazqazqaz?",
"choices": ["qaz", "wsx", "edc"],
"correct": "qaz"
} , {
"question": "asdasdasdasdasdasd?",
"choices": ["asd", "qwe", "zxc"],
"correct": "asd"
} , {
"question": "zxczxczxczxczxczxc?",
"choices": ["zxc", "asd", "qwe"],
"correct": "zxc"
} , {
"question": "qweqweqweqweqweqwe?",
"choices": ["qwe", "asd", "zxc"],
"correct": "qwe"
}];
// define elements
var content = $("content"),
questionContainer = $("question"),
choicesContainer = $("choices"),
scoreContainer = $("score"),
submitBtn = $("submit");
// init vars
var currentQuestion = 0,
score = 0,
askingQuestion = true;
function $(id) { // shortcut for document.getElementById
return document.getElementById(id);
}
function askQuestion() {
var choices = quiz[currentQuestion].choices,
choicesHtml = "";
// loop through choices, and create radio buttons
for (var i = 0; i < choices.length; i++) {
choicesHtml += "<input type='radio' name='quiz" + currentQuestion +
"' id='choice" + (i + 1) +
"' value='" + choices[i] + "'>" +
" <label for='choice" + (i + 1) + "'>" + choices[i] + "</label><br>";
}
// load the question
questionContainer.textContent = "Q" + (currentQuestion + 1) + ". " +
quiz[currentQuestion].question;
// load the choices
choicesContainer.innerHTML = choicesHtml;
// setup for the first time
if (currentQuestion === 0) {
scoreContainer.textContent = "Score: 0 right answers out of " +
quiz.length + " possible.";
submitBtn.textContent = "Submit Answer";
}
}
function checkAnswer() {
// are we asking a question, or proceeding to next question?
if (askingQuestion) {
submitBtn.textContent = "Next Question";
askingQuestion = false;
// determine which radio button they clicked
var userpick,
correctIndex,
radios = document.getElementsByName("quiz" + currentQuestion);
for (var i = 0; i < radios.length; i++) {
if (radios[i].checked) { // if this radio button is checked
userpick = radios[i].value;
}
// get index of correct answer
if (radios[i].value == quiz[currentQuestion].correct) {
correctIndex = i;
}
}
// setup if they got it right, or wrong
var labelStyle = document.getElementsByTagName("label")[correctIndex].style;
labelStyle.fontWeight = "bold";
if (userpick == quiz[currentQuestion].correct) {
score++;
labelStyle.color = "green";
} else {
labelStyle.color = "red";
}
scoreContainer.textContent = "Score: " + score + " right answers out of " +
quiz.length + " possible.";
} else { // move to next question
// setting up so user can ask a question
askingQuestion = true;
// change button text back to "Submit Answer"
submitBtn.textContent = "Submit Answer";
// if we're not on last question, increase question number
if (currentQuestion < quiz.length - 1) {
currentQuestion++;
askQuestion();
} else {
showFinalResults();
}
}
}
function showFinalResults() {
content.innerHTML = "<h2>You've complited the quiz!</h2>" +
"<h2>Below are your results:</h2>" +
"<h2>" + score + " out of " + quiz.length + " questions, " +
Math.round(score / quiz.length * 100) + "%<h2>";
}
window.addEventListener("load", askQuestion, false);
submitBtn.addEventListener("click", checkAnswer, false);
.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Quiz app</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="quiz.css">
</head>
<body>
<div id="container">
<h1>Quiz app</h1>
<p>There will be no points awarded for unanswered questions.</p>
<div id="content">
<h3 id="question"></h3>
<div id="choices"></div>
<p><button id="submit"></button></p>
<p id="score"></p>
</div>
</div>
<script src="quiz.js"></script>
</body>
</html>
答案 0 :(得分:2)
只需将问题数组洗牌并一个接一个地挑选。在简化版中:
var questions = [1,2,3,4,5,6,7,8,9,10];
function shuffle(a) {
var cidx, ridx,tmp;
cidx = a.length;
while (cidx != 0) {
ridx = Math.floor(Math.random() * cidx);
cidx--;
tmp = a[cidx];
a[cidx] = a[ridx];
a[ridx] = tmp;
}
return a;
}
function* get_one(arr){
var idx = arr.length;
while(idx != 0)
yield arr[idx--];
}
questions = shuffle(questions);
console.log(questions);
var nextq = get_one(questions);
var alen = questions.length -1;
while(alen--)
console.log(nextq.next().value);
你不需要那个花哨的发生器,你可以在一个简单的循环中一个接一个地获得它。
答案 1 :(得分:1)
根据您在测验结束时所做的事情,最简单的方法是在答案完成后从数组中移除问题。
答案 2 :(得分:1)
我有另一个非常小的解决方案:
它复制可能值的数组并删除添加到新数组中的值。
function pickFrom(n, list) {
const copy = Array.from(list);
return Array.from(Array(n), () => copy.splice(Math.floor(copy.length * Math.random()), 1)[0]);
}
var quiz = [{
"question": "What is the full form of IP?",
"choices": ["Internet Provider", "Internet Port", "Internet Protocol"],
"correct": "Internet Protocol"
}, {
"question": "Who is the founder of Microsoft?",
"choices": ["Bill Gates", "Steve Jobs", "Steve Wozniak"],
"correct": "Bill Gates"
}, {
"question": "1 byte = ?",
"choices": ["8 bits", "64 bits", "1024 bits"],
"correct": "8 bits"
}, {
"question": "The C programming language was developed by?",
"choices": ["Brendan Eich", "Dennis Ritchie", "Guido van Rossum"],
"correct": "Dennis Ritchie"
}, {
"question": "What does CC mean in emails?",
"choices": ["Carbon Copy", "Creative Commons", "other"],
"correct": "Carbon Copy"
}, {
"question": "wsxwsxwsxwsxwsxwsx?",
"choices": ["wsx", "edc", "qaz"],
"correct": "wsx"
}, {
"question": "qazqazqazqazqazqaz?",
"choices": ["qaz", "wsx", "edc"],
"correct": "qaz"
}, {
"question": "asdasdasdasdasdasd?",
"choices": ["asd", "qwe", "zxc"],
"correct": "asd"
}, {
"question": "zxczxczxczxczxczxc?",
"choices": ["zxc", "asd", "qwe"],
"correct": "zxc"
}, {
"question": "qweqweqweqweqweqwe?",
"choices": ["qwe", "asd", "zxc"],
"correct": "qwe"
}];
console.log(pickFrom(3, quiz));
简化示例:
function pickFrom(n, list) {
const copy = Array.from(list);
return Array.from(Array(n), () => copy.splice(Math.floor(copy.length * Math.random()), 1)[0]);
}
list = [1, 2, 3];
console.log("Pick 1:", pickFrom(1, list).toString());
console.log("Pick 2:", pickFrom(2, list).toString());
console.log("Pick 3:", pickFrom(3, list).toString());
console.log("Pick 3:", pickFrom(3, list).toString());
console.log("Pick 3:", pickFrom(3, list).toString());
答案 3 :(得分:1)
我只是将这个列表洗牌 - 然后采取前x个问题:
var shuffled = quiz.map(x => { return {data: x, srt: Math.random()}})
.sort((a,b) => {return a.srt - b.srt})
.map(x => x.data);
答案 4 :(得分:0)
你需要写一些逻辑。以下是一个示例示例。
var list = [1, 2, 3, 4, 5];
var listDone = [];
var inProcess = true;
while(inProcess){
var randomQuiz = Math.floor(Math.random() * list.length);
var isDone = false;
for (var j = 0; j < listDone.length; j++) {
if (listDone[j] === randomQuiz)
isDone = true;
}
if (!isDone) {
console.log(list[randomQuiz]);//Display if not Done.
listDone.push(randomQuiz);
}
if (list.length == listDone.length)
inProcess = false;
}
答案 5 :(得分:0)
我在调用ask问题函数时添加了一个questionCounter变量来增加。我还更改了if then语句,使用问题计数器设置提交按钮的文本。 实时预览:http://codepen.io/larryjoelane/pen/yeKwqO
JavaScript的:
var questionCounter = 0;
var quiz = [{
"question": "What is the full form of IP?",
"choices": ["Internet Provider", "Internet Port", "Internet Protocol"],
"correct": "Internet Protocol"
}, {
"question": "Who is the founder of Microsoft?",
"choices": ["Bill Gates", "Steve Jobs", "Steve Wozniak"],
"correct": "Bill Gates"
}, {
"question": "1 byte = ?",
"choices": ["8 bits", "64 bits", "1024 bits"],
"correct": "8 bits"
}, {
"question": "The C programming language was developed by?",
"choices": ["Brendan Eich", "Dennis Ritchie", "Guido van Rossum"],
"correct": "Dennis Ritchie"
}, {
"question": "What does CC mean in emails?",
"choices": ["Carbon Copy", "Creative Commons", "other"],
"correct": "Carbon Copy"
}, {
"question": "wsxwsxwsxwsxwsxwsx?",
"choices": ["wsx", "edc", "qaz"],
"correct": "wsx"
}, {
"question": "qazqazqazqazqazqaz?",
"choices": ["qaz", "wsx", "edc"],
"correct": "qaz"
}, {
"question": "asdasdasdasdasdasd?",
"choices": ["asd", "qwe", "zxc"],
"correct": "asd"
}, {
"question": "zxczxczxczxczxczxc?",
"choices": ["zxc", "asd", "qwe"],
"correct": "zxc"
}, {
"question": "qweqweqweqweqweqwe?",
"choices": ["qwe", "asd", "zxc"],
"correct": "qwe"
}];
var currentQuestion = Math.floor(Math.random() * quiz.length);
// define elements
var content = $("content"),
questionContainer = $("question"),
choicesContainer = $("choices"),
scoreContainer = $("score"),
submitBtn = $("submit");
score = 0,
askingQuestion = true;
function $(id) { // shortcut for document.getElementById
return document.getElementById(id);
}
function askQuestion() {
//increment the counter
questionCounter++;
var choices = quiz[currentQuestion].choices,
choicesHtml = "";
// loop through choices, and create radio buttons
for (var i = 0; i < choices.length; i++) {
choicesHtml += "<input type='radio' name='quiz" + currentQuestion +
"' id='choice" + (i + 1) +
"' value='" + choices[i] + "'>" +
" <label for='choice" + (i + 1) + "'>" + choices[i] + "</label><br>";
}
// load the question
questionContainer.textContent = "Q" + (questionCounter) + ". " +
quiz[currentQuestion].question;
// load the choices
choicesContainer.innerHTML = choicesHtml;
// setup for the first time
if (questionCounter === 1) {
scoreContainer.textContent = "Score: 0 right answers out of " +
quiz.length + " possible.";
submitBtn.textContent = "Submit Answer";
}
}
function checkAnswer() {
// are we asking a question, or proceeding to next question?
if (askingQuestion) {
submitBtn.textContent = "Next Question";
askingQuestion = false;
// determine which radio button they clicked
var userpick,
correctIndex,
radios = document.getElementsByName("quiz" + currentQuestion);
for (var i = 0; i < radios.length; i++) {
if (radios[i].checked) { // if this radio button is checked
userpick = radios[i].value;
}
// get index of correct answer
if (radios[i].value == quiz[currentQuestion].correct) {
correctIndex = i;
}
}
// setup if they got it right, or wrong
var labelStyle = document.getElementsByTagName("label")[correctIndex].style;
labelStyle.fontWeight = "bold";
if (userpick == quiz[currentQuestion].correct) {
score++;
labelStyle.color = "green";
} else {
labelStyle.color = "red";
}
scoreContainer.textContent = "Score: " + score + " right answers out of " +
quiz.length + " possible.";
} else { // move to next question
// setting up so user can ask a question
askingQuestion = true;
// change button text back to "Submit Answer"
submitBtn.textContent = "Submit Answer";
// if we're not on last question, increase question number
if (currentQuestion < quiz.length - 1) {
currentQuestion++;
askQuestion();
} else {
showFinalResults();
}
}
}
function showFinalResults() {
content.innerHTML = "<h2>You've complited the quiz!</h2>" +
"<h2>Below are your results:</h2>" +
"<h2>" + score + " out of " + quiz.length + " questions, " +
Math.round(score / quiz.length * 100) + "%<h2>";
}
window.addEventListener("load", askQuestion, false);
submitBtn.addEventListener("click", checkAnswer, false);
答案 6 :(得分:-1)
您可以使用数组存储已询问的问题 在随机化期间每次检查数组,然后选择问题
var track=new Array();
while(true)//loop until Unique number
{
var randomQuiz=Math.floor(Math.random()*quiz.length);
if(track.indexOf(randomQuiz)==-1)//if you have got your unique random number
{
track.push(random);
break;
}
}
编辑:正如 Stephen P 指出它可能会导致性能问题,从 Brent Waggoner < Brent Wagoner < / em>的