std::sample
| Definido en el encabezado <algorithm>
|
||
template< class PopulationIt, class SampleIt, class Distance, class URBG >
SampleIterator sample( PopulationIt first, PopulationIt last,
SampleIt out, Distance n, URBG&& g );
|
(desde C++17) | |
Selecciona n elementos de la secuencia [first, last) (sin reemplazo) de modo que cada muestra posible tenga igual probabilidad de aparición, y escribe esos elementos seleccionados en el iterador de salida out. Los números aleatorios se generan usando el generador de números aleatorios g.
Si n es mayor que el número de elementos en la secuencia, selecciona todos los elementos de la secuencia.
El algoritmo es estable (preserva el orden relativo de los elementos seleccionados) solo si PopulationIt cumple los requisitos de LegacyForwardIterator.
Si el tipo de valor de first(hasta C++20)*first(desde C++20) no es writable en out, el programa está mal formado.
Si se cumple alguna de las siguientes condiciones, el comportamiento no está definido:
outestá en[first,last).PopulationItno cumple los requisitos de LegacyInputIterator.SampleItno cumple los requisitos de LegacyOutputIterator.- Se cumplen todas las siguientes condiciones:
|
(hasta C++23) |
|
(desde C++23) |
SampleItno cumple los requisitos de LegacyRandomAccessIterator.
- Dado el tipo
Tcomostd::remove_reference_t<URBG>, se cumple alguna de las siguientes condiciones:
Tno cumple los requisitos de UniformRandomBitGenerator.
|
(hasta C++20) |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos desde los cuales tomar la muestra (la población) |
| out | - | el iterador de salida donde se escriben las muestras |
| n | - | número de muestras a tomar |
| g | - | el generador de números aleatorios utilizado como fuente de aleatoriedad |
| Requisitos de tipo | ||
-
Distance
debe ser un tipo entero.
|
||
Valor de retorno
Devuelve una copia de out después de la última muestra que fue generada, es decir, el final del rango de muestras.
Complejidad
Lineal en std:: distance ( first, last ) .
Implementación posible
Vea las implementaciones en libstdc++ , libc++ y MSVC STL .
Notas
Esta función puede implementar muestreo por selección o reservoir sampling .
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_sample
|
201603L
|
(C++17) |
std::sample
|
Ejemplo
#include <algorithm> #include <iostream> #include <iterator> #include <random> #include <string> int main() { std::string in {"ABCDEFGHIJK"}, out; std::sample(in.begin(), in.end(), std::back_inserter(out), 4, std::mt19937 {std::random_device{}()}); std::cout << "Four random letters out of " << in << " : " << out << '\n'; }
Salida posible:
Four random letters out of ABCDEFGHIJK: EFGK
Véase también
(hasta C++17)(C++11) |
reordena aleatoriamente elementos en un rango (plantilla de función & objeto función de algoritmo) |
(C++20) |
|
(C++20) |
selecciona N elementos aleatorios de una secuencia (objeto función de algoritmo) |