Skip to content

Instantly share code, notes, and snippets.

@jfjlaros
Last active December 11, 2022 19:41
Show Gist options
  • Save jfjlaros/a356702037455331f11f626a9f5b6059 to your computer and use it in GitHub Desktop.
Save jfjlaros/a356702037455331f11f626a9f5b6059 to your computer and use it in GitHub Desktop.
Sample from an array without replacement.
/* Sample from an array without replacement.
*
* \tparam T Array type.
* \tparam arraySize Array size.
*
* \param a Array.
*
* \return Element of `a`.
*/
template <class T, size_t arraySize>
T sample(T (& a)[arraySize]) {
thread_local size_t size {arraySize};
size_t i {static_cast<size_t>(random(size))};
T tmp {a[i]};
a[i] = a[--size];
a[size] = tmp;
if (not size) {
size = arraySize;
}
return tmp;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment