Dirk Eddelbuettel — written Dec 30, 2012 — updated Jan 31, 2023 — source
The STL also contains random sampling and shuffling algorithms.
We start by looking at random_shuffle
.
There are two forms. The first uses an internal RNG with its own
seed; the second form allows for a function object conformant to
the STL’s requirements (essentially, given N
produce a uniform
draw greater or equal to zero and less than N
). This is useful
for us as it lets us tie this to the same RNG which R uses.
We can illustrate this on a simple example or two:
[1] 1 4 3 7 5 8 6 2
[1] 1 4 3 7 5 8 6 2
By connecting the STL implementation of the random permutation to the random number generato from R, we are able to compute reproducible permutations, fast and from C++.
Jan 2023 Update: With the C++17 language standard, the
std::random_shuffle()
function has been removed with the signature used
here. The suggested alternative is now std::shuffle()
taking as before
two iterators for the vector to be shuffled, but then an instance of a
C++ random number generator.
That unfortunately breaks our illustration which relied on using R’s own RNG. So another alternative is provided below; it was kindly provided by Kenta Maehashi in GitHub issue #143. We should note that it does not perfectly replicate the sequence though it appears to shuffle appropriately.
To make the initial version compile under current setups, we added an explicit setting for C++11 to it.
[1] 1 4 3 7 5 8 6 2
[1] 8 1 4 2 7 5 3 6
tags: stl
Tweet