std::experimental::sample
| Definiert im Header <experimental/algorithm> |
||
| template< class PopulationIterator, class SampleIterator, class Distance, class URBG > |
(1) | (library fundamentals TS) |
| template< class PopulationIterator, class SampleIterator, class Distance > SampleIterator sample( PopulationIterator first, PopulationIterator last, |
(2) | (Library Fundamentals TS v2) |
Wählt n Elemente aus der Sequenz [first, last) aus, sodass jede mögliche Stichprobe mit gleicher Wahrscheinlichkeit auftritt, und schreibt die ausgewählten Elemente in den Ausgabiterator out.
Wenn n größer ist als die Anzahl der Elemente in der Sequenz, werden last - first Elemente ausgewählt.
Der Algorithmus ist nur dann stabil, wenn PopulationIterator die Anforderungen von LegacyForwardIterator erfüllt.
Inhalt |
[bearbeiten] Parameter
| first, last | - | Paar von Iteratoren, das den Bereich bildet, aus dem die Stichprobe entnommen wird (die Population) |
| out | - | der Ausgabiterator, in den die Stichproben geschrieben werden. Darf nicht im Bereich [first, last) liegen. |
| n | - | Anzahl der zu entnehmenden Stichproben |
| g | - | der Zufallszahlengenerator, der als Quelle der Zufälligkeit verwendet wird |
-PopulationIterator muss die Anforderungen von LegacyInputIterator erfüllen. | ||
-SampleIterator muss die Anforderungen von LegacyOutputIterator erfüllen. | ||
-SampleIterator muss auch die Anforderungen von LegacyRandomAccessIterator erfüllen, wenn PopulationIterator nicht LegacyForwardIterator erfüllt. | ||
-Der Werttyp von PopulationIterator muss in out schreibbar sein. | ||
-Distance muss ein ganzzahliger Typ sein. | ||
-URBG muss die Anforderungen von UniformRandomBitGenerator erfüllen und sein Rückgabetyp muss in Distance konvertierbar sein. | ||
[bearbeiten] Rückgabewert
Gibt eine Kopie von out nach der letzten ausgegebenen Stichprobe zurück, d.h. das Ende des Stichprobenbereichs.
[bearbeiten] Komplexität
Linear in std::distance(first, last).
[bearbeiten] Hinweise
Diese Funktion kann Stichprobenauswahl oder Reservoir-Sampling implementieren.
[bearbeiten] Beispiel
#include <experimental/algorithm> #include <iostream> #include <iterator> #include <random> #include <string> int main() { std::string in = "abcdefgh", out; std::experimental::sample(in.begin(), in.end(), std::back_inserter(out), 5, std::mt19937{std::random_device{}()}); std::cout << "five random letters out of " << in << " : " << out << '\n'; }
Mögliche Ausgabe
five random letters out of abcdefgh : cdefg
[bearbeiten] Siehe auch
| (bis C++17)(C++11) |
Ordnet Elemente in einem Bereich zufällig neu an (Funktionstemplate) |