2013-05-08 23 views
5

Ho un problema in cui voglio generare un insieme di valori interi casuali compresi tra 1 e 5 utilizzando una distribuzione di probabilità.Generazione di numeri casuali nell'intervallo con una distribuzione di probabilità

Poisson e Gamma inverso sono due distribuzioni che mostrano le caratteristiche che sto dopo (maggioranza a numeri medi, meno alti) che ho trovato.

Sto cercando di utilizzare Apache Commons Math ma non ero sicuro di come generare i numeri che volevo utilizzare le distribuzioni disponibili.

+1

Bene, ecco un punto di partenza: http://commons.apache.org/proper/commons-math/javadocs/api-3.2/org/apache/commons/math3/distribution/PoissonDistribution.html – Yuushi

risposta

10

Dalla tua descrizione del problema, sembra che si vuole realmente un esempio generato da una distribuzione di probabilità discreta, ed è possibile utilizzare EnumeratedIntegerDistribution per questo scopo. Scegli probabilità appropriati per ognuno dei vostri numeri interi, forse qualcosa di simile alla seguente sarebbe soddisfare le vostre esigenze:

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

Basta modificare i valori discreteProbabilities a tutto ciò che desiderate.

+0

c'è anche una EnumeratedDistribution for Objects? – testiguy

0

vorrei solo producono numeri casuali uniformemente distribuiti poi passare nella funzione di distribuzione che si desidera, quindi, se la funzione di distribuzione è stato 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

Detto questo se c'è una funzione incorporata in Apache che sarà più facile –

Problemi correlati