Получить случайную выборку элементов из массива, где элементы (которые также являются массивами) имеют общую сумму X - PullRequest
0 голосов
/ 23 апреля 2020

В массиве, таком как:

const myList = [['hi'], ['hello', 'bye'], ['ok'], ['blue', 'green', 'purple'], ['big', 'small', 'medium', 'orange', 'sky', 'ground', 'earth'], ['king', 'queen'], ['desk']]

Как я могу получить случайную выборку элементов в массиве, но итог должен быть определен входной переменной size.

Поэтому, если size = 3, будет возвращен массив, такой как

[['desk'], ['king', 'queen']]

или, возможно,

[['blue', 'green', 'purple']]

или даже

[['ok'], ['desk'], ['hi']]

Если size больше, чем количество элементов в сжатом myList, то он должен просто вернуть максимально доступные элементы.

Я не смог понять это, как это можно сделать?

1 Ответ

1 голос
/ 23 апреля 2020

Я бы предложил вам перемешать массив с помощью функции, подобной этой:

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

shuffled_arr = shuffle(shuffled_arr); // assign and shuffle the data to this arr

, а затем потяните 1 элемент, пока он не достигнет максимального предела.

var shuffled_arr = shuffle(myList); // to shuffle the data
var results_arr = [];
var maximum_len = 3;
var current_len = 0;

for (let i = 0; i < shuffled_arr.length; i++) 
{
    if(current_len == maximum_len) break;
    if(current_len + shuffled_arr[i].length  <= maximum_len)
    {
        current_len+= shuffled_arr[i].length;
        results_arr.push(shuffled_arr[i]);
    }
}

В конец у вас есть массив results_arr, содержащий X случайных строк.

Здесь вы можете проверить мою скрипку - https://jsfiddle.net/2ds4vxqp/ Приветствия.

...