Лучший способ сгенерировать набор целых чисел размера N, распределенных как нормальное распределение, с учетом среднего и стандартного значения.отклонение - PullRequest
3 голосов
/ 16 июля 2011

Я ищу способ генерирования набора целых чисел с указанным средним и стандартным значением. отклонение. * * +1001

Используя случайную библиотеку, можно сгенерировать набор случайных двойных чисел, распределенных по Гауссу, это будет выглядеть примерно так:

#include <tr1/random>

std::tr1::normal_distribution<double> normal(mean, stdDev);
std::tr1::ranlux64_base_01 eng;
eng.seed(1000);
for (int i = 0; i < N; i++)
{
    gaussiannums[i] = normal(eng);
}

Однако для моего приложения мне нужны целые числа вместо двойных. Итак, мой вопрос: как бы вы сгенерировали эквивалент выше, но для целых чисел вместо двойных? Один из возможных путей - это каким-то образом преобразовать двойные числа в целые, но я не знаю достаточно о том, как работает случайная библиотека, чтобы знать, можно ли это сделать способом, который действительно сохраняет форму колокольчика и среднее значение , отклонение.

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

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

1 Ответ

7 голосов
/ 16 июля 2011

Это невозможно.

Гауссово распределение непрерывно, набор целых чисел дискретен.

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

Что вы действительно пытаетесь сделать? Только среднее значение и стандартное отклонение имеют значение? Другие распределения имеют четко определенное среднее значение и стандартное отклонение, включая несколько дискретных распределений.


Например, вы можете использовать биномиальное распределение .

Решите уравнения для среднего и дисперсии одновременно, чтобы получить p и n . Затем сгенерируйте образцы из этого распределения.

Если n не является целым числом, вместо него можно использовать полиномиальное распределение.


Хотя в википедии описаны методы выборки из биномиального или полиномиального распределения, они не особенно эффективны. Существует метод эффективной генерации выборок из произвольного дискретного распределения, который вы можете использовать здесь.

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

  • вычисляет гауссовский CDF по целому ряду интересующих вас чисел
  • смещение и небольшое масштабирование для учета отсутствующих хвостов (так что оно варьируется от 0 до 1)
  • сохранить его в массиве

Чтобы выбрать из этого распределения:

  • генерирует единообразные реалы в диапазоне [0: 1]
  • использовать двоичный поиск для инвертирования CDF

Поскольку шаг усечения немного уменьшит стандартное отклонение (и также повлияет на среднее значение, если минимум и максимум не равноудалены от выбранного среднего значения), вам, возможно, придется слегка настроить параметры Гаусса заранее.

...