Independent Streams. BlockSplitting and Leapfrogging
 Using different parameter sets. For each stream, you may use the same type of generators (for example, linear congruential generators), but choose their parameters in such a way as to produce independent random number sequences. For example, the Mersenne Twister generator has 6024 parameter sets, which ensure that the resulting subsequences are independent (see [Matsum2000] for details). Another example is WH generator that can create up to 273 random number streams. The produced sequences are independent according to the spectral test (see [Knuth81] for the spectral test details).
 Blocksplitting. Split the original sequence intoknonoverlapping blocks, wherekis the number of independent streams. Each of the streams generates random numbers only from the corresponding block. This method is known as blocksplitting or skippingahead.
 Leapfrogging. Split the original sequence intokdisjoint subsequences, wherekis the number of independent streams, in such a way that the first stream would generate the random numbersx_{1},xk_{+1},x_{2k+1},x_{3k+1}, ..., the second stream would generate the random numbersx_{2},xk_{+2},x_{2k+2},x_{3k+2}, ..., and, finally, the kth stream would generate the random numbersxk,x_{2k},x_{3k}, ... However, multidimensional uniformity properties of each subsequence deteriorate seriously askgrows. The method is useful ifkis fairly small.
vslSkipAheadStream( stream, nskip ) vslSkipAheadStreamEx( stream, n, nskip )
VSLStreamStatePtr stream;MKL_UINT64 nskip[3];nskip[0]=0;nskip[1]=0;nskip[2]=1;vslNewStream( &stream, brng, seed );vslSkipAheadStreamEx( stream, 3, nskip);
VSLStreamStatePtr stream[nstreams]; int k; for ( k=0; k<nstreams; k++ ) { vslNewStream( &stream[k], brng, seed ); vslSkipAheadStream( stream[k], nskip*k ); }
VSLStreamStatePtr stream[nstreams]; int k; vslNewStream( &stream[0], brng, seed ); for ( k=0; k<nstreams1; k++ ) { vslCopyStream( &stream[k+1], stream[k] ); vslSkipAheadStream( stream[k+1], nskip ); }
vslLeapfrogStream( stream, k, nstreams )
VSLStreamStatePtr stream[nstreams]; int k; for ( k=0; k<nstreams; k++ ) { vslNewStream( &stream[k], brng, seed ); vslLeapfrogStream( stream[k], k, nstreams ); }
BRNG

Leapfrog
 BlockSplitting ( vslSkipAheadStream )  BlockSplitting ( vslSkipAheadStreamEx ) 

MCG31m1

Supported

Supported



R250







MRG32k3a



Supported

Supported

MCG59

Supported

Supported



WH

Supported

Supported



MT19937



Supported



SFMT19937



Supported



MT2203







SOBOL

Supported to pick out individual components of quasirandom vectors

Supported



NIEDERREITER

Supported to pick out individual components of quasirandom vectors

Supported



PHILOX4X32X10



Supported

Supported

ARS5



Supported

Supported

ABSTRACT







NONDETERMINISTIC







... #define nstreams 6024 ... VSLStreamStatePtr stream[nstreams]; int k; for ( k=0; k< nstreams; k++ ) { vslNewStream( &stream[k], VSL_BRNG_MT2203+k, seed ); } ...