Assuming API changes are permissible (a big IF), I think the
way to do it might be something like
auto randomSample(R, UniformRNG = Random, seed)(R r, size_t n,
seed s = unpredictableSeed)
... meaning that the user has an option to specify an RNG
_type_ without specifying a seed, and that the seed can be
either unpredictable or specific.
The user could also not specify a RNG type, in which case the
default RNG type would be used, but would be seeded
unpredictably.
Issues with copying rngs are not unique to randomSample - anyone
who uses random number generators will run into them
sooner or later. So the problem is not that randomSample takes
a rng as a parameter - it's that rngs are value types. The
proper solution would be to make them reference types. I don't
know if that can be done now as it would surely break some code,
but people can use pointers to rngs instead of rngs themselves.
I think not doing that will cause bugs irregardless of how
randomSample works. I know it would cause bugs in my code.