Algorithme pour générer des nombres aléatoires de Poisson et de binôme?

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 des nombres aléatoires tirés d'une distribution de Poisson est obtenu en utilisant cette recette simple: si x1, x 2,... 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 · x 2·... · x k+1 < e - λ

j'ai trouvé une autre page décrivant 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 la probabilité p d'une tête sur un seul lancer. Si vous générez N uniforme aléatoire nombres sur l'intervalle (0,1) et compter le nombre inférieur à p, puis le compte 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).

18
demandé sur Kip 2009-08-07 01:20:13

4 réponses

distribution de Poisson

Voici comment dit Wikipedia Knuth a 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, qui serait la suivante:

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

Passe par le chapitre 10 de l' Non-Aléatoire Uniforme Variable Aléatoire Génération (PDF) par Luc Devroye (que j'ai consultées à partir de la L'article de 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;
}

s'il vous Plaît remarque

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

37
répondu Kip 2015-01-30 03:52:44

pour ceci et d'autres problèmes numériques la bible est le livre de recettes numériques.

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

Ou vous pouvez le voir sur google livres: 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 devrait être très facile à transférer vers 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 de l'ouvrage.

3
répondu Pablojim 2009-08-07 08:34:28

bien que la réponse Postée par Kip soit parfaitement valide pour générer des VR de Poisson avec un faible taux d'arrivées (lambda), le deuxième algorithme postée dans Wikipedia Génération de Poisson variables Aléatoires est préférable pour un taux d'arrivées plus élevé en raison de la stabilité numérique.

j'ai rencontré des problèmes lors de la mise en œuvre d'un des projets nécessitant la génération de Poisson RV avec lambda très élevé en raison de cela. Je suggère donc de l'autre côté.

2
répondu Ashutosh Gupta 2015-07-10 10:41:05

il y a 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 le papier de 1988 "Binomial aléatoire Variate Generation", que je vous recommande car ils utilisent un algorithme optimisé.

Cordialement

1
répondu Miguel Ángel Martínez 2010-01-26 09:53:26