2009-04-15 11 views
10

Von was ich verstehe, ist der Standardgenerator für die Normalverteilung. Ich muss Zufallszahlen erzeugen entsprechend der Normal, Uniform und Poisson-Verteilungen, aber ich kann nicht eine Klasse für die letzten 2Java Generator für Poisson und Uniform Verteilungen?

ich sie zu generieren scheinen zu finden, im Bereich von 0 - 999999

Antwort

5

Eigentlich ist die standard generator für die gleichmäßige Verteilung. Der grundlegende Zufallszahlengenerator in jeder Sprache/Bibliothek wird immer (in allen Fällen, die ich kenne) die gleichförmige Verteilung verwenden, da dies aus allen populären Pseudozufallszahlengenerierungsalgorithmen kommt - im Grunde sind einheitliche Zufallszahlen am einfachsten.

Ich sehe Eddie deutete bereits auf einen Link für andere Distributionen so werde ich den Rest dieses Schreiben überspringen ...

+0

Eigentlich scheint dieser Link auch die "nextGaussian" -Methode hervorzuheben, um auch normale Variablen zu erstellen. – gnovice

4

Lassen Sie mich durch die Tatsache, all diese Vorrede, dass nichts davon wirklich zufällig ist, ich Ich spreche über Pseudozufallszahlengeneratoren.

Lassen Sie mich auch sagen, dass ich dies nie für Produktionsqualität Code tun musste. Ich habe das für eine hw-Aufgabe getan, in Python. Ich simulierte Poisson-Zufallsvariablen.

Die Art und Weise, dass ich es Verwendung der folgenden Tatsachen gemacht habe:

  1. Eine Poisson Zufallsvariable ist eine Summe von exponentiellen Zufallsvariablen.
  2. Wir können die inverse Transformationsmethode verwenden, um exponentielle Zufallsvariablen zu generieren. http://en.wikipedia.org/wiki/Inverse_transform_sampling.

Insbesondere kann man die Tatsache nutzen, dass: wenn X 1, ..., X n unabhängig sind Standard exponentielle Zufallsvariablen, dann Z = min (k: X 1 + ... + X k < & Lambda;) - 1 ist Poisson (& lgr;).

So mit dem, schrieb ich den folgenden Code in Python Poisson Werte zu generieren:

class Poisson: 
    """Generate Poisson(lambda) values by using exponential 
    random variables.""" 

    def __init__(self, lam): 
     self.__lam = lam 

    def nextPoisson(self): 
     sum = 0 
     n = -1 
     while sum < self.__lam: 
      n += 1 
      sum -= math.log(random.random()) 
     return n 

Beispiel für die Verwendung der Klasse ist:

# Generates a random value that is Poisson(lambda = 5) distributed 
poisson = Poisson(5) 
poisson_value = poisson.nextPoisson 

ich das hier gepostet, weil es gut ist, zu wissen, dass diese Arten von Beziehungen existieren, und diese inverse Transformationsmethode gibt Ihnen eine allgemeine Möglichkeit, mit der Erzeugung von zufälligen Werten nach einer bestimmten kontinuierlichen Verteilung umzugehen.

+0

Ich habe die Formatierung der nummerierten Liste an das angepasst, was ich Ihrer Meinung nach beabsichtigt habe. Wenn dies nicht das ist, was Sie beabsichtigt haben, dann können Sie natürlich die Änderung rückgängig machen. – Eddie

12

Wie David betont hat, verwendet der mitgelieferte Pseudozufallszahlengenerator die Uniform-Verteilung.

Für die beiden anderen, würde ich die Cern Colt Bibliotheksfunktionen verwenden:

Diese Bibliotheksfunktionen, die Sie leicht erlauben, eine Zufallszahl aus jeder Verteilung genommen zu finden, anstatt Ihnen eine Wahrscheinlichkeitsdichtefunktion oder kumulative Dichtefunktion zu geben und zu erwarten, dass Sie die Zahl selbst ableiten (was der Apache Commons-Math-Ansatz zu sein scheint):

RandomEngine engine = new DRand(); 
Poisson poisson = new Poisson(lambda, engine); 
int poissonObs = poisson.nextInt(); 

Normal normal = new Normal(mean, variance, engine); 
double normalObs = normal.nextDouble(); 

Auch beachten Sie, dass die Poisson-Verteilung P (& lambda;) für große & lambda; kann sehr gut durch die Normalverteilung N (& lgr;, sqrt (& lgr;)) angenähert werden.

+0

Gibt es eine Möglichkeit, den Min- und Max-Wert anzugeben, den sie verwenden? Scheint nicht so, von dem was ich gesehen habe. –

+0

Das liegt daran, dass Poisson- und Normal-Verteilungen kein Maximum oder Minimum haben (Poisson hat ein festes Minimum von 0). –

+0

sehr schöne Bibliothek, danke! – peq

6

Der Standard Java RNG (java.util.Random) und seine Unterklassen wie java.security.SecureRandom erzeugen bereits einheitlich verteilte Werte.

Sie haben auch eine Methode nextGaussian, die normalverteilte Werte zurückgibt. Standardmäßig hat die Verteilung einen Mittelwert von Null und eine Standardabweichung von 1, aber dies wird trivialerweise optimiert. Multiplizieren Sie einfach mit den erforderlichen s. und füge den erforderlichen Mittelwert hinzu. So zum Beispiel, wenn Sie normalverteilten Werten mit einem Mittelwert von 6 und einer Standardabweichung von 2,5 wollten, würden Sie dies tun:

double value = rng.nextGaussian() * 2.5 + 6; 

Die Poisson-Verteilung nicht explizit unterstützt wird, aber man kann es durch gefälschte das gleiche tun wie Tom's Python code.

Alternativ können Sie interessiert sein in meiner Uncommons Maths library, die Dienstprogramm Klassen für Normal, Poisson und andere Verteilungen bietet.

+0

Der Link zu Uncommons ist 404. –