从数组中获取随机值,不包括之前选择的

时间:2018-02-19 13:24:11

标签: javascript arrays loops random

我已经开始使用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);
}

虽然目前正在发挥作用,但我无法想象它是一种有效的方法,当没有任何问题可供选择时,它可能会导致无限循环。这样做更有效的方法是什么?提前谢谢!

3 个答案:

答案 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];
}