Namespaces
Variants

std::sample

cppreference.net에서
 
 
알고리즘 라이브러리
제약된 알고리즘 및 범위 기반 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에서)
집합 연산 (정렬된 범위에서)
병합 연산 (정렬된 범위에서)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
헤더 <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 의 값 타입이(until C++20)*first(since C++20) writable to 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개의 무작위 요소를 선택
(알고리즘 함수 객체)