Namespaces
Variants

std::sample

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Немодифицирующие операции с последовательностями    
Пакетные операции
(C++17)
Операции поиска
Модифицирующие операции с последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции двоичного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции поиска минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановки


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Числовые операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определено в заголовке <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)
  • При условии, что тип 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

См. также

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