Namespaces
Variants

std::ranges:: generate_random

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
(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
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
헤더에 정의됨 <random>
호출 시그니처
template < class R, class G >

requires ranges:: output_range < R, std:: invoke_result_t < G & >> &&
std:: uniform_random_bit_generator < std:: remove_cvref_t < G >>
constexpr ranges:: borrowed_iterator_t < R >

generate_random ( R && r, G && g ) ;
(1) (C++26부터)
template < class G, std:: output_iterator < std:: invoke_result_t < G & >> O,

std:: sentinel_for < O > S >
requires std:: uniform_random_bit_generator < std:: remove_cvref_t < G >>
constexpr O

generate_random ( O first, S last, G && g ) ;
(2) (C++26부터)
template < class R, class G, class D >

requires ranges:: output_range < R, std:: invoke_result_t < D & , G & >> &&
std:: invocable < D & , G & > &&
std:: uniform_random_bit_generator < std:: remove_cvref_t < G >> &&
std:: is_arithmetic_v < std:: invoke_result_t < D & , G & >>
constexpr ranges:: borrowed_iterator_t < R >

generate_random ( R && r, G && g, D && d ) ;
(3) (C++26부터)
template < class G, class D, std:: output_iterator < std:: invoke_result_t < D & , G & >> O,

std:: sentinel_for < O > S >
requires std:: invocable < D & , G & > &&
std:: uniform_random_bit_generator < std:: remove_cvref_t < G >> &&
std:: is_arithmetic_v < std:: invoke_result_t < D & , G & >>
constexpr O

generate_random ( O first, S last, G && g, D && d ) ;
(4) (C++26부터)

난수 생성기의 generate_random 멤버 함수 또는 분포를 사용하여 난수를 생성하려고 시도하며, 이는 더 효율적일 것으로 예상됩니다. generate_random 멤버 함수를 사용할 수 없는 경우 요소별 생성으로 대체됩니다.

폴백(fallback) 연산은 각각 ranges:: generate ( std:: forward < R > ( r ) , std:: ref ( g ) ) 또는 ranges:: generate ( std:: forward < R > ( r ) , [ & d, & g ] { return std:: invoke ( d, g ) ; } ) 를 호출하는 것으로 합니다. 이는 각각 (1) 또는 (3) 에 해당합니다.

1) 이 표현이 유효한 경우 g. generate_random ( std:: forward < R > ( r ) ) 를 호출합니다.
그렇지 않으면, I std:: invoke_result_t < G & > 로 둡니다. 만약 R sized_range 를 모델링하면, r ranges:: size ( r ) 개의 I 값으로 채우는데, 이는 지정되지 않은 횟수의 g ( ) 또는 g. generate_random ( s ) 형태의 호출을 수행하여 이루어집니다. 단, 이러한 표현식이 값 N std:: span < I, N > 타입의 객체 s 에 대해 형식이 올바른 경우에 한합니다.
그렇지 않으면, 폴백 작업을 수행합니다.
3) 이 표현이 형성 가능할 경우 d. generate_random ( std:: forward < R > ( r ) , g ) 를 호출합니다.
그렇지 않으면, I std:: invoke_result_t < D & , G & > 로 둡니다. R sized_range 를 모델링하는 경우, r ranges:: size ( r ) 개의 I 타입 값으로 채웁니다. 이는 지정되지 않은 횟수의 다음 형태 호출을 수행하여 이루어집니다: std:: invoke ( d, g ) 또는 d. generate_random ( s, g ) (이 표현식이 값 N s 객체(타입 std:: span < I, N > )에 대해 형식이 올바른 경우).
그렇지 않으면, 폴백 작업을 수행합니다.
2,4) (1,3) 에 각각 해당하며, 여기서 r ranges:: subrange < O, S > ( std :: move ( first ) , last ) 로부터 얻어집니다.

(1) 또는 (3) 의 효과가 해당 폴백 연산의 효과와 동등하지 않을 경우, 그 동작은 정의되지 않습니다.

N 의 값은 호출마다 다를 수 있습니다. 구현체는 더 짧은 범위에 대해 더 작은 값을 선택할 수 있습니다.

이 페이지에서 설명하는 함수형 개체들은 algorithm function objects (일반적으로 niebloids 로 알려진)입니다. 즉:

목차

매개변수

first, last - 난수를 기록할 요소들의 범위 를 정의하는 반복자-감시자 쌍
r - 난수가 기록될 range 객체
g - 균일 난수 비트 생성기
d - 난수 분포 객체

참고 사항

std::ranges::generate_random 이 표준화될 당시, 표준 라이브러리에는 generate_random 멤버 함수를 제공하는 난수 생성기나 분포가 존재하지 않았습니다.

std::ranges::generate_random 는 기본 벡터화된 API를 래핑하는 사용자 정의 난수 생성기와 함께 사용될 때 더 효율적일 수 있습니다.

Feature-test 매크로 표준 기능
__cpp_lib_ranges_generate_random 202403L (C++26) std::ranges::generate_random

예제

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <random>
int main()
{
    std::default_random_engine eng;
    std::default_random_engine::result_type rs[16]{};
    std::ranges::generate_random(rs, eng);
    std::cout << std::left;
    for (int i{}; auto n : rs)
        std::cout << std::setw(11) << n << (++i % 4 ? ' ' : '\n');
}

가능한 출력:

16807       282475249   1622650073  984943658 
1144108930  470211272   101027544   1457850878
1458777923  2007237709  823564440   1115438165
1784484492  74243042    114807987   1137522503

참고 항목

함수의 결과를 범위에 저장함
(알고리즘 함수 객체)
타입이 균일 난수 비트 생성기로 적합함을 명시함
(컨셉)