Как Фишер-Йейтс перемешать массив JavaScript? - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь изменить это приложение викторины из учебника из Awais Mirza

Я хотел бы выбрать случайный набор вопросов из основного массива и pu sh it в массиве выбора скрипт использует для заполнения вопросов, поэтому тест будет давать случайный набор вопросов из основного массива каждый раз, когда тест выполняется. Я подумал, что мог бы использовать случайное перемешивание Фишера-Йейтса для рандомизации главного массива, прежде чем помещать выбранное количество вопросов в массив выбора.

Почему с этим массивом работает перемешивание Фишера-Йейтса;

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

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;
}
console.log(arr);

но не с этим массивом?

var Questions = [
    new Question("What comes after 1?", ["1", "2","3", "4"], "2"),
    new Question("What comes after 2?", ["1", "2", "3", "4"], "3"),
    new Question("What comes after 3?", ["1", "2", "3", "4"], "4")
];

Ответы [ 3 ]

0 голосов
/ 20 января 2020

Может быть немного проще с rando js .com , который использует этот метод тасования, но это полностью предпочтение.

function Question(question, choices, answer){ this.question = question; this.choices = choices; this.answer = answer; }

// 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 sequence = randoSequence(questions);
sequence.forEach((item, i) => {sequence[i] = item.value;});

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

console.log(selection);
<script src="https://randojs.com/1.0.0.js"></script>
0 голосов
/ 21 января 2020

Алгоритм Фишера-Йейтса работает исключительно с индексами массива, поэтому вам не нужны разные реализации в зависимости от содержимого массива .

Чтобы проиллюстрировать, что я переместил код сортировки в функция, поэтому ее можно использовать повторно:

function shuffle(arr) {
  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;
  }
}

class Question {
  constructor(title, options, solution) {
    this.title = title;
    this.options = options;
    this.solution = solution;
  }
}

var integerArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var questions = [
    new Question("What comes after 1?", ["1", "2","3", "4"], "2"),
    new Question("What comes after 2?", ["1", "2", "3", "4"], "3"),
    new Question("What comes after 3?", ["1", "2", "3", "4"], "4")
];
shuffle(integerArray);
shuffle(questions);
console.log(integerArray, questions);
0 голосов
/ 20 января 2020

Я добавил это с помощью этого:

// 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();

Большое спасибо за вашу помощь:)

...