Как создать несколько массивов случайных чисел для javascript data-randomizer? - PullRequest
0 голосов
/ 11 февраля 2019

Я строю рандомизатор данных в javascript для класса истории, который я преподаю.Я хочу, чтобы пользователь ввел в форму число учеников, количество недель и количество назначенных сетей на каждого учащегося и отправил эти данные, нажав кнопку.Например 40 студентов, 12 недель, 5 заданий для каждого студента.Соответственно, я хочу, чтобы программа генерировала таблицу из 40 строк, каждая из которых содержала 5 случайных уникальных чисел от 1 до 12. Мне удалось заставить программу генерировать одну строку случайных чисел (функция weekAssigned), но затем я застрял.Как мне повторить функцию weekAssigned для создания других строк?Я пытался использовать двухмерные массивы, но я не знаю, как рандомизировать каждую строку в 2-мерном массиве.Буду очень признателен за ваши предложения!Думаю, мне следует как-то использовать циклы for или 2d, но я не знаю, как.

function getRandomWeek() {
    var x,y;
    x = document.getElementById("form1").elements["duration"].value; 
    y = Math.floor(Math.random() * x + 1);
    return y;
} 

function weeksAssigned() {
    var ints = [];
    var assignments = document.getElementById("form1").elements["assignments"].value; 
    while (ints.length < assignments) {                                                    
        var randomWeak = getRandomWeek();
        if (ints.indexOf(randomWeak)===-1) {   
          ints.push(randomWeak);
        }
    } 
    ints.sort(function(a, b){return a-b});
    return ints;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вот как вы можете сделать это, зацикливаясь на каждом ученике, а затем на каждом задании.

Сначала я создаю двумерный массив, заполненный 0, имеющий столько строк, сколько учеников и столько столбцовтак как есть назначения:

const assignArr = Array.from({ length: assignments }, (_, i) => 0);
const studentsArr = Array.from({ length: students }, (_, i) => [...assignArr]);

Затем вы используете два цикла, чтобы заполнить этот массив случайными неделями.Для каждого студента вы инициализируете доступные недели в начале цикла и передаете этот массив в getRandomWeeks(), который удаляет случайную неделю из массива, чтобы вы не повторяли их для каждого студента:

for (let student = 0; student < students; ++student) {
    const weeks = Array.from({ length: duration }, (_, i) => i);
    for (let work = 0; work < assignments; ++work) {
        studentsArr[student][work] = getRandomWeek(weeks) + 1;
    }
    studentsArr[student].sort((a, b) => a - b);
}

function getRandomWeek(weeks) {
  const weekIdx = Math.floor(Math.random() * weeks.length);
  return weeks.splice(weekIdx, 1).shift();
}

Затем вы просто вызываете вспомогательную функцию для генерации таблицы.Вот полная демонстрация.Вы можете отредактировать поля формы и посмотреть обновление таблицы:

function update() {
  const form = document.getElementById('form');
  const duration = form.elements['weeks'].value;
  const students = form.elements['students'].value;
  const assignments = form.elements['assignments'].value;
  
  const assignArr = Array.from({ length: assignments }, (_, i) => 0);
  const studentsArr = Array.from({ length: students }, (_, i) => [...assignArr]);
  
  for (let student = 0; student < students; ++student) {
    const weeks = Array.from({ length: duration }, (_, i) => i);
    for (let work = 0; work < assignments; ++work) {
      studentsArr[student][work] = getRandomWeek(weeks) + 1;
    }
    studentsArr[student].sort((a, b) => a - b);
  }
  makeTable(studentsArr);
}

function getRandomWeek(weeks) {
  const weekIdx = Math.floor(Math.random() * weeks.length);
  return weeks.splice(weekIdx, 1).shift();
}

function makeTable(data) {
  const header = document.querySelector('#table thead tr');
  header.innerHTML = '';
  for (let i = 0; i < data[0].length + 1; ++i) {
    const colEl = document.createElement('th');
    colEl.textContent = i === 0 ? 'Assignments' : `#${i}`;
    header.appendChild(colEl);
  }
  const tbody = document.querySelector('#table tbody');
  tbody.innerHTML = '';
  data.forEach((row, i) => {
    const rowEl = document.createElement('tr');
    const col0 = document.createElement('td');
    col0.textContent = `Student #${i + 1}`;
    rowEl.appendChild(col0);
    for (let col of row) {
      const colEl = document.createElement('td');
      colEl.textContent = col;
      rowEl.appendChild(colEl);
    }
    tbody.appendChild(rowEl);
  });
}

update();
table {
  margin: 10px;
  border-collapse: collapse;
  text-align: center;
}

td, th {
  border: 1px solid black;
  padding: 3px;
}
<form id="form">
  Weeks <input type="number" name="weeks" value=12 onchange="update()">
  Students <input type="number" name="students" value=10 onchange="update()">
  Assignments <input type="number" name="assignments" value=5 onchange="update()">
</form>

<table id="table">
  <thead>
    <tr>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>
0 голосов
/ 11 февраля 2019

Все, что вам нужно сделать, это зациклить weeksAssigned и поместить значения в двухмерный массив.

Чтобы помочь вам в этом, проверьте код ниже:

var students = document.getElementById("form1").elements["students"].value;
var studentsAssignList = [];
for(var i = 0; i < students; i++){
    var assignList = weeksAssigned();
    studentsAssignList.push(assignList);
}
// `studentsAssignList` will be your 2d array of all the assignments for all the students

Надеюсь, что этопомогает:)

...