Namensräume
Varianten
Aktionen

std::ranges::generate_random

Von cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namespace std::ranges
Nicht-modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
       
       
Permutationsoperationen
Faltoperationen
Numerische Operationen
(C++23)            
Zufallszahlengenerierung
generate_random
(C++26)
Operationen auf uninitialisiertem Speicher
Rückgabetypen
 
Definiert in Header <random>
Aufruf-Signatur
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 Member-Funktion generate_random des Zufallszahlengenerators oder der Verteilung zu generieren, was effizienter erwartet wird. Fällt zurück auf elementweise Generierung, falls keine generate_random Member-Funktion verfügbar ist.

Sei die Fallback-Operation das Aufrufen 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) oder (3) entsprechend.

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

Wenn die Auswirkungen von (1) oder (3) nicht äquivalent zu denen der entsprechenden Fallback-Operation sind, ist das Verhalten undefiniert.

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

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.

Inhalt

[bearbeiten] Parameter

first, last - das Iterator-Sentinel-Paar, das den Bereich der Elemente definiert, in die Zufallszahlen geschrieben werden
r - der Bereich, in den Zufallszahlen geschrieben werden
g - uniformer Zufallszahlengenerator
d - Zufallszahl-Verteilungsobjekt

[bearbeiten] Hinweise

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

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

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

[bearbeiten] 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

[bearbeiten] Siehe auch

Speichert das Ergebnis einer Funktion in einem Bereich
(Algorithmus-Funktionsobjekt)[edit]
spezifiziert, dass ein Typ als gleichmäßiger Zufallsbitgenerator qualifiziert ist
(Konzept) [bearbeiten]