| Crates.io | probability-rs |
| lib.rs | probability-rs |
| version | 0.1.2 |
| created_at | 2025-10-28 20:28:20.580886+00 |
| updated_at | 2025-11-01 13:53:45.647364+00 |
| description | Dependency-free probability distributions; clear APIs, deterministic sampling. |
| homepage | |
| repository | https://github.com/brbtavares/probability-rs |
| max_upload_size | |
| id | 1905589 |
| size | 93,456 |
A small, dependency-free Rust library for probability distributions focused on numerical clarity, clean APIs, and reproducible random sampling.
Current scope:
Distribution, Continuous, Discrete, MomentsThis is a work-in-progress library. APIs may evolve. Contributions and feedback are welcome.
Add to your workspace as a path dependency or use locally:
# Cargo.toml
[dependencies]
probability-rs = { path = "./probability-rs" }
Example: sampling and basic queries
use probability_rs::dist::{normal, uniform, exponential, bernoulli, poisson, Distribution, Continuous, Discrete, Moments};
use probability_rs::rng::SplitMix64;
fn main() {
let normal = normal::Normal::new(0.0, 1.0).unwrap();
let uniform = uniform::Uniform::new(-1.0, 1.0).unwrap();
let expo = exponential::Exponential::new(2.0).unwrap();
let bern = bernoulli::Bernoulli::new(0.4).unwrap();
let pois = poisson::Poisson::new(3.0).unwrap();
let mut rng = SplitMix64::seed_from_u64(2024);
let x_n = normal.sample(&mut rng);
let x_u = uniform.sample(&mut rng);
let x_e = expo.sample(&mut rng);
let x_b = bern.sample(&mut rng);
let x_p = pois.sample(&mut rng);
println!("Normal sample: {x_n:.6} pdf(0)={:.6}", normal.pdf(0.0));
println!("Uniform sample: {x_u:.6} mean={:.3} var={:.3}", uniform.mean(), uniform.variance());
println!("Exponential sample: {x_e:.6} CDF(1)={:.6}", expo.cdf(1.0));
println!("Bernoulli sample: {x_b} p=0.4 var={:.3}", bern.variance());
println!("Poisson sample: {x_p} lambda=3 pmf(3)={:.6}", pois.pmf(3));
}
Run tests:
cargo test --all
Distribution (common):
cdf(x) -> f64, in_support(x) -> bool, sample(&mut Rng) -> ValueContinuous (f64): pdf(x) -> f64, inv_cdf(p) -> f64Discrete (i64): pmf(k) -> f64, inv_cdf(p) -> i64Moments: mean() -> f64, variance() -> f64, skewness() -> f64, kurtosis() -> f64 (excess), kurtosis_full() -> f64rng::RngCore, rng::SplitMix64This crate ships a few small, non-cryptographic PRNGs with a common trait rng::RngCore.
SplitMix64
use probability_rs::rng::SplitMix64;
let mut rng = SplitMix64::seed_from_u64(123);Xoroshiro128++
use probability_rs::rng::Xoroshiro128PlusPlus;
let mut rng = Xoroshiro128PlusPlus::seed_from_u64(123);Xoshiro256**
use probability_rs::rng::xoshiro256::Xoshiro256StarStar;
let mut rng = Xoshiro256StarStar::seed_from_u64(123);PCG32 (XSH RR 64/32)
from_seed_and_stream(seed, stream); great distribution.use probability_rs::rng::Pcg32;
let mut rng = Pcg32::seed_from_u64(123);let mut rng = Pcg32::from_seed_and_stream(STATE, STREAM_ID);Guidelines by scenario:
stream)Note: none of these RNGs are cryptographic. For security-sensitive contexts, use a proper CSPRNG.
We use Criterion for micro-benchmarks. To run:
cargo bench
The included benchmark compares Poisson sampling for small (λ=2.5) and large (λ=250) regimes.
Distributions and structure
Inference and model assessment
Advanced sampling and performance
Dependence and multivariate
Stochastic processes and simulation
Practical statistics and summaries
API ergonomics and safety
serde, no_std (where viable), simd, special-fnsNumerics and special functions
Tooling and quality
MIT