我已经开始使用Javascript构建一个超级基本的'一般知识测验'...但我正在努力想出一个有效的方法来获得一个随机问题,不包括以前选择的问题。
目前,我所拥有的是一个名为previous_questions的数组,它存储先前选择的问题的索引,以及一个while循环,如果该数字已经存在,则继续为'r'生成随机值previous_questions数组。
var r = Math.floor(Math.random() * questions.length);
while(previous_questions.indexOf(r) >= 0) {
r = Math.floor(Math.random() * questions.length);
}
虽然目前正在发挥作用,但我无法想象它是一种有效的方法,当没有任何问题可供选择时,它可能会导致无限循环。这样做更有效的方法是什么?提前谢谢!
答案 0 :(得分:2)
实现这一目标的一种方法是改变问题,而不是一次挑选随机问题。
function shuffle(a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
return a;
}
let questions = ["a", "b", "c", "d", "e", "f"];
shuffle(questions); /* Shuffle the question array */
//Looping thru the shuffled questions
questions.forEach(q => {
console.log(q);
});

随机播放功能here
答案 1 :(得分:0)
有很多方法可以做到这一点。一种方法是有2个数组,1个包含所有未提出的问题,另一个包含所有问题。您使用从1到n的随机数(未解决问题数组的大小)选择一个问题,然后从未解决的问题列表中删除该问题并将其放入问题列表中。这样你就永远不会陷入无限循环,事实上你每次迭代只需要得到一个随机数。如果您无法改变未提出问题的数组,那么您可以做的就是在操作开始时,克隆数组并使用该克隆执行您想要的操作。
答案 2 :(得分:0)
您可以复制数组,然后随机删除元素:
const left = questions.slice();
function getQuestion(){
if(!left.length) return;
return left.splice(Math.floor(Math.random() * left.length), 1)[0];
}