Files
2025-10-25 03:02:53 +03:00

151 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[alg.rand]
# 26 Algorithms library [[algorithms]](./#algorithms)
## 26.12 Specialized <random> algorithms [alg.rand]
### [26.12.1](#general) General [[alg.rand.general]](alg.rand.general)
[1](#general-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14313)
The contents specified in [alg.rand]
are declared in the header [<random>](rand.synopsis#header:%3crandom%3e "29.5.2Header <random> synopsis[rand.synopsis]")[.](#general-1.sentence-1)
### [26.12.2](#generate) generate_random [[alg.rand.generate]](alg.rand.generate)
[🔗](#lib:generate_random)
`template<class R, class G>
requires [output_range](range.refinements#concept:output_range "25.4.6Other range refinements[range.refinements]")<R, invoke_result_t<G&>> && [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3Uniform random bit generator requirements[rand.req.urng]")<remove_cvref_t<G>>
constexpr borrowed_iterator_t<R> ranges::generate_random(R&& r, G&& g);
`
[1](#generate-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14327)
*Effects*:
- [(1.1)](#generate-1.1)
Calls g.generate_random(std::forward<R>(r)) if this expression is well-formed[.](#generate-1.1.sentence-1)
- [(1.2)](#generate-1.2)
Otherwise, if R models [sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]"),
fills r with ranges::size(r) values of
type invoke_result_t<G&> by performing
an unspecified number of invocations of
the form g() or g.generate_random(s),
if such an expression is well-formed for a value N and
an object s of type span<invoke_result_t<G&>, N>[.](#generate-1.2.sentence-1)
[*Note [1](#generate-note-1)*:
Values of N can differ between invocations[.](#generate-1.2.sentence-2)
— *end note*]
- [(1.3)](#generate-1.3)
Otherwise, calls ranges::generate(std::forward<R>(r), ref(g))[.](#generate-1.3.sentence-1)
[2](#generate-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14348)
*Returns*: ranges::end(r)[.](#generate-2.sentence-1)
[3](#generate-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14352)
*Remarks*: The effects of generate_random(r, g) shall be equivalent toranges::generate(std::forward<R>(r), ref(g))[.](#generate-3.sentence-1)
[*Note [2](#generate-note-2)*:
This implies that g.generate_random(a) fills a with the same values as produced by invocation of g()[.](#generate-3.sentence-2)
— *end note*]
[🔗](#lib:generate_random_)
`template<class G, [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10Concept output_­iterator[iterator.concept.output]")<invoke_result_t<G&>> O, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<O> S>
requires [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3Uniform random bit generator requirements[rand.req.urng]")<remove_cvref_t<G>>
constexpr O ranges::generate_random(O first, S last, G&& g);
`
[4](#generate-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14370)
*Effects*: Equivalent to:return generate_random(subrange<O, S>(std::move(first), last), g);
[🔗](#lib:generate_random__)
`template<class R, class G, class D>
requires [output_range](range.refinements#concept:output_range "25.4.6Other range refinements[range.refinements]")<R, invoke_result_t<D&, G&>> && [invocable](concept.invocable#concept:invocable "18.7.2Concept invocable[concept.invocable]")<D&, G&> &&
[uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3Uniform random bit generator requirements[rand.req.urng]")<remove_cvref_t<G>> &&
is_arithmetic_v<invoke_result_t<D&, G&>>
constexpr borrowed_iterator_t<R> ranges::generate_random(R&& r, G&& g, D&& d);
`
[5](#generate-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14388)
*Effects*:
- [(5.1)](#generate-5.1)
Calls d.generate_random(std::forward<R>(r), g) if this expression is well-formed[.](#generate-5.1.sentence-1)
- [(5.2)](#generate-5.2)
Otherwise, if R models [sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]"),
fills r with ranges::size(r) values of
type invoke_result_t<D&, G&> by performing an unspecified number of invocations of
the form invoke(d, g) or d.generate_random(s, g),
if such an expression is well-formed
for a value N and
an object s of type span<invoke_result_t<D&, G&>, N>[.](#generate-5.2.sentence-1)
[*Note [3](#generate-note-3)*:
Values of N can differ between invocations[.](#generate-5.2.sentence-2)
— *end note*]
- [(5.3)](#generate-5.3)
Otherwise, callsranges::generate(std::forward<R>(r), [&d, &g] { return invoke(d, g); });
[6](#generate-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14413)
*Returns*: ranges::end(r)[.](#generate-6.sentence-1)
[7](#generate-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14417)
*Remarks*: The effects of generate_random(r, g, d) shall be equivalent toranges::generate(std::forward<R>(r), [&d, &g] { return invoke(d, g); })
[*Note [4](#generate-note-4)*:
This implies that d.generate_random(a, g) fills a with the values with the same random distribution
as produced by invocation of invoke(d, g)[.](#generate-7.sentence-1)
— *end note*]
[🔗](#lib:generate_random___)
`template<class G, class D, [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10Concept output_­iterator[iterator.concept.output]")<invoke_result_t<D&, G&>> O, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<O> S>
requires [invocable](concept.invocable#concept:invocable "18.7.2Concept invocable[concept.invocable]")<D&, G&> && [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3Uniform random bit generator requirements[rand.req.urng]")<remove_cvref_t<G>> &&
is_arithmetic_v<invoke_result_t<D&, G&>>
constexpr O ranges::generate_random(O first, S last, G&& g, D&& d);
`
[8](#generate-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14439)
*Effects*: Equivalent to:return generate_random(subrange<O, S>(std::move(first), last), g, d);