2013-05-08 22 views
5

Mam problem, w którym chcę wygenerować zestaw losowych wartości całkowitych od 1 do 5 włącznie, używając rozkładu prawdopodobieństwa.Generowanie losowych liczb całkowitych w zakresie o rozkładzie prawdopodobieństwa

Poisson i Inverse Gamma są dwoma rozkładami, które pokazują charakterystykę, którą obserwuję (większość w średniej, mniejszej liczbie), którą znalazłem.

Szukam przy użyciu Apache Commons Math, ale nie byłem pewien, jak wygenerować numery, które chciałem za pomocą dostępnych dystrybucji.

+1

Cóż, oto punkt wyjścia: http://commons.apache.org/proper/commons-math/javadocs/api-3.2/org/apache/commons/math3/distribution/PoissonDistribution.html – Yuushi

Odpowiedz

10

Z Twojego opisu problemu, to brzmi jak ty rzeczywiście chcesz próbka wygenerowana z dyskretnego rozkładu prawdopodobieństwa, i możesz użyć do tego celu EnumeratedIntegerDistribution. Wybierz odpowiednie prawdopodobieństwa dla każdej z liczb całkowitych, może coś jak poniżej będzie swoich potrzeb:

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); 

Wystarczy dostosować wartości discreteProbabilities aby cokolwiek można wymagać.

+0

czy istnieje również EnumeratedDistribution dla obiektów? – testiguy

0

ja po prostu produkować jednolicie rozproszone liczb losowych następnie przekazać je do funkcji rozkładu chcesz, więc jeśli funkcja dystrybucja została 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; 
     } 
    } 
+0

To powiedziawszy, jeśli tam jest wbudowana funkcja w Apache, która będzie łatwiejsza –

Powiązane problemy