Как я могу подогнать случайно сгенерированное число к собственному распределению "кривой колокола"? - PullRequest
0 голосов
/ 25 апреля 2019

Я разработал значения, чтобы соответствовать нецентральной кривой колокольчика.Пробные прогоны, кажется, дают желаемые результаты, но есть ли что-то, что я пропускаю?

Что я обнаружил

Я нашел вопрос, который, как мне показалось, поможет, но они используют стандартное отклонение.

JavaScript Math.random Нормальное распределение (гауссова кривая колокола)?

Из приведенного выше вопроса:

  • Q: Является ли Math.random уже нормально распределенным?
  • A: Нет

Что у меня

const ranks = [
  ['X'   , 0.01, 0.01],
  ['SSS' , 0.03, 0.04],
  ['SS'  , 0.06, 0.10],
  ['S'   , 0.08, 0.18],
  ['A'   , 0.11, 0.29],
  ['B'   , 0.14, 0.43],
  ['C'   , 0.21, 0.64],
  ['D'   , 0.17, 0.81],
  ['E'   , 0.12, 0.93],
  ['F'   , 0.07, 1.00]
];

log('Total:', ranks.reduce((a, b) => a + b[1], 0).toFixed(2));
for (let i = 0; i < 10; i++) {
  generate();
}

/* Public */
function generate() {
  let percent = Math.random();
  log(percent.toFixed(4), getRank(percent));
}

/* Protected */
function getRank(percent) {
  return ranks.filter((rank, index) => {
    let min = index > 0 ? ranks[index - 1][2] : -1;
    return percent > min && percent <= rank[2];
  })[0][0];
}

/* Private */
function log() {
  let el = document.createElement('DIV');
  el.innerHTML = [].slice.call(arguments).join(' ');
  el.className = 'log-line';
  document.body.appendChild(el);
}
body {
  background: #666;
}

.log-line {
  font-family: monospace;
  background: #AAA;
  margin: 0.5em 0.25em;
  padding: 0.25em;
}

.log-line::before {
  content: '>>> ';
}

enter image description here

1 Ответ

0 голосов
/ 25 апреля 2019

Чего вам не хватает, так это:

  • Назначить каждый ранг ("X", "SS" и т. Д.) Точке на числовой линии.
  • Для каждого ранга вычислите нормальное распределение PDF (функция плотности вероятности) в этой точке (используя пользовательское среднее значение и стандартное отклонение). Это вероятность для этого ранга.
  • Учитывая реализацию здесь: разделите вероятность для каждого ранга на сумму всех вероятностей.
  • Учитывая реализацию здесь: Рассчитать совокупные вероятности.

Последние два шага не являются строго необходимыми, если вы используете реализацию взвешенного случайного выбора, которая & mdash;

  • позволяет суммировать вероятности, отличные от 1, и
  • вычисляет совокупные вероятности "на лету".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...