Namespaces
Variants

std:: sample

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
sample
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовочном файле <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) не является записываемым в out , программа является некорректной.

Если выполняется любое из следующих условий, поведение не определено:

  • out находится в диапазоне [ first , last ) .
  • PopulationIt не удовлетворяет требованиям LegacyInputIterator .
  • SampleIt не удовлетворяет требованиям LegacyOutputIterator .
  • Все следующие условия выполнены:
(до C++23)
(начиная с C++23)
  • Для типа T как std:: remove_reference_t < URBG > , выполняется любое из следующих условий:
  • Возвращаемый тип T не конвертируется в Distance .
(до 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

Смотрите также

(until C++17) (C++11)
случайно переупорядочивает элементы в диапазоне
(шаблон функции)
выбирает N случайных элементов из последовательности
(функциональный объект алгоритма)