| Type: | Package |
| Title: | Fast Random Number Generation with Multiple Engines and Distributions |
| Version: | 0.1.3 |
| Author: | Kristján Jónasson [aut, cre] |
| Maintainer: | Kristján Jónasson <jonasson@hi.is> |
| Description: | Random number generation library implemented in C with multiple engines and distribution functions, providing an R interface focused on correctness, speed, and reproducibility. Supports various PRNGs including xoshiro256++/**, PCG64, Philox, and ChaCha20, with methods for continuous, discrete, and multivariate distributions. |
| License: | BSD_3_clause + file LICENSE |
| Encoding: | UTF-8 |
| Depends: | R (≥ 4.0.0) |
| Imports: | R6 |
| Suggests: | testthat (≥ 3.0.0) |
| Config/testthat/edition: | 3 |
| RoxygenNote: | 7.3.2 |
| URL: | https://github.com/jonasson2/randompack |
| BugReports: | https://github.com/jonasson2/randompack/issues |
| Collate: | 'configure.R' 'continuous.R' 'discrete.R' 'randompack-package.R' 'rng.R' |
| NeedsCompilation: | yes |
| Packaged: | 2026-04-22 09:55:36 UTC; jonasson |
| Repository: | CRAN |
| Date/Publication: | 2026-04-22 13:40:02 UTC |
randompack: Fast Random Number Generation with Multiple Engines and Distributions
Description
Random number generation library implemented in C with multiple engines and distribution functions, providing an R interface focused on correctness, speed, and reproducibility. Supports various PRNGs including xoshiro256++/**, PCG64, Philox, and ChaCha20, with methods for continuous, discrete, and multivariate distributions.
Quick Start
Create an RNG instance with randompack_rng() and use its methods to
generate random variates:
rng <- randompack_rng() # Default: x256++simd
rng <- randompack_rng("pcg64") # Specify engine
x <- rng$normal(100, mu=1, sigma=2) # Generate 100 N(1,2) variates
Available Engines
Among the supported underlying random number generators (engines) are
xoshiro256++, xoshiro256**, PCG64 DXSM, sfc64, Philox-4x64, and ChaCha20.
See randompack_rng for a complete list.
Author(s)
Maintainer: Kristján Jónasson jonasson@hi.is
See Also
randompack_rng for creating and using random number generators;
randompack_engines for a list of available engines
Available RNG Engines
Description
Returns a data frame of supported random number generator engines with their descriptions.
Usage
randompack_engines()
Value
A data.frame with columns engine (short name) and
description (full name and citation).
Create and Use Random Number Generators
Description
To create a random number generator (RNG) object use randompack_rng(),
and to specify the underlying RNG engine use randompack_rng(engine) where
engine is a character string naming the engine (see Available Engines
below).
Usage
randompack_rng(engine = "x256++simd", bitexact = FALSE, full_mantissa = FALSE)
Arguments
engine |
RNG engine |
bitexact |
Logical; set TRUE to make samples bit-identical across platforms |
full_mantissa |
Logical; set TRUE to use full mantissas for floating draws |
Details
Once created, the RNG object provides methods for drawing samples from
various distributions (e.g., $normal(), $uniform(), $int()). The object
can be configured using configure methods (e.g., $seed(), $randomize()).
Multiple independent RNG objects can be used for parallel random number
generation across different processes or threads.
Value
An RNG object with methods for drawing random variates.
Available Engines
x256++simd | xorshift256++ with streams (default) | |
sfc64simd | sfc64 with streams | |
x256++ | xoshiro256++ (Vigna and Blackman, 2018) | |
x256** | xoshiro256** (Vigna and Blackman, 2018) | |
x128+ | xorshift128+ (Vigna, 2014) | |
xoro++ | xoroshiro128++ (Vigna and Blackman, 2016) | |
pcg64 | PCG64 DXSM (O'Neill, 2014) | |
sfc64 | sfc64 (Chris Doty-Humphrey, 2013) | |
squares | squares64 (Widynski, 2021) | |
philox | Philox-4×64 (Salmon and Moraes, 2011) | |
cwg128 | cwg128 (Działa, 2022) | |
ranlux++ | ranlux++ (Sibidanov, 2017) | |
chacha20 | ChaCha20 (Bernstein, 2008) |
Continuous distributions
The RNG object provides methods for generating random variates from common
continuous probability distributions. All methods return a numeric vector
of length len.
rng$unif(len)Uniform variates on [0,1).
rng$unif(len, a, b)Uniform variates on [a,b) with
a < b.rng$normal(len)Standard normal variates (mean 0 and standard deviation 1).
rng$normal(len, mu, sigma)Normal variates with mean
muand standard deviationsigma(defaults 0 and 1).rng$skew_normal(len, mu, sigma, alpha)Skew-normal variates with location
muand scalesigma(defaults 0 and 1), and shapealpha(required).rng$lognormal(len, mu, sigma)Lognormal variates derived from an underlying normal distribution (defaults 0 and 1).
rng$exp(len)Standard exponential variates (scale 1).
rng$exp(len, scale)Exponential variates with scale
scale.rng$gamma(len, shape, scale)Gamma variates with given shape and scale (default 1).
rng$chi2(len, nu)Chi-square variates with
nudegrees of freedom.rng$beta(len, a, b)Beta variates with shape parameters
aandb.rng$t(len, nu)Student's t variates with
nudegrees of freedom.rng$f(len, nu1, nu2)F variates with
nu1andnu2degrees of freedom.rng$gumbel(len, mu, beta)Gumbel variates with location
muand scalebeta(defaults 0 and 1).rng$pareto(len, xm, alpha)Pareto variates with minimum value
xmand shapealpha.rng$weibull(len, shape, scale)Weibull variates with given shape and scale (default 1).
rng$mvn(n, Sigma, mu = NULL)Multivariate normal variates as an
nbydmatrix, wheredis the dimension ofSigma.
Discrete distributions
The RNG object provides methods for generating random variates from common discrete distributions and combinatorial constructions.
rng$int(len, min, max)Uniform integers on
[min, max].rng$perm(n)Random permutation of
1:n.rng$sample(n, k)Sample
kelements without replacement from1:n.rng$raw(len)Generate
lenrandom bytes as a raw vector.
Configuration and Copying
Methods for creating, configuring, and managing RNG state. All state-setting
methods accept numeric vectors (double or integer) whose elements must be
nonnegative whole numbers not exceeding 2^{32}-1. Where applicable,
shorter vectors are padded with zeros.
rng$seed(seed, spawn_key = integer(0))-
Reinitialize the RNG deterministically from
seedand an optional numeric vectorspawn_key. rng$randomize()Randomize the RNG state from system entropy.
rng$jump(p)-
Jump an xor-family or
ranlux++engine ahead by2^psteps. Thex128+andxoro128++engines supportp = 32, 64, 96, whilex256++,x256**,x256++simd, andranlux++also supportp = 128andp = 192. rng$advance(delta)-
Advance the
pcg64engine by an arbitrary 128-bit delta.deltamay be a scalar, interpreted as[delta, 0], or have length up to 4; shorter vectors are zero-padded. rng$duplicate()Duplicate the RNG, preserving its state.
rng$serialize()Serialize the current RNG state as a raw vector.
rng$deserialize(raw_state)Restore state from a raw vector created by
serialize().rng$set_state(state)Set the engine state directly (advanced use).
rng$pcg64_set_inc(inc)-
Set the increment of the PCG64 engine. The increment may have length up to 4 and shorter vectors are zero-padded.
rng$cwg128_set_weyl(weyl)-
Set the Weyl increment of the cwg128 engine.
weylmay have length up to 4 and shorter vectors are zero-padded. rng$sfc64_set_abc(abc)-
Set the
a,b,cstate words of the sfc64 engine.abcmay have length up to 6 and shorter vectors are zero-padded. rng$chacha_set_nonce(nonce)-
Set the nonce of the ChaCha20 engine. The nonce may have length up to 3 and shorter vectors are zero-padded.
rng$philox_set_key(key)-
Set the key of the Philox engine. The key may have length up to 4 and shorter vectors are zero-padded.
rng$squares_set_key(key)-
Set the key of the Squares engine. The key may have length up to 2 and shorter vectors are zero-padded.
See Also
randompack_engines to list all available engines
Examples
# Create an RNG
rng <- randompack_rng() # Default engine (xoshiro256++)
rng_pcg <- randompack_rng("pcg64") # Specify engine
rng_chacha <- randompack_rng("chacha20")
# Continuous distributions
x <- rng$unif(5)
x <- rng$normal(100) # Standard normal
x <- rng$normal(100, 1, 2) # N(1,2)
x <- rng$skew_normal(100, mu=0, sigma=1, alpha=2)
x <- rng$lognormal(5)
x <- rng$beta(5, a=2, b=3)
Sigma <- diag(2)
x <- rng$mvn(10, Sigma, mu=c(1,2))
# Discrete distributions
x <- rng$int(5, min=1, max=10)
x <- rng$perm(5)
x <- rng$sample(10, k=3)
x <- rng$raw(4)
# Configuration and copying
rng$seed(12345) # seed for reproducibility
rng$randomize() # randomize from system entropy
rngm <- randompack_rng(full_mantissa = TRUE) # 53-bit mantissas for doubles
rng2 <- rng$duplicate() # duplicate with same state
identical(rng$unif(3), rng2$unif(3)) # TRUE
raw_state <- rng$serialize() # save state
rng3 <- randompack_rng() # another default RNG
rng3$deserialize(raw_state) # restore state
identical(rng$unif(3), rng3$unif(3)) # TRUE
rng_sq <- randompack_rng("squares") # engine-specific state setting
rng_sq$set_state(c(2, 0, 0, 0)) # counter = (2,0)
rng_sq$squares_set_key(c(3,4))