std::ranges::generate_random
| Определён в заголовке <random>
|
||
| Сигнатура вызова |
||
template< class R, class G >
requires ranges::output_range<R, std::invoke_result_t<G&>> &&
std::uniform_random_bit_generator<std::remove_cvref_t<G>>
constexpr ranges::borrowed_iterator_t<R>
generate_random( R&& r, G&& g );
|
(1) | (начиная с C++26) |
template< class G, std::output_iterator<std::invoke_result_t<G&>> O,
std::sentinel_for<O> S >
requires std::uniform_random_bit_generator<std::remove_cvref_t<G>>
constexpr O
generate_random( O first, S last, G&& g );
|
(2) | (начиная с C++26) |
template< class R, class G, class D >
requires ranges::output_range<R, std::invoke_result_t<D&, G&>> &&
std::invocable<D&, G&> &&
std::uniform_random_bit_generator<std::remove_cvref_t<G>> &&
std::is_arithmetic_v<std::invoke_result_t<D&, G&>>
constexpr ranges::borrowed_iterator_t<R>
generate_random( R&& r, G&& g, D&& d );
|
(3) | (начиная с C++26) |
template< class G, class D, std::output_iterator<std::invoke_result_t<D&, G&>> O,
std::sentinel_for<O> S >
requires std::invocable<D&, G&> &&
std::uniform_random_bit_generator<std::remove_cvref_t<G>> &&
std::is_arithmetic_v<std::invoke_result_t<D&, G&>>
constexpr O
generate_random( O first, S last, G&& g, D&& d );
|
(4) | (начиная с C++26) |
Пытается генерировать случайные числа с помощьюgenerate_randomфункции-члена генератора случайных чисел или распределения, которая, как ожидается, будет более эффективной. Переходит к поэлементной генерации, если функция-член generate_random недоступна.
Пусть операция запасного варианта — вызов ranges::generate(std::forward<R>(r), std::ref(g)) или ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) для (1) или (3) соответственно.
g.generate_random(std::forward<R>(r)), если это выражение является корректным.I будет std::invoke_result_t<G&>. Если R удовлетворяет sized_range, заполняет r значениями ranges::size(r) типа I, выполняя неопределённое количество вызовов вида g() или g.generate_random(s), если такое выражение корректно для значения N и объекта s типа std::span<I, N>.d.generate_random(std::forward<R>(r), g), если это выражение является корректным.I будет std::invoke_result_t<D&, G&>. Если R удовлетворяет sized_range, заполняет r значениями типа ranges::size(r) типа I, выполняя неопределённое количество вызовов вида std::invoke(d, g) или d.generate_random(s, g), если такое выражение корректно для значения N и объекта s типа std::span<I, N>.r получено из ranges::subrange<O, S>(std::move(first), last).Если эффекты (1) или (3) не эквивалентны эффектам соответствующей операции запасного варианта, поведение не определено.
Значение N может различаться между вызовами. Реализации могут выбирать меньшие значения для более коротких диапазонов.
Объекты, подобные функциям, описанные на этой странице, являются объектами функций алгоритмов (неформально известными как niebloids), то есть:
- При их вызове нельзя указывать явные списки аргументов шаблона.
- Ни один из них не видим при поиске, зависящем от аргументов.
- Когда любой из них находится с помощью обычного неквалифицированного поиска как имя слева от оператора вызова функции, поиск, зависящий от аргументов, подавляется.
Параметры
| first, last | - | пара итератор-страж, определяющая диапазон элементов, в который записываются случайные числа |
| r | - |
range
для записи случайных чисел
|
| g | - | универсальный генератор случайных битов |
| d | - | объект распределения случайных чисел |
Примечания
На момент стандартизации
std::ranges::generate_random
в стандартной библиотеке не существует генератора случайных чисел или распределения, которые предоставляют функцию-член
generate_random
.
std::ranges::generate_random
может быть более эффективным при использовании с пользовательским генератором случайных чисел, который оборачивает базовый векторизованный API.
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges_generate_random
|
202403L
|
(C++26) |
std::ranges::generate_random
|
Пример
#include <algorithm> #include <iomanip> #include <iostream> #include <random> int main() { std::default_random_engine eng; std::default_random_engine::result_type rs[16]{}; std::ranges::generate_random(rs, eng); std::cout << std::left; for (int i{}; auto n : rs) std::cout << std::setw(11) << n << (++i % 4 ? ' ' : '\n'); }
Возможный вывод:
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 823564440 1115438165 1784484492 74243042 114807987 1137522503
Смотрите также
|
(C++20)
|
сохраняет результат функции в диапазоне
(функциональный объект алгоритма) |
|
(C++20)
|
указывает, что тип соответствует требованиям генератора равномерно распределенных случайных битов
(концепт) |