Namespaces
Variants

std::ranges::generate_random

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenamiento y relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de secuencia modificadoras
Operaciones de particionamiento
Operaciones de ordenamiento
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones en almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado <random>
Firma de llamada
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) (desde 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) (desde 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) (desde 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) (desde C++26)

Intenta generar números aleatorios con la función miembro generate_random del generador de números aleatorios o de la distribución, que se espera sea más eficiente. Recurre a la generación elemento por elemento si no está disponible ninguna función miembro generate_random .

Sea operación de respaldo llamar a ranges::generate(std::forward<R>(r), std::ref(g)) o ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) para (1) o (3) respectivamente.

1) Llama a g.generate_random(std::forward<R>(r)) si esta expresión está bien formada.
De lo contrario, sea I std::invoke_result_t<G&>. Si R modela sized_range, llena r con ranges::size(r) valores de I realizando un número no especificado de invocaciones de la forma g() o g.generate_random(s), si tal expresión está bien formada para un valor N y un objeto s de tipo std::span<I, N>.
De lo contrario, realiza la operación de respaldo.
3) Llama a d.generate_random(std::forward<R>(r), g) si esta expresión está bien formada.
De lo contrario, sea I std::invoke_result_t<D&, G&>. Si R modela sized_range, llena r con ranges::size(r) valores de tipo I realizando un número no especificado de invocaciones de la forma std::invoke(d, g) o d.generate_random(s, g), si tal expresión está bien formada para un valor N y un objeto s de tipo std::span<I, N>.
De lo contrario, realiza la operación de respaldo.
2,4) Equivalente a (1,3) respectivamente, donde r se obtiene de ranges::subrange<O, S>(std::move(first), last).

Si los efectos de (1) o (3) no son equivalentes a los de la operación de respaldo correspondiente, el comportamiento no está definido.

El valor de N puede diferir entre invocaciones. Las implementaciones pueden seleccionar valores más pequeños para rangos más cortos.

Las entidades similares a funciones descritas en esta página son objetos función de algoritmo (conocidos informalmente como niebloides), es decir:

Parámetros

first, last - el par iterador-centinela que define el rango de elementos al que se escriben números aleatorios
r - el range al que se escriben números aleatorios
g - generador uniforme de bits aleatorios
d - objeto de distribución de números aleatorios

Notas

En el momento de la estandarización de std::ranges::generate_random , no existe ningún generador de números aleatorios o distribución en la biblioteca estándar que proporcione una función miembro generate_random .

std::ranges::generate_random puede ser más eficiente cuando se utiliza con un generador de números aleatorios definido por el usuario que encapsula una API vectorizada subyacente.

Macro de prueba de características Valor Estándar Característica
__cpp_lib_ranges_generate_random 202403L (C++26) std::ranges::generate_random

Ejemplo

#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');
}

Salida posible:

16807       282475249   1622650073  984943658 
1144108930  470211272   101027544   1457850878
1458777923  2007237709  823564440   1115438165
1784484492  74243042    114807987   1137522503

Véase también

guarda el resultado de una función en un rango
(objeto función de algoritmo)
especifica que un tipo califica como generador uniforme de bits aleatorios
(concepto)