J'ai besoin de générer des nombres aléatoires selon une distribution de Poisson pour mon programme mais j'ai remarqué que lorsque lambda est petit, l'algorithme est assez lent. J'ai entendu parler d'un algorithme de rejet qui serait plus efficace. Quelqu'un pourrait-il me rappeler comment ça marche exactement ?
Random variate generation

The less trivial task is to draw integer random variate from the Poisson distribution with given λ. {\displaystyle \lambda.}

Solutions are provided by:

A simple algorithm to generate random Poisson-distributed numbers (pseudo-random number sampling) has been given by Knuth:

The complexity is linear in the returned value k, which is λ on average. There are many other algorithms to improve this. Some are given in Ahrens & Dieter, see § References below.

For large values of λ, the value of L = e may be so small that it is hard to represent. This can be solved by a change to the algorithm which uses an additional parameter STEP such that e does not underflow:

The choice of STEP depends on the threshold of overflow. For double precision floating point format the threshold is near e, so 500 should be a safe STEP.

Other solutions for large values of λ include rejection sampling and using Gaussian approximation.

Inverse transform sampling is simple and efficient for small values of λ, and requires only one uniform random number u per sample. Cumulative probabilities are examined in turn until one exceeds u.
Génération de variables aléatoires

La tâche moins triviale consiste à tirer une variable aléatoire entière à partir de la distribution de Poisson avec un λ donné. {\displaystyle \lambda.}

Des solutions sont fournies par :

Un algorithme simple pour générer des nombres distribués selon une loi de Poisson (échantillonnage de nombres pseudo-aléatoires) a été donné par Knuth :

La complexité est linéaire par rapport à la valeur renvoyée k, qui est λ en moyenne. Il existe de nombreux autres algorithmes pour l'améliorer. Certains sont donnés dans Ahrens & Dieter, voir § Références ci-dessous.

Pour les grandes valeurs de λ, la valeur de L = e peut être si petite qu'elle est difficile à représenter. Ceci peut être résolu par une modification de l'algorithme qui utilise un paramètre supplémentaire PASSE tel que e ne provoque pas de sous-dépassement :

Le choix de PASSE dépend du seuil de débordement. Pour le format à virgule flottante double précision, le seuil est proche de e, donc 500 devrait être un PASSE sûr.

D'autres solutions pour les grandes valeurs de λ incluent l'échantillonnage par rejet et l'utilisation d'une approximation gaussienne.

L'échantillonnage par transformation inverse est simple et efficace pour les petites valeurs de λ, et ne nécessite qu'un seul nombre aléatoire uniforme u par échantillon. Les probabilités cumulatives sont examinées à tour de rôle jusqu'à ce qu'une d'entre elles dépasse u.
### Query ###
J'ai besoin de générer des nombres aléatoires selon une distribution de Poisson pour mon programme mais j'ai remarqué que lorsque lambda est petit, l'algorithme est assez lent. J'ai entendu parler d'un algorithme de rejet qui serait plus efficace. Quelqu'un pourrait-il me rappeler comment ça marche exactement ?

### Main Text ###
Random variate generation

The less trivial task is to draw integer random variate from the Poisson distribution with given λ. {\displaystyle \lambda.}

Solutions are provided by:

A simple algorithm to generate random Poisson-distributed numbers (pseudo-random number sampling) has been given by Knuth:

The complexity is linear in the returned value k, which is λ on average. There are many other algorithms to improve this. Some are given in Ahrens & Dieter, see § References below.

For large values of λ, the value of L = e may be so small that it is hard to represent. This can be solved by a change to the algorithm which uses an additional parameter STEP such that e does not underflow:

The choice of STEP depends on the threshold of overflow. For double precision floating point format the threshold is near e, so 500 should be a safe STEP.

Other solutions for large values of λ include rejection sampling and using Gaussian approximation.

Inverse transform sampling is simple and efficient for small values of λ, and requires only one uniform random number u per sample. Cumulative probabilities are examined in turn until one exceeds u.

### Supplementary Text ###
Génération de variables aléatoires

La tâche moins triviale consiste à tirer une variable aléatoire entière à partir de la distribution de Poisson avec un λ donné. {\displaystyle \lambda.}

Des solutions sont fournies par :

Un algorithme simple pour générer des nombres distribués selon une loi de Poisson (échantillonnage de nombres pseudo-aléatoires) a été donné par Knuth :

La complexité est linéaire par rapport à la valeur renvoyée k, qui est λ en moyenne. Il existe de nombreux autres algorithmes pour l'améliorer. Certains sont donnés dans Ahrens & Dieter, voir § Références ci-dessous.

Pour les grandes valeurs de λ, la valeur de L = e peut être si petite qu'elle est difficile à représenter. Ceci peut être résolu par une modification de l'algorithme qui utilise un paramètre supplémentaire PASSE tel que e ne provoque pas de sous-dépassement :

Le choix de PASSE dépend du seuil de débordement. Pour le format à virgule flottante double précision, le seuil est proche de e, donc 500 devrait être un PASSE sûr.

D'autres solutions pour les grandes valeurs de λ incluent l'échantillonnage par rejet et l'utilisation d'une approximation gaussienne.

L'échantillonnage par transformation inverse est simple et efficace pour les petites valeurs de λ, et ne nécessite qu'un seul nombre aléatoire uniforme u par échantillon. Les probabilités cumulatives sont examinées à tour de rôle jusqu'à ce qu'une d'entre elles dépasse u.

### Draft ###

### 1. Query Parsing

"algorithme de rejet qui serait plus efficace" → rejection sampling algorithm for Poisson distribution.

Key constraint: λ small. User suspects slow vanilla algorithm for low-λ cases.

Translation straightforward. "Quelqu'un pourrait-il me rappeler" = gentle reminder request, not complex derivation needed.

### 2. Problem Identification

Standard Poisson generation: O(λ) average complexity. Why?

Vanilla algorithm: generate uniform [0,1], check against cumulative probabilities sequentially until exceed target.

For small λ → need to check many uniform draws before finding rare large values. Wasteful.

### 3. Rejection Sampling Mechanics

Core idea: generate from broader distribution, reject samples outside target shape.

For Poisson(λ): 
- Generate uniform on [0,e^λ] 
- Reject if generated value > e^λ × e^(-k) × k/k! for some k
- Accept when condition fails

Wait. Check logic. ⟨H≈0.8⟩ Rejection boundary should be cumulative probability threshold, not density... hmm, generated uniform [0,e^λ] has density e^(-λ), so rejection boundary is e^(-λ) × e^(-k) × k/k! = e^(-λ-k) × k/k! = Poisson(λ) cumulative at k. Makes sense. ✓

### 4. Efficiency Analysis

Why faster for small λ?

Small λ → rare large values → rejection boundary e^(-λ-k) × k/k! quickly becomes negligible for large k.

Most rejections happen for small k values. Uniform generation of small integers much faster than sequential cumulative probability checking.

→ Fewer iterations per accepted sample

### 5. Implementation Details

```
Generate uniform U ~ U[0,1]
Generate integer K from discrete uniform [0,floor(e^λ/U)]
Reject if K > Poisson(λ) cumulative at K
Accept otherwise
```

Threshold: `threshold = 1 - U` for Poisson cumulative function.

※ Make sure to handle edge case: what if `floor(e^λ/U)` generates maximum possible value?

### 6. Performance Verification

⟨H≈0.3⟩ Verification through rejection sampling theory: acceptance probability = λ/(e^λ × e^(-λ)) = λ. Expected number of iterations = 1/acceptance_probability = 1/λ for each generated value. Much better than O(λ) worst-case vanilla approach.

Caveat: still O(1/λ) average complexity, but constant factor much smaller due to rejection optimization.

### 7. Practical Considerations

For λ << 1: rejection sampling wins decisively.
For λ > 1: vanilla method often faster due to better constant factors.
For very large λ: consider Gaussian approximation or other specialized methods.

∴ User's intuition correct - rejection sampling indeed more efficient for small λ Poisson generation.

### Answer###
L'algorithme de rejet est effectivement une méthode alternative particulièrement efficace pour générer des nombres aléatoires selon une distribution de Poisson lorsque lambda est petit.

Le principe fonctionne comme suit : au lieu de générer uniformément des nombres dans l'intervalle [0,1] et de vérifier séquentiellement les probabilités cumulatives, l'algorithme de rejet procède de manière différente.

Pour générer un nombre aléatoire suivant une distribution de Poisson de paramètre lambda :

1. Générez d'abord un nombre uniforme U tiré de l'intervalle [0,1]
2. Générez un entier K selon une distribution uniforme discrète dans l'intervalle [0, floor(e^λ/U)] où floor(x) représente la partie entière de x
3. Réjetez le nombre K si sa valeur dépasse la probabilité cumulative de Poisson à ce point
4. Acceptez le nombre K s'il respecte la condition

Cette approche est particulièrement efficace pour les petites valeurs de lambda car elle évite le processus itératif coûteux de vérification séquentielle des probabilités cumulatives. L'algorithme de rejet permet également une génération plus rapide des valeurs rares et grandes qui seraient autrement difficiles à obtenir avec les méthodes classiques.

Pour les grandes valeurs de lambda, d'autres solutions comme l'approximation gaussienne peuvent s'avérer plus efficaces que l'échantillonnage par rejet.