12 struct SampleFunction {
13 template<concepts::InputIterator It, concepts::SentinelFor<It> Sent, concepts::WeaklyIncrementable Out,
14 typename Gen,
typename SSizeType = meta::IteratorSSizeType<It>>
15 requires((concepts::ForwardIterator<It> || concepts::RandomAccessIterator<Out>) &&
16 concepts::IndirectlyCopyable<It, Out> &&
17 concepts::UniformRandomBitGenerator<meta::RemoveReference<Gen>>)
20 using Distribution = random::UniformIntDistribution<SSizeType>;
21 using Param = Distribution::Param;
23 auto distribution = Distribution {};
25 if constexpr (concepts::ForwardIterator<It>) {
34 if (distribution(generator, Param(0, --
count)) < to_sample) {
47 SSizeType reservoir_size = 0;
48 for (;
first !=
last && reservoir_size < n; ++
first, ++reservoir_size) {
49 out[reservoir_size] = *
first;
53 for (
auto size_so_far = reservoir_size;
first !=
last; ++
first, ++size_so_far) {
54 auto chosen_index = distribution(generator, Param(0, size_so_far));
55 if (chosen_index < n) {
56 out[chosen_index] = *
first;
64 template<concepts::InputContainer Con, concepts::WeaklyIncrementable Out,
typename Gen>
65 requires((concepts::ForwardContainer<Con> || concepts::RandomAccessIterator<Out>) &&
66 concepts::IndirectlyCopyable<meta::ContainerIterator<Con>, Out> &&
67 concepts::UniformRandomBitGenerator<meta::RemoveReference<Gen>>)
75constexpr inline auto sample = detail::SampleFunction {};
constexpr auto last(concepts::detail::ConstantVector auto &vector, size_t count)
Definition vector_last.h:13
constexpr auto first(concepts::detail::ConstantVector auto &vector, size_t count)
Definition vector_first.h:13
constexpr auto min
Definition min.h:49
constexpr auto distance
Definition distance.h:44
constexpr auto count
Definition count.h:37
constexpr auto end
Definition end.h:55
constexpr auto sample
Definition sample.h:75
constexpr auto begin
Definition begin.h:52