std::ranges::generate_random
| 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.
g.generate_random(std::forward<R>(r)) auf, falls dieser Ausdruck wohlgeformt ist.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.d.generate_random(std::forward<R>(r), g) auf, falls dieser Ausdruck wohlgeformt ist.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.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:
- Explizite Vorlagenargumentlisten können bei ihrem Aufruf nicht angegeben werden.
- Keine von ihnen ist für die argumentabhängige Namenssuche sichtbar.
- Wenn einer von ihnen durch normale unqualifizierte Namenssuche als Name links vom Funktionsaufrufoperator gefunden wird, wird die argumentabhängige Namenssuche unterdrückt.
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
(C++20) |
speichert das Ergebnis einer Funktion in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
gibt an, dass ein Typ als gleichmäßiger Zufallsbitgenerator qualifiziert ist (Konzept) |