Генератор случайных чисел, который генерирует целые числа для Java - PullRequest
5 голосов
/ 10 октября 2010

Я хочу генерировать случайные целые числа в Java, но это в соответствии с некоторыми законами распределения. Более конкретно:

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

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

Вы можете мне помочь? Вы знаете библиотеку, которая может делать то, что я хочу? Я изучал библиотеку Майкла Фланагана, Colt и Apache's Commons Math, но у них нет того, что мне нужно.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 10 октября 2010

Я предлагаю вам использовать библиотеку Uncommons Maths , которая включает в себя различные случайные генераторы (например, Mersenne Twister, на основе AES) и дистрибутивы (пуассоновские, гауссовы и т. Д.)

Что касается «двойной проблемы»: почти все случайные генераторы генерируют двойные, потому что они наиболее часто используются. Если вам нужны целые числа, вам нужно сделать округление самостоятельно (достаточно будет позвонить на Math.round ). Допустим, вы генерируете случайные высоты людей с точностью до сантиметра: если ваш генератор случайных чисел возвращает 175,234, вы можете просто округлить его до 175. Это действительно не проблема.

Что касается пределов для экспоненциального распределения: не существует генераторов, которые позволили бы вам выбирать предельные значения, поскольку таких ограничений для экспоненциального распределения не существует. Экспоненциальное распределение обычно моделирует задержки между двумя последовательными событиями в пуассоновском процессе: задержка может быть всего 0 или может быть чрезвычайно высокой. Чрезвычайно высокие результаты действительно маловероятны, но они не являются невозможными. Вы можете решить эту проблему, получив случайное число от генератора, добавив свой нижний предел и используя Math.max , чтобы обрезать его, если оно превышает ваш верхний предел. Но это уже не экспоненциальное распределение.

2 голосов
/ 10 октября 2010

Если у вас есть двойное число от 0 до 1, вы можете масштабировать его до целого числа:

int res = lowLimit + (int) (myRandFunction () * (highLimit - lowLimit));

Редактировать:

Почему мне отказали в голосовании?Он сожалеет, что у него есть функция, которая возвращает двойное распределение, которое он хочет (я угадал двойную форму от 0 до 1), так что это сработает.

0 голосов
/ 10 октября 2010

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

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html

0 голосов
/ 10 октября 2010

Просто сгенерируйте двойное и масштабируйте его до целочисленного диапазона, который вам необходим.Например, если обычный (равномерный) генератор случайных чисел генерирует числа от 0,0 до 1,0, а вам нужны числа от 0 до 100, вы просто умножите сгенерированное случайное число на 100.

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