Namespaces
Variants

std::ranges::generate_random

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namensraum std::ranges
Nicht modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
       
       
Permutationsoperationen
Faltungsoperationen
Numerische Operationen
(C++23)            
Operationen auf nicht initialisiertem Speicher
Rückgabetypen
 
Definiert in Header <random>
Aufrufsignatur
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) (seit 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) (seit 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) (seit 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) (seit C++26)

Versucht, Zufallszahlen mit der generate_random-Mitgliedsfunktion des Zufallszahlengenerators oder der Verteilung zu erzeugen, was effizienter sein soll. Falls keine generate_random-Mitgliedsfunktion verfügbar ist, wird auf elementweise Erzeugung zurückgegriffen.

Als Fallback-Operation sei der Aufruf von ranges::generate(std::forward<R>(r), std::ref(g)) oder ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) für (1) bzw. (3) bezeichnet.

1) Ruft g.generate_random(std::forward<R>(r)) auf, falls dieser Ausdruck wohlgeformt ist.
Andernfalls sei I gleich std::invoke_result_t<G&>. Wenn R das Konzept sized_range modelliert, füllt r mit ranges::size(r) Werten von I, indem eine nicht näher spezifizierte Anzahl von Aufrufen der Form g() oder g.generate_random(s) durchgeführt wird, falls ein solcher Ausdruck für einen Wert N und ein Objekt s vom Typ std::span<I, N> wohlgeformt ist.
Andernfalls wird die Fallback-Operation ausgeführt.
3) Ruft d.generate_random(std::forward<R>(r), g) auf, falls dieser Ausdruck wohlgeformt ist.
Andernfalls sei I gleich std::invoke_result_t<D&, G&>. Wenn R das Konzept sized_range modelliert, füllt r mit ranges::size(r) Werten des Typs I, indem eine nicht näher spezifizierte Anzahl von Aufrufen der Form std::invoke(d, g) oder d.generate_random(s, g) durchgeführt wird, falls ein solcher Ausdruck für einen Wert N und ein Objekt s vom Typ std::span<I, N> wohlgeformt ist.
Andernfalls wird die Fallback-Operation ausgeführt.
2,4) Entspricht (1,3) bzw., wobei r aus ranges::subrange<O, S>(std::move(first), last) gewonnen wird.

Falls die Effekte von (1) oder (3) nicht denen der entsprechenden Fallback-Operation entsprechen, ist das Verhalten undefiniert.

Der Wert von N kann zwischen Aufrufen variieren. Implementierungen können für kürzere Bereiche kleinere Werte wählen.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als Niebloids bekannt), das heißt:

Parameter

first, last - das Iterator-Sentinel-Paar, das den Bereich von Elementen definiert, in die Zufallszahlen geschrieben werden
r - der Bereich, in den Zufallszahlen geschrieben werden
g - gleichmäßiger Zufallsbitgenerator (uniform random bit generator)
d - Zufallszahlenverteilungsobjekt

Anmerkungen

Zum Zeitpunkt der Standardisierung von std::ranges::generate_random gibt es keinen Zufallszahlengenerator oder keine Verteilung in der Standardbibliothek, die eine generate_random-Mitgliedsfunktion bereitstellt.

std::ranges::generate_random kann effizienter sein, wenn es mit einem benutzerdefinierten Zufallszahlengenerator verwendet wird, der eine zugrunde liegende vektorisierte API kapselt.

Feature-Test-Makro Wert Std Funktion
__cpp_lib_ranges_generate_random 202403L (C++26) std::ranges::generate_random

Beispiel

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

Mögliche Ausgabe:

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

Siehe auch

speichert das Ergebnis einer Funktion in einem Bereich
(Algorithmus-Funktionsobjekt)
gibt an, dass ein Typ als gleichmäßiger Zufallsbitgenerator qualifiziert ist
(Konzept)