Parallel Pseudo Random Number Generator (PPRNG) 'sitmo' Header Files

Provided within are two high quality and fast PPRNGs that may be used in an 'OpenMP' parallel environment. In addition, there is a generator for one dimensional low-discrepancy sequence. The objective of this library to consolidate the distribution of the 'sitmo' (C++98 & C++11), 'threefry' and 'vandercorput' (C++11-only) engines on CRAN by enabling others to link to the header files inside of 'sitmo' instead of including a copy of each engine within their individual package. Lastly, the package contains example implementations using the 'sitmo' package and three accompanying vignette that provide additional information.

Travis-CI BuildStatusCRANRStudio mirrordownloads CRAN_Status_Badge

The repository houses the sitmo R package for Parallel Psuedo Random Number Generation (PPRNG). The package provides a way to obtain the SITMO Consulting’s PPRNG header files via LinkTo.

Installing sitmo

sitmo is available on both CRAN (Stable) and GitHub (Development). Using CRAN to download and install sitmo is the preferred option as it is significantly more stable vs. the GitHub version.

To install the package from CRAN, you can simply type:


The package will be installed and available in a similar fashion to other R packages. The main exception to this note is that to use sitmo to create a package you will need to acquire a compiler. This is detailed under the development install instructions.

Development Install Instructions

To install the package, you must first have a compiler on your system that is compatible with R.

For help on obtaining a compiler consult:

With a compiler in hand, one can then install the package from GitHub by:


Using sitmo

There are two ways to use sitmo. The first is to use sitmo in a standalone script. The script is typically built using sourceCpp(). The second approach allows for sitmo to be used within an R package.

Standalone file usage

Within the C++ file, the sitmo package provides an Rcpp plugins’ depends statement that must be included after sitmo.h header. This plugin statement indicates that a dependency is sitmo.

#include <Rcpp.h>
#include <sitmo.h> 
// [[Rcpp::depends(sitmo)]] 

To use the two other engines, threefry and vandercorput, they must be loaded like:

#include <Rcpp.h>
#include <threefry.h>      // or use #include <vandercorput.h> 
// [[Rcpp::depends(sitmo)]] 
// [[Rcpp::plugins(cpp11)]] 

sitmo Engine Example

Below is a hello world example meant to show a basic implementation of sitmo.

#include <Rcpp.h>
#include <random>  // C++11 RNG library 
#include <sitmo.h> // SITMO PPRNG 
// Rcpp depends attribute is required for standalone use.  
// It is not needed if in package linking to the sitmo package (detailed next). 
// [[Rcpp::depends(sitmo)]] 
// [[Rcpp::export]] 
Rcpp::NumericVector sitmo_draws_ex(unsigned int n) {
  Rcpp::NumericVector o(n);
  // Create a prng engine 
  sitmo::prng eng;
  // Draw from base engine 
  for (unsigned int i=0; i< n ; ++i){
    o(i) = eng();  
  return o;
/*** R

threefry Engine Example

Below is a hello world example meant to show a basic implementation of threefry. This engine requires C++11.

#include <Rcpp.h>
#include <threefry.h>
// Rcpp depends attribute is required for standalone use.  
// It is not needed if in package linking to the sitmo package (detailed next). 
// [[Rcpp::depends(sitmo)]] 
// threefry requires access to a C++11 compatible compiler 
// [[Rcpp::plugins(cpp11)]] 
// [[Rcpp::export]] 
void threefry_draws_streaming(unsigned int n) {
    sitmo::threefry eng1, eng2; 
    eng1.seed(0);  // reset the first engine (not really necessary) 
    eng2.seed(1);  // 2nd engine gets a different seed 
    Rcpp::Rcout << "\nTwo independent streams.\n";
    for (unsigned int i = 0; i < n; ++i)
        Rcpp::Rcout << eng1() << " " << eng2() << "\n";

vandercorput Engine Example

Below is a hello world example meant to show a basic implementation of vandercorput. This engine requires C++11.

#include <Rcpp.h>
#include <vandercorput.h>
// Rcpp depends attribute is required for standalone use.  
// It is not needed if in package linking to the sitmo package (detailed next). 
// [[Rcpp::depends(sitmo)]] 
// vandercorput requires access to a C++11 compatible compiler 
// [[Rcpp::plugins(cpp11)]] 
// [[Rcpp::export]] 
void vandercorput_draws_streaming(unsigned int n) {
    sitmo::vandercorput eng;
    for (unsigned int i = 0; i < n; ++i)
        Rcpp::Rcout << eng() << "\n"

Package usage

To use sitmo in your R package, modify the DESCRIPTION file by adding:

LinkingTo: Rcpp, sitmo
    Rcpp (>= 0.12.11)

To use C++11’s statistical distributions, you may want to add the following to your src/Makevars and src/ file:


Within a C++ file in src/, then add:

#include <Rcpp.h>
#include <sitmo.h>      // SITMO for C++98 & C++11 PPRNG 
#include <threefry.h>   // THREEFRY C++11-only PPRNG 
#include <vandercorput> // VANDERCORPUT C++11-only Low-discrepancy sequence 

You do not need to add each header file. Pick and choose the appropriate engine for your needs.


sitmo 2.0.1


  • Modified vandercorput.h by adding a newline to the end of the file.
  • Modified Makevars{.win} to use $(SHLIB_OPENMP_CXXFLAGS) instead of $(SHLIB_OPENMP_CFLAGS) in PKG_CXXFLAGS


  • Modified .travis.yml to compile using both cores instead of only one.

sitmo 2.0.0


  • Added threefry and vandercorput (#9, #10).
  • Added contributor Ralf Stubner (@rstub)


  • Modified threefry to be fully C++11 compliant. (#11, @rstub)
  • Removed the Rcpp.plugin.maker()

sitmo 1.2.2


  • Addressed import of Rcpp.plugin.maker() by using the exported variable name, e.g. ::, in place of the internal variable name, e.g. ::: (#7).
  • Updated sitmo URL to point to stdfin/random (#8).

sitmo 1.2.1


  • Removed extra ; in sitmo header to quiet compile warnings (#4, thanks @helske)
  • Updated sitmo_two_seeds() src and documentation in "Deployment of sitmo within C++ Code" so that it uses the second seed for eng2 and returns an n x 2 matrix instead of n x 3. (#5, thanks @helske)

sitmo 1.2.0


  • Added plugin registration for Rcpp:::Rcpp.plugin.maker() (#3)
  • Added CxxFlags() and sitmoCxxFlags() functions to display CXX_FLAGS required by sitmo. (#3)
  • Updated examples in README.Rmd and SITMO internal vignette to use the Rcpp depends attribute. (#3)


  • Corrected a signed and unsigned integer comparison in "Making a Uniform PRNG with sitmo" vignette.
  • Fixed notation in "Making a Uniform PRNG with sitmo" vignette.

sitmo 1.1.0


  • Added src/init.c to address R 3.4 C++ registration requirement (#2)
  • Clarified content in "Making a Uniform PRNG with sitmo" vignette.


  • Addressed signed and unsigned integer comparison in sitmo header (#1)
  • Corrected a URL that was problematic in "Deployment of sitmo within C++ Code" vignette.

sitmo 1.0.0


  • Embedded sitmo header file in an R package.
  • Provided code examples using sitmo header file.
  • Released three vignettes detailing sitmo contents:
    • Deployment of sitmo within C++ Code
    • Making a Uniform PRNG with sitmo
    • sitmo's BigCrush Results

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


2.0.2 by James Balamuta, 3 months ago,,

Report a bug at

Browse source code at

Authors: James Balamuta [aut, cre, cph] , Thijs van den Berg [aut, cph] , Ralf Stubner [ctb]

Documentation:   PDF Manual  

Task views: High-Performance and Parallel Computing with R

MIT + file LICENSE license

Imports Rcpp

Suggests knitr, rmarkdown, ggplot2

Linking to Rcpp

Suggested by bssm.

Linked to by CautiousLearning, RxODE, dqrng.

See at CRAN