2013-05-08 16 views
5

Ich habe ein Problem, wo ich eine Reihe von zufälligen Integer-Werten zwischen 1 und einschließlich 5 unter Verwendung einer Wahrscheinlichkeitsverteilung generieren möchte.Generieren von zufälligen Ganzzahlen innerhalb des Bereichs mit einer Wahrscheinlichkeitsverteilung

Poisson und Inverse Gamma sind zwei Verteilungen, die die Eigenschaften zeigen, nach denen ich gesucht habe (Mehrheit bei mittleren, weniger höheren Zahlen), die ich gefunden habe.

Ich suche mit Apache Commons Math, aber ich war mir nicht sicher, wie man die Zahlen, die ich wollte, mit den verfügbaren Distributionen zu generieren.

+1

Nun, hier ist ein Ausgangspunkt: http://commons.apache.org/proper/commons-math/javadocs/api-3.2/org/apache/commons/math3/distribution/PoissonDistribution.html – Yuushi

Antwort

10

Von der Problembeschreibung, es klingt wie Sie wirklich wollen ein Probe aus einer diskreten Wahrscheinlichkeitsverteilung generiert, und Sie können EnumeratedIntegerDistribution für diesen Zweck verwenden. Wählen Sie die entsprechende Wahrscheinlichkeiten für jede Ihrer ganzen Zahlen, vielleicht so etwas wie die folgenden würde Ihre Bedürfnisse erfüllen:

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

nur zwicken die discreteProbabilities Werte auf das, was Sie benötigen.

+0

gibt es auch eine EnumeratedDistribution für Objekte? – testiguy

0

Ich würde nur produzieren gleichmäßig verteilten Zufallszahlen dann in die Verteilungsfunktion übergeben Sie wollen, so dass, wenn die Verteilungsfunktion wurde 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

Das sagte, wenn theres eine eingebaute Funktion in Apache, die einfacher sein wird –