Взвешенная случайная выборка в JavaScript

JavaScriptJavaScriptBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе мы исследуем практическую реализацию функции взвешенной выборки в JavaScript. Функция возвращает случайный элемент из массива, при этом каждому элементу назначаются вероятности на основе предоставленных весов. С помощью этого лабы мы узнаем, как использовать методы массива, такие как reduce() и findIndex(), вместе с Math.random(), чтобы получить желаемый результат.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("JavaScript")) -.-> javascript/BasicConceptsGroup(["Basic Concepts"]) javascript(("JavaScript")) -.-> javascript/AdvancedConceptsGroup(["Advanced Concepts"]) javascript/BasicConceptsGroup -.-> javascript/variables("Variables") javascript/BasicConceptsGroup -.-> javascript/data_types("Data Types") javascript/BasicConceptsGroup -.-> javascript/arith_ops("Arithmetic Operators") javascript/BasicConceptsGroup -.-> javascript/comp_ops("Comparison Operators") javascript/AdvancedConceptsGroup -.-> javascript/higher_funcs("Higher-Order Functions") javascript/AdvancedConceptsGroup -.-> javascript/spread_rest("Spread and Rest Operators") subgraph Lab Skills javascript/variables -.-> lab-28696{{"Взвешенная случайная выборка в JavaScript"}} javascript/data_types -.-> lab-28696{{"Взвешенная случайная выборка в JavaScript"}} javascript/arith_ops -.-> lab-28696{{"Взвешенная случайная выборка в JavaScript"}} javascript/comp_ops -.-> lab-28696{{"Взвешенная случайная выборка в JavaScript"}} javascript/higher_funcs -.-> lab-28696{{"Взвешенная случайная выборка в JavaScript"}} javascript/spread_rest -.-> lab-28696{{"Взвешенная случайная выборка в JavaScript"}} end

Как получить взвешенную выборку из массива в JavaScript

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

  1. Откройте Терминал/SSH и введите node, чтобы начать практиковать программирование.
  2. Используйте Array.prototype.reduce(), чтобы создать массив частичных сумм для каждого значения в weights.
  3. Используйте Math.random(), чтобы сгенерировать случайное число, и Array.prototype.findIndex(), чтобы найти правильный индекс на основе массива, полученного ранее.
  4. Наконец, верните элемент arr с полученным индексом.

Вот код, который позволяет достичь этого:

const weightedSample = (arr, weights) => {
  let roll = Math.random();
  return arr[
    weights
      .reduce(
        (acc, w, i) => (i === 0 ? [w] : [...acc, acc[acc.length - 1] + w]),
        []
      )
      .findIndex((v, i, s) => roll >= (i === 0 ? 0 : s[i - 1]) && roll < v)
  ];
};

Вы можете протестировать эту функцию, передав массив и соответствующие веса в качестве аргументов:

weightedSample([3, 7, 9, 11], [0.1, 0.2, 0.6, 0.1]); // 9

Резюме

Поздравляем! Вы завершили лабу по взвешенной выборке. Вы можете практиковаться в более многих лабах в LabEx, чтобы улучшить свои навыки.