std::sample
| Определено в заголовке <algorithm>
|
||
template< class PopulationIt, class SampleIt, class Distance, class URBG >
SampleIterator sample( PopulationIt first, PopulationIt last,
SampleIt out, Distance n, URBG&& g );
|
(начиная с C++17) | |
Выбирает n элементов из последовательности [first, last) (без возвращения) так, что каждая возможная выборка имеет равную вероятность появления, и записывает выбранные элементы в выходной итератор out. Случайные числа генерируются с помощью генератора случайных чисел g.
Если n больше количества элементов в последовательности, выбираются все элементы последовательности.
Алгоритм является стабильным (сохраняет относительный порядок выбранных элементов) только если PopulationIt удовлетворяет требованиям LegacyForwardIterator.
Если тип значения first(до C++20)*first(начиная с C++20) не является writable по отношению к out, программа является некорректной.
Если выполняется любое из следующих условий, поведение не определено:
outнаходится в[first,last).PopulationItне удовлетворяет требованиям LegacyInputIterator.SampleItне удовлетворяет требованиям LegacyOutputIterator.- Все следующие условия выполнены:
|
(до C++23) |
|
(начиная с C++23) |
SampleItне удовлетворяет требованиям LegacyRandomAccessIterator.
- При условии, что тип
Tзадан какstd::remove_reference_t<URBG>, выполняется любое из следующих условий:
Tне удовлетворяет требованиям UniformRandomBitGenerator.
|
(до C++20) |
Параметры
| first, last | - | пара итераторов, определяющих диапазон элементов, из которых производится выборка (генеральная совокупность) |
| out | - | выходной итератор, в который записываются выборки |
| n | - | количество извлекаемых выборок |
| g | - | генератор случайных чисел, используемый как источник случайности |
| Требования к типам | ||
-
Distance
должен быть целочисленным типом.
|
||
Возвращаемое значение
Возвращает копию out после последнего выведенного сэмпла, то есть конец диапазона сэмплов.
Сложность
Линейно по std:: distance ( first, last ) .
Возможная реализация
Смотрите реализации в libstdc++ , libc++ и MSVC STL .
Примечания
Эта функция может реализовывать выборку по методу selection sampling или reservoir sampling .
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_sample
|
201603L
|
(C++17) |
std::sample
|
Пример
#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'; }
Возможный вывод:
Four random letters out of ABCDEFGHIJK: EFGK
См. также
(до C++17)(C++11) |
случайным образом переупорядочивает элементы в диапазоне (шаблон функции & объект-функция алгоритма) |
(C++20) |
|
(C++20) |
выбирает N случайных элементов из последовательности (объект-функция алгоритма) |