Генерации сочетания в JavaScript

348
21 января 2018, 05:59

Как можно сгенерировать случайное сочетание в JavaScript?

То есть k различных элементов из множества размера n.

(например, k различных чисел из множества {1, ..., n})

Answer 1

Чтобы сгенерировать случайное сочетание размера k из множества размера n можно сделать k шагов, на каждом из которых:

  • выбираем случайный элемент множества, используя Math.random()
  • добавляем его к сочетанию
  • удаляем выбранный элемент из множества

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

let numberElements = 10; 
let combinationSize = 6; 
// для примера сгенерируем сочетание из множества {0, 1, ..., n-1} 
let array = [...Array(numberElements).keys()]; 
 
let combination = []; 
while (combination.length < combinationSize) { 
  // выбираем случайный элемент массива и добавляем его к сочетанию 
  let randomIndex = Math.floor(Math.random() * array.length); 
  let randomElement = array[randomIndex]; 
  combination.push(randomElement); 
 
  // удаляем выбранный элемент из массива 
  array[randomIndex] = array[array.length - 1]; 
  array.pop(); 
} 
 
// результат --- массив combination 
console.log(combination)

В результате мы получаем массив, который, вообще говоря, упорядочен, поэтому мы получаем не сочетание, а размещение. Но можно сказать, что порядок нам не важен (например, отсортировав массив), и получится сочетание.

Должно работать за O(размер сочетания). Получающиеся сочетания имеют равномерное распределение, так как вероятность получить размещение a_1 ... a_k равна (ξ_i ­— элемент, выбранный на i-ом шаге)

— зависит только от n и k, а каждому сочетанию соответствует одинаковое (k!) число размещений.

READ ALSO
Функция array.map

Функция array.map

Подскажите, как перебрать массив auto и в зависимости от значения item вернуть в result определенное значение?

318
Логирование данных из ng-bind

Логирование данных из ng-bind

На странице, при нажатии на кнопку выводятся данные через ng-bind

323
JavaScript анимация на всплывающее окно

JavaScript анимация на всплывающее окно

Здравствуйте, не подскажите как сделать анимацию постепенное появление при нажатии на кнопку всплывающего окна и кнопку закрытия на id=exit...

299
[[!getFrontendRequests?]] в HTML коде (мб jQuery/AJAX/js)

[[!getFrontendRequests?]] в HTML коде (мб jQuery/AJAX/js)

Получил наследство в виде сайта, где требуется удалить пару постов, а посты подтягиваются непонятно откудаВ коде на месте, куда вставляются...

290