2013-05-08 5 views
5

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

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

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

+1

Ну, вот стартовая точка: http://commons.apache.org/proper/commons-math/javadocs/api-3.2/org/apache/commons/math3/distribution/PoissonDistribution.html – Yuushi

ответ

10

Из вашего описания проблемы, это звучит, как вы на самом деле хотите образец, созданный из дискретного распределения вероятности, и для этой цели вы можете использовать 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 значения то, что вам требуется.

+0

, есть также перечисление для объектов? – testiguy

0

я бы просто производить равномерно распределенные случайные числа затем передать их в функцию распределения вы хотите, так что если функция распределения х^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; 
     } 
    } 
+0

Это сказано, если theres встроенная функция в Apache, которая будет проще –