```
template <RandomAccessIterator I, Sentinel<I> S, class Gen>
requires Permutable<I> &&
UniformRandomNumberGenerator<remove_reference_t<Gen>> &&
ConvertibleTo<result_of_t<Gen&()>, difference_type_t<I>>
I shuffle(I first, S last, Gen&& g);
template <RandomAccessRange Rng, class Gen>
requires Permutable<I> &&
UniformRandomNumberGenerator<remove_reference_t<Gen>> &&
ConvertibleTo<result_of_t<Gen&()>, difference_type_t<I>>
safe_iterator_t<Rng>
shuffle(Rng&& rng, Gen&& g);
```

*Effects:*
Permutes the elements in the range
[first,last)
such that each possible permutation of those elements has equal probability of appearance.

*Complexity:*
Exactly
(last - first) - 1
swaps.

*Returns:* last

*Remarks:*
To the extent that the implementation of this function makes use of random
numbers, the object g shall serve as the implementation's source of
randomness.