Fisher Yates如何洗牌JavaScript数组?

Fisher Yates如何洗牌JavaScript数组?,javascript,arrays,sorting,shuffle,Javascript,Arrays,Sorting,Shuffle,我正在尝试修改来自的教程中的此测验应用程序 我想从主数组中随机选择一组问题,并将其推送到脚本用于填充问题的选择数组中,这样每次运行测验时,测验都会从主数组中随机选择一组问题。 我想我可以使用Fisher-Yates shuffle将主数组随机化,然后再将选定数量的问题放入选择数组 为什么费舍尔·耶茨洗牌可以使用这个阵型 var arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; var i=阵列长度,j,温度; 而(--i>0){

我正在尝试修改来自的教程中的此测验应用程序

我想从主数组中随机选择一组问题,并将其推送到脚本用于填充问题的选择数组中,这样每次运行测验时,测验都会从主数组中随机选择一组问题。 我想我可以使用Fisher-Yates shuffle将主数组随机化,然后再将选定数量的问题放入选择数组

为什么费舍尔·耶茨洗牌可以使用这个阵型

var arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var i=阵列长度,j,温度;
而(--i>0){
j=数学地板(数学随机()*(i+1));
温度=arr[j];
arr[j]=arr[i];
arr[i]=温度;
}
控制台日志(arr)我用这个解决了它:

// create questions
var questions = [
    new Question("Which one is not an object oriented programming language?", ["Java", "C#","C++", "C"], "C"),
    new Question("Which language is used for styling web pages?", ["HTML", "JQuery", "CSS", "XML"], "CSS"),
    new Question("There are ____ main components of object oriented programming.", ["1", "6","2", "4"], "4"),
    new Question("Which language is used for web apps?", ["PHP", "Python", "Javascript", "All"], "All"),
    new Question("MVC is a ____.", ["Language", "Library", "Framework", "All"], "Framework")
];

// Shuffle array
var arr = questions;
var i = arr.length, j, temp;
while(--i > 0){
    j = Math.floor(Math.random()*(i+1));
    temp = arr[j];
    arr[j] = arr[i];
    arr[i] = temp;
}

// choose 3 first questions from shuffeled array
var selection = arr.slice(0, 3);

// create quiz
var quiz = new Quiz(selection);

// display quiz
populate();

非常感谢您的帮助:)

使用这种洗牌方法可能会稍微容易一些,但这完全是您的偏好

函数问题(问题、选项、答案){this.Question=Question;this.choices=choices;this.answer=answer;}
//提出问题
变量问题=[
新问题(“哪一种不是面向对象编程语言?”,[“Java”,“C#”,“C++”,“C”],“C”),
新问题(“哪种语言用于设计网页样式?”、[“HTML”、“JQuery”、“CSS”、“XML”]、“CSS”),
新问题(“有面向对象编程的主要组件。”,[“1”,“6”,“2”,“4”,“4”),
新问题(“web应用程序使用哪种语言?”、[“PHP”、“Python”、“Javascript”、“All”]、“All”),
新问题(“MVC是一种语言”、“库”、“框架”、“所有”]、“框架”)
];
//洗牌阵列
var序列=随机序列(问题);
sequence.forEach((item,i)=>{sequence[i]=item.value;});
//从shuffeed数组中选择3个第一个问题
变量选择=序列切片(0,3);
控制台日志(选择)

Fisher-Yates算法只适用于数组索引,因此不需要根据数组内容进行不同的实现

为了说明我已将排序代码移动到一个函数中,以便可以重用它:

函数洗牌(arr){
var i=阵列长度,j,温度;
而(--i>0){
j=数学地板(数学随机()*(i+1));
温度=arr[j];
arr[j]=arr[i];
arr[i]=温度;
}
}
课堂提问{
构造函数(标题、选项、解决方案){
this.title=标题;
this.options=选项;
这个解决方案=解决方案;
}
}
var integerArray=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
变量问题=[
新问题(“1之后是什么?”,[“1”,“2”,“3”,“4”,“2”),
新问题(“2之后是什么?”,[“1”,“2”,“3”,“4”,“3”),
新问题(“3之后是什么?”,[“1”,“2”,“3”,“4”,“4”)
];
洗牌(整数数组);
洗牌(问题);

console.log(整数数组、问题)欢迎使用堆栈溢出!请拿着(你得到了一个徽章!),四处看看,仔细阅读,特别是我还推荐Jon Skeet's和。请在寄出前先通知我。更多关于搜索的信息。这似乎是一个有点快的dup。当然,这个游戏有现代Fisher-Yates shuffle的代码。但是这个问题是关于为什么它不能在他的对象数组上工作,我看不出为什么它不能以同样的方式工作。您能否创建一个可运行的代码段来显示问题?您尚未真正共享受影响的代码,因此无法判断您做错了什么。它在干净的环境中工作:(点击“运行”几次)。我想你还需要为我们提供更多的东西。