PoissonRandom.jl: Fast Poisson Random Numbers

PoissonRandom.jl is a component of the SciML ecosystem which allows for fast generation of Poisson random numbers.

Installation

To install PoissonRandom.jl, use the Julia package manager:

using Pkg
Pkg.add("PoissonRandom")

Usage

# Simple Poisson random
pois_rand(λ)

# Using another RNG
using RandomNumbers
rng = Xorshifts.Xoroshiro128Plus()
pois_rand(rng, λ)

Implementation

It mixes two methods. A simple count method and a method from a normal approximation. See this blog post for details.

Benchmark

using RandomNumbers,
      Distributions, BenchmarkTools, StaticArrays,
      RecursiveArrayTools, Plots, PoissonRandom
labels = ["count_rand", "ad_rand", "pois_rand", "Distributions.jl"]
rng = Xorshifts.Xoroshiro128Plus()

function n_count(rng, λ, n)
    tmp = 0
    for i in 1:n
        tmp += PoissonRandom.count_rand(rng, λ)
    end
end

function n_pois(rng, λ, n)
    tmp = 0
    for i in 1:n
        tmp += pois_rand(rng, λ)
    end
end

function n_ad(rng, λ, n)
    tmp = 0
    for i in 1:n
        tmp += PoissonRandom.ad_rand(rng, λ)
    end
end

function n_dist(λ, n)
    tmp = 0
    for i in 1:n
        tmp += rand(Poisson(λ))
    end
end

function time_λ(rng, λ, n)
    t1 = @elapsed n_count(rng, λ, n)
    t2 = @elapsed n_ad(rng, λ, n)
    t3 = @elapsed n_pois(rng, λ, n)
    t4 = @elapsed n_dist(λ, n)
    @SArray [t1, t2, t3, t4]
end

# Compile
time_λ(rng, 5, 5000000)
# Run with a bunch of λ
times = VectorOfArray([time_λ(rng, n, 5000000) for n in 1:20])'
plot(times, labels = labels, lw = 3)

benchmark result

So this package ends up about 30% or so faster than Distributions.jl (the method at the far edge is λ-independent, so that goes on forever).

Contributing

Reproducibility

The documentation of this SciML package was built using these direct dependencies,
Status `~/work/PoissonRandom.jl/PoissonRandom.jl/docs/Project.toml`
  [e30172f5] Documenter v1.14.1
  [e409e4f3] PoissonRandom v0.4.5 `~/work/PoissonRandom.jl/PoissonRandom.jl`
and using this machine and Julia version.
Julia Version 1.11.6
Commit 9615af0f269 (2025-07-09 12:58 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 4 × AMD EPYC 7763 64-Core Processor
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, znver3)
Threads: 1 default, 0 interactive, 1 GC (on 4 virtual cores)
A more complete overview of all dependencies and their versions is also provided.
Status `~/work/PoissonRandom.jl/PoissonRandom.jl/docs/Manifest.toml`
  [a4c015fc] ANSIColoredPrinters v0.0.1
  [1520ce14] AbstractTrees v0.4.5
  [944b1d66] CodecZlib v0.7.8
  [ffbed154] DocStringExtensions v0.9.5
  [e30172f5] Documenter v1.14.1
  [d7ba0133] Git v1.4.0
  [b5f81e59] IOCapture v0.2.5
  [92d709cd] IrrationalConstants v0.2.4
  [692b3bcd] JLLWrappers v1.7.0
  [682c06a0] JSON v0.21.4
  [0e77f7df] LazilyInitializedFields v1.3.0
  [2ab3a3ac] LogExpFunctions v0.3.29
  [d0879d2d] MarkdownAST v0.1.2
  [69de0a69] Parsers v2.8.3
  [e409e4f3] PoissonRandom v0.4.5 `~/work/PoissonRandom.jl/PoissonRandom.jl`
⌅ [aea7be01] PrecompileTools v1.2.1
  [21216c6a] Preferences v1.4.3
  [2792f1a3] RegistryInstances v0.1.0
  [3bb67fe8] TranscodingStreams v0.11.3
  [2e619515] Expat_jll v2.6.5+0
  [f8c6e375] Git_jll v2.50.1+0
  [94ce4f54] Libiconv_jll v1.18.0+0
  [9bd350c2] OpenSSH_jll v10.0.1+0
  [458c3c95] OpenSSL_jll v3.5.1+0
  [0dad84c5] ArgTools v1.1.2
  [56f22d72] Artifacts v1.11.0
  [2a0f44e3] Base64 v1.11.0
  [ade2ca70] Dates v1.11.0
  [f43a241f] Downloads v1.6.0
  [7b1f6079] FileWatching v1.11.0
  [b77e0a4c] InteractiveUtils v1.11.0
  [b27032c2] LibCURL v0.6.4
  [76f85450] LibGit2 v1.11.0
  [8f399da3] Libdl v1.11.0
  [37e2e46d] LinearAlgebra v1.11.0
  [56ddb016] Logging v1.11.0
  [d6f4376e] Markdown v1.11.0
  [a63ad114] Mmap v1.11.0
  [ca575930] NetworkOptions v1.2.0
  [44cfe95a] Pkg v1.11.0
  [de0858da] Printf v1.11.0
  [3fa0cd96] REPL v1.11.0
  [9a3f8284] Random v1.11.0
  [ea8e919c] SHA v0.7.0
  [9e88b42a] Serialization v1.11.0
  [6462fe0b] Sockets v1.11.0
  [f489334b] StyledStrings v1.11.0
  [fa267f1f] TOML v1.0.3
  [a4e569a6] Tar v1.10.0
  [8dfed614] Test v1.11.0
  [cf7118a7] UUIDs v1.11.0
  [4ec0a83e] Unicode v1.11.0
  [e66e0078] CompilerSupportLibraries_jll v1.1.1+0
  [deac9b47] LibCURL_jll v8.6.0+0
  [e37daf67] LibGit2_jll v1.7.2+0
  [29816b5a] LibSSH2_jll v1.11.0+1
  [c8ffd9c3] MbedTLS_jll v2.28.6+0
  [14a3606d] MozillaCACerts_jll v2023.12.12
  [4536629a] OpenBLAS_jll v0.3.27+1
  [efcefdf7] PCRE2_jll v10.42.0+1
  [83775a58] Zlib_jll v1.2.13+1
  [8e850b90] libblastrampoline_jll v5.11.0+0
  [8e850ede] nghttp2_jll v1.59.0+0
  [3f19e933] p7zip_jll v17.4.0+2
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

You can also download the manifest file and the project file.