qrng (version 0.0-9)

qrng: Compute Quasi-Random Sequences


Computing Korobov, generalize Halton and Sobol' quasi-random sequences.


korobov(n, d = 1, generator, randomize = c("none", "shift"))
ghalton(n, d = 1, method = c("generalized", "halton"))
sobol  (n, d = 1, randomize = c("none", "digital.shift", "Owen", "Faure.Tezuka",
                                "Owen.Faure.Tezuka"), seed, skip = 0, ...)


korobov() and ghalton() return an

\((n,d)\)-matrix; for \(d=1\) an \(n\)-vector is returned.



number \(n\) of points to be generated \(\ge 2\).


dimension \(d\).


numeric of length \(d\) or length 1 (in which case it is appropriately extended to length \(d\)). All numbers must be in \(\{1,\dots,n\}\) and must be (coercible to) integers.


character string indicating the type of randomization for the point set.


one of the following:


no randomization.


a uniform random variate modulo 1.


one of the following:


no randomization.


a digital shift.

"Owen", "Faure.Tezuka","Owen.Faure.Tezuka"

calls sobol() from package randtoolbox with scrambling being 1, 2 and 3, respectively.

If randomize is a logical, then it is interpreted as "none" if FALSE and "digital.shift" if TRUE.


character string indicating which sequence is generated, generalized Halton or (plain) Halton.


if provided, an integer used within set.seed() for the non-scrambling randomize methods (so "none" or "digital.shift") or passed to the underlying sobol() from package randtoolbox for the scrambling methods. If not provided, the non-scrambling methods respect a global set.seed() but the scrambling methods do not (they then use 4711 as default); see sobol() from package randtoolbox for details.


number of initial points in the sequence to be skipped (skip = 0 means the sequence starts with at the origin). Note that for the scrambling methods this simply computes n + skip points and omits the first skip-many.


additional arguments passed to sobol() from package randtoolbox.


Marius Hofert and Christiane Lemieux


For sobol() examples see demo(sobol_examples). In particular, be careful when using skip > 0 and randomize = TRUE; in this case, choosing a wrong seed (or no seed) might lead to a bad sequence.

Note that these procedures call fast C code. The following restrictions apply:


n,d must be \(\le 2^{31}-1\).


n must be \(\le 2^{32}-1\) and d must be \(\le 360\).


if randomize = "none" or randomize = "digital.shift", n must be \(\le 2^{31}-1\) and d must be \(\le 16510\).

The choice of parameters for korobov() is crucial for the quality of this quasi-random sequence (only basic sanity checks are conducted). For more details, see l'Ecuyer and Lemieux (2000).

The generalized Halton sequence uses the scrambling factors of Faure and Lemieux (2009).


Faure, H., Lemieux, C. (2009). Generalized Halton Sequences in 2008: A Comparative Study. ACM-TOMACS 19(4), Article 15.

l'Ecuyer, P., Lemieux, C. (2000). Variance Reduction via Lattice Rules. Stochastic Models and Simulation, 1214--1235.

Lemieux, C., Cieslak, M., Luttmer, K. (2004). RandQMC User's guide. See https://www.math.uwaterloo.ca/~clemieux/randqmc/guide.pdf


Run this code
n <- 1021 # prime
d <- 4 # dimension

## Korobov's sequence
generator <- 76 # see l'Ecuyer and Lemieux
u <- korobov(n, d = d, generator = generator)
pairs(u, gap = 0, pch = ".", labels = as.expression(
      sapply(1:d, function(j) bquote(italic(u[.(j)])))))

## Randomized Korobov's sequence
u <- korobov(n, d = d, generator = generator, randomize = "shift")
pairs(u, gap = 0, pch = ".", labels = as.expression(
      sapply(1:d, function(j) bquote(italic(u[.(j)])))))

## Generalized Halton sequence (randomized by definition)
u <- ghalton(n, d)
pairs(u, gap = 0, pch = ".", labels = as.expression(
      sapply(1:d, function(j) bquote(italic(u[.(j)])))))

## For sobol() examples, see demo(sobol_examples)

Run the code above in your browser using DataLab