Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中获取随机值,不包括以前选择的值_Javascript_Arrays_Loops_Random - Fatal编程技术网

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

Javascript 从数组中获取随机值,不包括以前选择的值,javascript,arrays,loops,random,Javascript,Arrays,Loops,Random,我已经开始使用Javascript构建一个超级基础的“常识测验”。。。但是我正在努力找到一种有效的方法来获得一个随机的问题,排除以前选择的问题 目前,我所拥有的是一个名为previous_questions的数组,该数组存储以前选择的问题的索引,以及一个while循环,如果数字已经存在于previous_questions数组中,该循环将继续为“r”生成一个随机值 var r = Math.floor(Math.random() * questions.length); while(previo

我已经开始使用Javascript构建一个超级基础的“常识测验”。。。但是我正在努力找到一种有效的方法来获得一个随机的问题,排除以前选择的问题

目前,我所拥有的是一个名为previous_questions的数组,该数组存储以前选择的问题的索引,以及一个while循环,如果数字已经存在于previous_questions数组中,该循环将继续为“r”生成一个随机值

var r = Math.floor(Math.random() * questions.length);
while(previous_questions.indexOf(r) >= 0) {
    r = Math.floor(Math.random() * questions.length);
}

虽然目前这种方法正在发挥作用,但我无法想象它是一种有效的方法,并且在没有问题可供选择的情况下可能会导致无限循环。哪种方法更有效?提前谢谢

有很多方法可以做到这一点。一种方法是有两个数组,一个包含所有未问问题,另一个包含所有已问问题。使用从1到n(未提问问题数组的大小)的随机数选择一个问题,然后从未提问问题列表中删除该问题,并将其放入已提问问题列表中。这样,您将永远不会进入无限循环,事实上,每次迭代只需要获得一个随机数。如果您无法改变未问问题的数组,那么您可以在操作开始时做一个数组的克隆,并使用该克隆做您想做的事情。

实现这一点的一种方法是将问题重新排列,而不是一次随机挑选问题

函数洗牌(a){
对于(设i=a.length-1;i>0;i--){
常数j=数学楼层(数学随机()*(i+1));
[a[i],a[j]=[a[j],a[i]];
}
返回a;
}
让问题=[“a”、“b”、“c”、“d”、“e”、“f”];
洗牌(问题);/*洗牌问题数组*/
//循环通过混乱的问题
问题。forEach(q=>{
控制台日志(q);

});您可以复制阵列,然后随机删除元素:

const left = questions.slice();

function getQuestion(){
  if(!left.length) return;

  return left.splice(Math.floor(Math.random() * left.length), 1)[0];
}