std::ranges::generate_random
| Definiert in Header <random> |
||
| Aufruf-Signatur |
||
| template< class R, class G > requires ranges::output_range<R, std::invoke_result_t<G&>> && |
(1) | (seit C++26) |
| template< class G, std::output_iterator<std::invoke_result_t<G&>> O, std::sentinel_for<O> S > |
(2) | (seit C++26) |
| template< class R, class G, class D > requires ranges::output_range<R, std::invoke_result_t<D&, G&>> && |
(3) | (seit C++26) |
| template< class G, class D, std::output_iterator<std::invoke_result_t<D&, G&>> O, std::sentinel_for<O> S > |
(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.
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.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.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.
- Können explizite Template-Argumentlisten bei keinem von ihnen angegeben werden.
- Keiner von ihnen ist für Argument-abhängige Suche sichtbar.
- Wenn einer von ihnen durch normale unqualifizierte Suche als Name links vom Funktionsaufrufoperator gefunden wird, wird die Argument-abhängige Suche unterdrückt.
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
| (C++20) |
Speichert das Ergebnis einer Funktion in einem Bereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
spezifiziert, dass ein Typ als gleichmäßiger Zufallsbitgenerator qualifiziert ist (Konzept) |