Created on 2024-04-29.00:00:00 last changed 4 months ago
Proposed resolution:
This wording is relative to N4981.
Modify [rand.synopsis], header <random> synopsis, as indicated:
#include <initializer_list> // see [initializer.list.syn] namespace std { […] namespace ranges { // [alg.rand.generate], generate_random template<class R, class G> requires output_range<R, invoke_result_t<G&>> && uniform_random_bit_generator<remove_cvref_t<G>> constexpr borrowed_iterator_t<R> generate_random(R&& r, G&& g); template<class G, output_iterator<invoke_result_t<G&>> O, sentinel_for<O> S> requires uniform_random_bit_generator<remove_cvref_t<G>> constexpr O generate_random(O first, S last, G&& g); template<class G, output_iterator<invoke_result_t<G&>> O> requires uniform_random_bit_generator<remove_cvref_t<G>> constexpr O generate_random_n(O first, iter_difference_t<O> n, G&& g); template<class R, class G, class D> requires output_range<R, invoke_result_t<D&, G&>> && invocable<D&, G&> && uniform_random_bit_generator<remove_cvref_t<G>> constexpr borrowed_iterator_t<R> generate_random(R&& r, G&& g, D&& d); template<class G, class D, output_iterator<invoke_result_t<D&, G&>> O, sentinel_for<O> S> requires invocable<D&, G&> && uniform_random_bit_generator<remove_cvref_t<G>> constexpr O generate_random(O first, S last, G&& g, D&& d); template<class G, class D, output_iterator<invoke_result_t<D&, G&>> O> requires invocable<D&, G&> && uniform_random_bit_generator<remove_cvref_t<G>> constexpr O generate_random_n(O first, iter_difference_t<O> n, G&& g, D&& d); } […] }
Modify [alg.rand.generate] as indicated:
template<class G, output_iterator<invoke_result_t<G&>> O, sentinel_for<O> S> requires uniform_random_bit_generator<remove_cvref_t<G>> constexpr O ranges::generate_random(O first, S last, G&& g);-4- Effects: Equivalent to:
return generate_random(subrange<O, S>(std::move(first), last), g);template<class G, output_iterator<invoke_result_t<G&>> O> requires uniform_random_bit_generator<remove_cvref_t<G>> constexpr O ranges::generate_random_n(O first, iter_difference_t<O> n, G&& g);[…]-?- Effects: Equivalent to:
return generate_random(counted_iterator(std::move(first), n), default_sentinel, g).base();template<class G, class D, output_iterator<invoke_result_t<D&, G&>> O, sentinel_for<O> S> requires invocable<D&, G&> && uniform_random_bit_generator<remove_cvref_t<G>> constexpr O ranges::generate_random(O first, S last, G&& g, D&& d);-8- Effects: Equivalent to:
return generate_random(subrange<O, S>(std::move(first), last), g, d);template<class G, class D, output_iterator<invoke_result_t<D&, G&>> O> requires invocable<D&, G&> && uniform_random_bit_generator<remove_cvref_t<G>> constexpr O ranges::generate_random_n(O first, iter_difference_t<O> n, G&& g, D&& d);-?- Effects: Equivalent to:
return generate_random(counted_iterator(std::move(first), n), default_sentinel, g, d).base();
[ St. Louis 2024-06-24 Status changed: Tentatively NAD → NAD. ]
[ 2024-06-24; Reflector poll ]
NAD, this is a feature request not a defect. Needs a paper.
P1068 introduced ranges::generate_random which has both range and iterator-sentinel pair overloads. However, the _n version never seems to be discussed.
In view of the fact that generate and fill have their corresponding _n siblings, namely generate_n and fill_n, adding generate_random_n does improve consistency and provide a more intuitive and simple way to generate a specified number of random numbers.History | |||
---|---|---|---|
Date | User | Action | Args |
2024-06-24 16:56:26 | admin | set | messages: + msg14206 |
2024-06-24 12:09:06 | admin | set | messages: + msg14177 |
2024-06-24 12:09:06 | admin | set | status: new -> nad |
2024-05-04 14:39:55 | admin | set | messages: + msg14095 |
2024-04-29 00:00:00 | admin | create |