std:: philox_engine
|
헤더에 정의됨
<random>
|
||
|
template
<
class
UIntType,
std::
size_t
w,
std::
size_t
n,
std::
size_t
r,
|
(C++26부터) | |
std::philox_engine
는 카운터 기반 난수 엔진입니다.
목차 |
템플릿 매개변수
| UIntType | - | 생성기가 생성하는 결과 타입. 이것이 다음 중 하나가 아닌 경우의 효과는 정의되지 않음: unsigned short , unsigned int , unsigned long , 또는 unsigned long long . |
| w | - | 비트 단위 워드 크기 |
| n | - | 워드 개수 |
| r | - | 라운드 개수 |
| consts | - | 난수 생성을 위해 사용되는 승수 및 라운드 상수들의 시퀀스 |
다음 값 중 하나라도 true 가 아닌 경우, 프로그램은 형식이 잘못되었습니다:
- sizeof... ( consts ) == n
- n == 2 || n == 4
- 0 < r
- 0 < w && w <= std:: numeric_limits < UIntType > :: digits
`, `
`, `
생성기 속성
다음 설명에서, Q i 는 i 번째 시퀀스 Q 의 요소를 나타내며, 아래첨자는 0부터 시작합니다.
philox_engine
의 상태
크기
는
O(n)
이며, 각 상태는 네 부분으로 구성됩니다:
-
정수 값들의 시퀀스
X
, 여기서 각 값은
[ 0 ,2w
)범위 내에 있습니다.
-
-
이 시퀀스는
Z=∑
n-1
j=0 X⋅2 wj
로 표현되는 큰 부호 없는 정수 카운터 값을 나타내며, n⋅w 비트로 구성됩니다.
-
이 시퀀스는
Z=∑
n-1
-
n
개의
UIntType타입 값 중 n / 2 개 키로 구성된 시퀀스 K . -
n
개의
UIntType타입 생성 값으로 구성된 버퍼 Y . - Y 버퍼 내 인덱스 j .
philox_engine
의
전이 알고리즘
(
TA(X
i
)
)은 다음과 같이 정의됩니다:
- 새로운 n 개의 무작위 값 시퀀스를 생성하고(아래 참조) Y 에 저장합니다.
- 카운터 Z 를 1 만큼 증가시킵니다.
- j 를 0 으로 재설정합니다.
philox_engine
의
생성 알고리즘
은
GA(X
i
)=Y
j
입니다.
- ↑ 이 경우, next generation 알고리즘 호출은 버퍼에서 다음으로 생성된 값을 반환합니다.
- ↑ 이 경우, 버퍼가 갱신되며 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
]
로 나타냅니다.
난수는 다음 과정을 통해 생성됩니다:
- 출력 시퀀스 S 를 X 의 요소들로 초기화합니다.
- S 의 요소들을 r 라운드 동안 업데이트합니다.
- 버퍼 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)
|
두 의사 난수 엔진의 내부 상태를 비교합니다
(함수) |
|
(C++26)
|
의사 난수 엔진에 대한 스트림 입출력을 수행합니다
(함수 템플릿) |
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_philox_engine
|
202406L
|
(C++26) |
std::philox_engine
|
예제
|
이 섹션은 불완전합니다
이유: 예시가 없음 |