2009-06-10 5 views
6

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

Один из способов - создать перекошенное распределение, добавив два равномерных случайных числа вместе (т. Е. Прокатывая 2 кости).

+0

Это зависит от того, что вы хотите. –

ответ

6

Какое распределение отклонения вы хотите?

Вот техника, которая всегда работает, но не всегда самая эффективная. Кумулятивная функция распределения P (x) дает долю времени, когда значения падают ниже x. Таким образом, P (x) = 0 при наименьшем возможном значении x и P (x) = 1 при максимально возможном значении x. Каждое распределение имеет уникальный CDF, который кодирует все свойства распределения таким образом, что P (x) возрастает от 0 до 1. Если y - равномерное отклонение на отрезке [0,1], то x, удовлетворяющее P (x) = y будет присвоено в соответствии с вашим распределением. Чтобы сделать эту работу взаимодополняющей, вам просто нужен способ вычисления обратного P (x) для вашего распространения.

Meta.Numerics библиотека определяет большое количество часто используемых distrubtions (например, нормальное, логарифмически нормальное, экспоненциальное, хи квадрат, и т.д.) и имеет функции для вычисления CDF (Distribution.LeftProbability) и обратного ВПР (Distribution.InverseLeftProbability) каждого.

Для специализированных техник, которые бывают быстрыми для определенных распределений, например. техника Box-Muller для нормальных распределенных отклонений, см. книгу Numerical Recipies.

+0

Неважно, я просто искал способы генерации чисел в разных дистрибутивах. Наверное, я не думал об этом так далеко. Похоже, мне нужно еще немного почитать, это книга, о которой вы говорили? Numerical Recipes 3rd Edition: Искусство научных вычислений –

+0

Да, это книга. Это стандартное введение в числовые вычисления, но это большие инвестиции денег и усилий. Если вы просто хотите, чтобы черт отклонился, я бы придерживался библиотеки. Используя тот, который я упомянул, он прост как: Random rng = new Random (1); Распределение dist = новое NormalDistribution (1.0,2.0); double x = dist.InverseLeftProbability (rng.NextDouble()); – 2009-06-10 19:15:07

+0

Удивительно, это то, что я хотел бы получить намного лучше. Я планирую проверить книгу. Большое спасибо. –

10

Попробуйте создать равномерно распределенные случайные числа, а затем примените инвертированный неравномерный cumulative distribution function к каждому из них.

+2

+1 Это способ сделать это. – ralphtheninja

+0

Неправильно, вы должны инвертировать функцию распределения. Если вам требуется квадратное распределение, вы должны взять квадратные корни случайных чисел. – glmxndr

+0

Я делаю предположение, что функция распределения применяет соответствующую инверсию. Я думаю, что ваша проблема связана с терминологией типа распределения с используемой функцией. –

1

Если вы используете Java, то может представлять интерес моя библиотека Uncommons Maths. Он включает классы для генерации случайных чисел для униформных, гауссовских, пуассоновских, биномиальных и экспоненциальных распределений. This article показывает, как вы можете использовать эти дистрибутивы.

Смежные вопросы