Namespaces
Variants

std:: philox_engine

From cppreference.net
헤더에 정의됨 <random>
template <

class UIntType, std:: size_t w, std:: size_t n, std:: size_t r,
UIntType... consts
>

class philox_engine ;
(C++26부터)

std::philox_engine 는 카운터 기반 난수 엔진입니다.

목차

템플릿 매개변수

UIntType - 생성기가 생성하는 결과 타입. 이것이 다음 중 하나가 아닌 경우의 효과는 정의되지 않음: unsigned short , unsigned int , unsigned long , 또는 unsigned long long .
w - 비트 단위 워드 크기
n - 워드 개수
r - 라운드 개수
consts - 난수 생성을 위해 사용되는 승수 및 라운드 상수들의 시퀀스

다음 값 중 하나라도 true 가 아닌 경우, 프로그램은 형식이 잘못되었습니다:

**번역 결과:** - HTML 태그와 속성은 번역하지 않고 원본 형식을 유지했습니다. - ` `, `
`, `` 태그 내의 텍스트는 번역하지 않았습니다.
- C++ 관련 용어는 번역하지 않았습니다.

생성기 속성

다음 설명에서, Q i i 번째 시퀀스 Q 의 요소를 나타내며, 아래첨자는 0부터 시작합니다.

philox_engine 의 상태 크기 O(n) 이며, 각 상태는 네 부분으로 구성됩니다:

  • 정수 값들의 시퀀스 X , 여기서 각 값은 [ 0 , 2 w
    )
    범위 내에 있습니다.
  • 이 시퀀스는 Z=∑ n-1
    j=0
    X⋅2 wj
    로 표현되는 큰 부호 없는 정수 카운터 값을 나타내며, n⋅w 비트로 구성됩니다.
  • n 개의 UIntType 타입 값 중 n / 2 개 키로 구성된 시퀀스 K .
  • n 개의 UIntType 타입 생성 값으로 구성된 버퍼 Y .
  • Y 버퍼 내 인덱스 j .

philox_engine 전이 알고리즘 ( TA(X i ) )은 다음과 같이 정의됩니다:

  • 만약 j n - 1 가 아니면, j 1 만큼 증가시킵니다. [1]
  • 만약 j n - 1 이면, 다음 연산들을 수행합니다: [2]
  1. 새로운 n 개의 무작위 값 시퀀스를 생성하고(아래 참조) Y 에 저장합니다.
  2. 카운터 Z 1 만큼 증가시킵니다.
  3. j 0 으로 재설정합니다.

philox_engine 생성 알고리즘 GA(X i )=Y j 입니다.

  1. 이 경우, next generation 알고리즘 호출은 버퍼에서 다음으로 생성된 값을 반환합니다.
  2. 이 경우, 버퍼가 갱신되며 next generation 알고리즘 호출은 새로운 버퍼의 첫 번째 값을 반환합니다.

난수 생성

난수는 다음 매개변수들로부터 생성됩니다:

  • 라운드 수 r
  • 현재 카운터 시퀀스 X
  • 키 시퀀스 K
  • 승수 시퀀스 M
  • 라운드 상수 시퀀스 C

시퀀스 M C 는 템플릿 매개변수 팩 consts 의 값들로부터 형성되며, 이는 M k C k 상수들을 [ M 0 , C 0 , M 1 , C 1 ,... , ..., M n/2-1 , C n/2-1 ] 로 나타냅니다.

난수는 다음 과정을 통해 생성됩니다:

  1. 출력 시퀀스 S X 의 요소들로 초기화합니다.
  2. S 의 요소들을 r 라운드 동안 업데이트합니다.
  3. 버퍼 Y 의 값을 S 의 값으로 대체합니다.

출력 시퀀스 업데이트

각 업데이트 라운드마다, 중간 시퀀스 V 는 지정된 순서로 S 의 요소들로 초기화됩니다:

n V 0 V 1 V 2 V 3
2 S 0 S 1 해당 없음
4 S 2 S 1 S 0 S 3

다음 연산 표기법이 주어졌을 때:

  • xor , 내장 비트별 XOR .
  • mullo , 모듈러 곱셈의 하위 절반을 계산하며 다음과 같이 정의됩니다 mullo(a,b,w)=(a⋅b) mod 2 w
    .
  • mulhi , 곱셈의 상위 절반을 계산하며 다음과 같이 정의됩니다 mulhi(a,b,w)=⌊(a⋅b)/2 w
    .

현재 라운드 번호(0부터 시작)를 q 라 하고, 각 정수 k 에 대해 [ 0 , n / 2 ) 범위 내에서 출력 시퀀스 S 의 요소들은 다음과 같이 업데이트됩니다:

  • X 2⋅k =mulhi(V 2⋅k ,M k ,w) xor ((K k +q⋅C k ) mod 2 w
    ) xor V 2⋅k+1
  • X 2⋅k+1 =mullo(V 2⋅k ,M k ,w)

미리 정의된 특수화

다음 특수화들은 일반적으로 사용되는 두 가지 매개변수 집합을 가진 난수 엔진을 정의합니다:

헤더 파일에 정의됨 <random>
타입 정의
philox4x32 (C++26) std :: philox_engine < std:: uint_fast32_t , 32 , 4 , 10 ,
0xCD9E8D57 , 0x9E3779B9 ,
0xD2511F53 , 0xBB67AE85 >
philox4x64 (C++26) std :: philox_engine < std:: uint_fast64_t , 64 , 4 , 10 ,
0xCA5A826395121157 , 0x9E3779B97F4A7C15 ,
0xD2E7470EE14C6C93 , 0xBB67AE8584CAA73B >

중첩 타입

유형 정의
result_type UIntType

데이터 멤버

constexpr std::size_t word_size
[static]
w
(public static member constant)
constexpr std::size_t word_count
[static]
n
(public static member constant)
constexpr std::size_t round_count
[static]
r
(public static member constant)
constexpr std:: array < result_type, word_count / 2 > multipliers
[static]
승수 시퀀스 M
(public static member constant)
constexpr std:: array < result_type, word_count / 2 > round_consts
[static]
라운드 상수 시퀀스 C
(public static member constant)
constexpr std::uint_least32_t default_seed
[static]
20111115u
(public static member constant)

멤버 함수

생성 및 시드 설정
엔진을 생성함
(public member function)
엔진의 현재 상태를 설정함
(public member function)
엔진의 현재 카운터를 설정함
(public member function)
생성
엔진의 상태를 진행시키고 생성된 값을 반환함
(public member function)
지정된 양만큼 엔진의 상태를 진행시킴
(public member function)
특성
[static]
출력 범위에서 가능한 가장 작은 값을 얻음
(public static member function)
[static]
출력 범위에서 가능한 가장 큰 값을 얻음
(public static member function)

비멤버 함수

(C++26)
두 의사 난수 엔진의 내부 상태를 비교합니다
(함수)
의사 난수 엔진에 대한 스트림 입출력을 수행합니다
(함수 템플릿)

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

예제