Namespaces
Variants

std::ranges::generate_random

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations de tas (heap)
Opérations minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modifiantes
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur plages triées)
       
       
Opérations d'ensemble (sur plages triées)
Opérations de tas (heap)
Opérations minimum/maximum
       
       
Opérations de permutation
Opérations de pliage (fold)
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <random>
Signature d'appel
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) (depuis 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) (depuis 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) (depuis 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) (depuis C++26)

Tente de générer des nombres aléatoires avec la generate_random fonction membre du générateur de nombres aléatoires ou de la distribution, ce qui est supposé être plus efficace. Utilise la génération élément par élément en l'absence de fonction membre generate_random disponible.

Soit l'opération de repli (fallback) qui consiste à appeler ranges::generate(std::forward<R>(r), std::ref(g)) ou ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) pour (1) ou (3) respectivement.

1) Appelle g.generate_random(std::forward<R>(r)) si cette expression est bien formée.
Sinon, soit I égal à std::invoke_result_t<G&>. Si R modélise sized_range, remplit r avec ranges::size(r) valeurs de I en effectuant un nombre non spécifié d'invocations de la forme g() ou g.generate_random(s), si une telle expression est bien formée pour une valeur N et un objet s de type std::span<I, N>.
Sinon, effectue l'opération de repli.
3) Appelle d.generate_random(std::forward<R>(r), g) si cette expression est bien formée.
Sinon, soit I égal à std::invoke_result_t<D&, G&>. Si R modélise sized_range, remplit r avec ranges::size(r) valeurs de type I en effectuant un nombre non spécifié d'invocations de la forme std::invoke(d, g) ou d.generate_random(s, g), si une telle expression est bien formée pour une valeur N et un objet s de type std::span<I, N>.
Sinon, effectue l'opération de repli.
2,4) Équivalent à (1,3) respectivement, où r est obtenu à partir de ranges::subrange<O, S>(std::move(first), last).

Si les effets de (1) ou (3) ne sont pas équivalents à ceux de l'opération de repli correspondante, le comportement est indéfini.

La valeur de N peut différer entre les invocations. Les implémentations peuvent sélectionner des valeurs plus petites pour des plages plus courtes.

Les entités de type fonction décrites sur cette page sont des objets de fonction d'algorithme (informellement appelés niebloids), c'est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage d'éléments à laquelle les nombres aléatoires sont écrits
r - la range à laquelle les nombres aléatoires sont écrits
g - générateur uniforme de bits aléatoires
d - objet de distribution de nombres aléatoires

Notes

Au moment de la standardisation de std::ranges::generate_random , il n'existe aucun générateur de nombres aléatoires ou distribution dans la bibliothèque standard qui fournisse une fonction membre generate_random .

std::ranges::generate_random peut être plus efficace lorsqu'il est utilisé avec un générateur de nombres aléatoires défini par l'utilisateur qui encapsule une API vectorisée sous-jacente.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_ranges_generate_random 202403L (C++26) std::ranges::generate_random

Exemple

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

Sortie possible :

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

Voir aussi

enregistre le résultat d'une fonction dans une plage
(objet fonction algorithme)
spécifie qu'un type est qualifié comme générateur uniforme de bits aléatoires
(concept)