[alg.rand.generate] # 26 Algorithms library [[algorithms]](./#algorithms) ## 26.12 Specialized algorithms [[alg.rand]](alg.rand#generate) ### 26.12.2 generate_random [alg.rand.generate] [🔗](#lib:generate_random) `template requires [output_range](range.refinements#concept:output_range "25.4.6 Other range refinements [range.refinements]")> && [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")> constexpr borrowed_iterator_t ranges::generate_random(R&& r, G&& g); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14327) *Effects*: - [(1.1)](#1.1) Calls g.generate_random(std​::​forward(r)) if this expression is well-formed[.](#1.1.sentence-1) - [(1.2)](#1.2) Otherwise, if R models [sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]"), fills r with ranges​::​size(r) values of type invoke_result_t 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, N>[.](#1.2.sentence-1) [*Note [1](#note-1)*: Values of N can differ between invocations[.](#1.2.sentence-2) — *end note*] - [(1.3)](#1.3) Otherwise, calls ranges​::​generate(std​::​forward(r), ref(g))[.](#1.3.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14348) *Returns*: ranges​::​end(r)[.](#2.sentence-1) [3](#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), ref(g))[.](#3.sentence-1) [*Note [2](#note-2)*: This implies that g.generate_random(a) fills a with the same values as produced by invocation of g()[.](#3.sentence-2) — *end note*] [🔗](#lib:generate_random_) `template> O, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S> requires [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")> constexpr O ranges::generate_random(O first, S last, G&& g); ` [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14370) *Effects*: Equivalent to:return generate_random(subrange(std::move(first), last), g); [🔗](#lib:generate_random__) `template requires [output_range](range.refinements#concept:output_range "25.4.6 Other range refinements [range.refinements]")> && [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]") && [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")> && is_arithmetic_v> constexpr borrowed_iterator_t ranges::generate_random(R&& r, G&& g, D&& d); ` [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14388) *Effects*: - [(5.1)](#5.1) Calls d.generate_random(std​::​forward(r), g) if this expression is well-formed[.](#5.1.sentence-1) - [(5.2)](#5.2) Otherwise, if R models [sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]"), fills r with ranges​::​size(r) values of type invoke_result_t 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, N>[.](#5.2.sentence-1) [*Note [3](#note-3)*: Values of N can differ between invocations[.](#5.2.sentence-2) — *end note*] - [(5.3)](#5.3) Otherwise, callsranges::generate(std::forward(r), [&d, &g] { return invoke(d, g); }); [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14413) *Returns*: ranges​::​end(r)[.](#6.sentence-1) [7](#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), [&d, &g] { return invoke(d, g); }) [*Note [4](#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)[.](#7.sentence-1) — *end note*] [🔗](#lib:generate_random___) `template> O, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S> requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]") && [uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")> && is_arithmetic_v> constexpr O ranges::generate_random(O first, S last, G&& g, D&& d); ` [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14439) *Effects*: Equivalent to:return generate_random(subrange(std::move(first), last), g, d);