std::ranges::generate_random
| 헤더 <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 멤버 함수를 사용할 수 없는 경우 요소별 생성을 대체합니다.
대체 연산이란 ranges::generate(std::forward<R>(r), std::ref(g)) 또는 ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); })을(를) 각각 (1) 또는 (3)에 대해 호출하는 것을 말합니다.
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에 대해 s 또는 std::span<I, N> 형식의 표현식이 유효하다면 그러한 호출을 지정되지 않은 횟수만큼 수행하여 채웁니다.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> 형식의 표현식이 유효하다면 그러한 호출을 지정되지 않은 횟수만큼 수행하여 채웁니다.r은(는) ranges::subrange<O, S>(std::move(first), last)에서 얻습니다.(1) 또는 (3)의 효과가 해당 대체 연산의 효과와 동등하지 않으면 동작이 정의되지 않습니다.
N의 값은 호출 간에 다를 수 있습니다. 구현에서는 더 짧은 범위에 대해 더 작은 값을 선택할 수 있습니다.
이 페이지에 설명된 함수형 개체는 알고리즘 함수 개체(비공식적으로 니블로이드라고 함)입니다. 즉,
- 이들 중 하나를 호출할 때 명시적 템플릿 인자 목록을 지정할 수 없습니다.
- 이들 중 어느 것도 인자 종속 조회에 보이지 않습니다.
- 이들 중 하나가 일반 비한정 조회에 의해 함수 호출 연산자의 왼쪽에 있는 이름으로 발견되면, 인자 종속 조회가 억제됩니다.
매개변수
| 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
참고 항목
|
(C++20)
|
함수의 결과를 범위에 저장함
(알고리즘 함수 객체) |
|
(C++20)
|
타입이 균일 난수 비트 생성기로 적합함을 명시함
(컨셉) |