Генерация случайных целых чисел в пределах диапазона с распределением вероятностей

У меня проблема, когда я хочу сгенерировать набор случайных целочисленных значений от 1 до 5 включительно, используя распределение вероятностей.

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

Я собираюсь использовать Apache Commons Math, но не знал, как сгенерировать числа, которые я хотел использовать из имеющихся дистрибутивов.


person jmc    schedule 08.05.2013    source источник
comment
Итак, отправная точка: commons.apache.org/proper/commons-math/javadocs/api-3.2/org/   -  person Yuushi    schedule 08.05.2013


Ответы (2)


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

int[] numsToGenerate           = new int[]    { 1,   2,    3,   4,    5   };
double[] discreteProbabilities = new double[] { 0.1, 0.25, 0.3, 0.25, 0.1 };

EnumeratedIntegerDistribution distribution = 
    new EnumeratedIntegerDistribution(numsToGenerate, discreteProbabilities);

int numSamples = 100;
int[] samples = distribution.sample(numSamples);

Просто измените значения discreteProbabilities так, как вам нужно.

person iainmcgin    schedule 08.05.2013
comment
есть ли также EnumeratedDistribution для объектов? - person ; 25.06.2015

Я бы просто произвел равномерно распределенные случайные числа, а затем передал бы их в функцию распределения, которую вы хотите, поэтому, если бы функция распределения была x ^ 2

import java.util.ArrayList;

import java.util.Random;



    public class Test{

        public static void main(String args[]){
            Test t=new Test();
        }

        public Test(){

            Random rnd=new Random();

            ArrayList<Double> data=new ArrayList<Double>();

            for(int i=0;i<1000;i++){
                data.add(useFunction(rnd.nextDouble()));
            }

        }

        public double useFunction(double in){
            return in*in;
        }
    }
person Richard Tingle    schedule 08.05.2013
comment
Тем не менее, если в Apache есть встроенная функция, это будет проще - person Richard Tingle; 08.05.2013