Namespaces
Variants

std::ranges::generate_random

Из ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Операции последовательности без модификации    
Пакетные операции
(C++17)
Операции поиска
Операции модификации последовательности
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(по разбитым диапазонам)
Операции над множествами (над отсортированными диапазонами)
Операции слияния (над отсортированными диапазонами)
Операции над кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения(C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные<memory>алгоритмы

Специализированные<random>алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Операции последовательности без модификации
Операции модификации последовательности
Операции разделения
Операции сортировки
Операции бинарного поиска (по отсортированным диапазонам)
       
       
Операции над множествами (по отсортированным диапазонам)
Операции над кучей
Операции минимума/максимума
       
       
Операции перестановок
Операции свёртки
Операции над неинициализированной памятью
Типы возвращаемых значений
 
Определён в заголовке <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) соответственно.

1) Вызывает 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>.
В противном случае выполняет операцию запасного варианта.
3) Вызывает 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>.
В противном случае выполняет операцию запасного варианта.
2,4) Эквивалентно (1,3) соответственно, где 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

Смотрите также

сохраняет результат функции в диапазоне
(функциональный объект алгоритма)
указывает, что тип соответствует требованиям генератора равномерно распределенных случайных битов
(концепт)