Question

J'ai regardé autour de moi, mais je ne sais pas comment le faire.

J'ai trouvé cette page qui, dans le dernier paragraphe, dit:

Un générateur simple pour les nombres aléatoires tirés d'une distribution de Poisson est obtenu en utilisant cette recette simple: si x1, X2, ... est une séquence de nombres aléatoires avec une distribution uniforme entre zéro et un, k est le premier entier pour lequel le produit x1 · X2 · ... · XK + 1 <e

J'ai trouvé une autre page Décrire comment générer des nombres binomiaux, mais je pense qu'il utilise une approximation de la génération de Poisson, ce qui ne m'aide pas.

Par exemple, considérons les nombres aléatoires binomiaux. Un nombre aléatoire binomial est le nombre de têtes en n lancers d'une pièce avec une probabilité P d'une tête sur un seul lancer. Si vous générez n nombres aléatoires uniformes sur l'intervalle (0,1) et comptez le nombre inférieur à P, le nombre est un nombre aléatoire binomial avec les paramètres n et p.

Je sais qu'il y a des bibliothèques pour le faire, mais je ne peux pas les utiliser, seulement les générateurs uniformes standard fournis par la langue (Java, dans ce cas).

Était-ce utile?

La solution

Distribution de Poisson

Voici Comment Wikipedia dit que Knuth dit de le faire:

init:
     Let L ← e^(−λ), k ← 0 and p ← 1.
do:
     k ← k + 1.
     Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.

En Java, ce serait:

public static int getPoisson(double lambda) {
  double L = Math.exp(-lambda);
  double p = 1.0;
  int k = 0;

  do {
    k++;
    p *= Math.random();
  } while (p > L);

  return k - 1;
}

Distribution binomiale

Passer par le chapitre 10 de Génération de variés aléatoires non uniformes (PDF) par Luc Devroye (que j'ai trouvé lié à partir de L'article Wikipedia) donne ceci:

public static int getBinomial(int n, double p) {
  int x = 0;
  for(int i = 0; i < n; i++) {
    if(Math.random() < p)
      x++;
  }
  return x;
}

Veuillez noter

Aucun de ces algorithmes n'est optimal. Le premier est O (λ), le second est O (n). Selon la taille de ces valeurs généralement et la fréquence à laquelle vous devez appeler les générateurs, vous pourriez avoir besoin d'un meilleur algorithme. Le document que je lie ci-dessus a des algorithmes plus compliqués qui fonctionnent en temps constant, mais je laisserai ces implémentations comme un exercice pour le lecteur. :)

Autres conseils

Pour cela et d'autres problèmes numériques, la Bible est le livre de recettes numériques.

Il y a une version gratuite pour C ici: http://www.nrbook.com/a/bookcpdf.php (Plugin requis)

Ou vous pouvez le voir sur Google Books: http://books.google.co.uk/books?id=4t-Sybvuoqoc&lpg=pp1&ots=5ihminlhho&dq=numerical%20Recipes%20in%20C&pg=pp1#v=onepage&q=&f=false

Le code C doit être très facile à transférer en Java.

Ce livre vaut son poids en or pour beaucoup de problèmes numériques. Sur le site ci-dessus, vous pouvez également acheter la dernière version du livre.

Bien que la réponse publiée par KIP soit parfaitement valable pour générer des VR Poisson avec un petit taux d'arrivées (Lambda), le deuxième algorithme publié dans Wikipedia Générer des variables aléatoires de Poisson est meilleur pour le plus grand taux d'arrivées en raison de la stabilité numérique.

J'ai rencontré des problèmes lors de la mise en œuvre de l'un des projets nécessitant une génération de RV de Poisson avec de la Lambda très élevée en raison de cela. Je suggère donc l'inverse.

Il existe plusieurs implémentations du CERN dans la bibliothèque suivante (code Java):

http://acs.lbl.gov/~hoschek/colt/

En ce qui concerne les nombres aléatoires binomiaux, il est basé sur l'article de la "génération de variétés aléatoires binomiaux" de 1988, que je vous recommande car ils utilisent un algorithme optimisé.

Salutations

vous pouvez l'ajouter à Build.gradle

implementation 'org.kie.modules:org-apache-commons-math:6.5.0.Final'

et utiliser la classe Poissendistribution Plus de détails pour la classe de la classe

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top