Dirk Eddelbuettel — Dec 31, 2012 | source

An earlier post looked at random shuffle for permutations. The STL also supports creation of random samples.

Alas, it seems that this functionality has not been promoted to the C++ standard yet — so we will have to do with what is an extensions by the GNU g++ compiler.

The other drawback is the sampling without replacement.

As in the previous post, we use a function object conformant to the STL’s requirements for a random number generator to be able to use R’s RNG.

```
#include <Rcpp.h>
// wrapper around R's RNG such that we get a uniform distribution over
// [0,n) as required by the STL algorithm
inline int randWrapper(const int n) { return floor(unif_rand()*n); }
// it would appear that randomSample is still only a GNU g++ extension ?
#include <ext/algorithm>
// [[Rcpp::export]]
Rcpp::NumericVector randomSample(Rcpp::NumericVector a, int n) {
// clone a into b to leave a alone
Rcpp::NumericVector b(n);
__gnu_cxx::random_sample(a.begin(), a.end(),
b.begin(), b.end(), randWrapper);
return b;
}
```

We can illustrate this on a simple example:

```
a <- 1:8
set.seed(42)
randomSample(a, 4)
```

[1] 1 2 7 4

```
set.seed(42)
randomSample(a, 4)
```

[1] 1 2 7 4

**tags:**
stl

- Computing an Inner Product with RcppParallel — JJ Allaire
- Parallel Distance Matrix Calculation with RcppParallel — JJ Allaire and Jim Bullard
- Summing a Vector in Parallel with RcppParallel — JJ Allaire