random_generate_canonical
random_generate_canonical (정규화 난수 생성)
std::generate_canonical은 범위 [0, 1)의 임의의 부동소수점 수를 생성하는 함수 템플릿이에요. C++11부터 사용할 수 있어요.
출처: cppreference
본문
<random> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.
template< class RealType, std::size_t Bits, class Generator >
RealType generate_canonical( Generator& g );
(since C++11)
범위 [0, 1)의 임의의 부동소수점 수를 생성해요.
충분한 엔트로피를 얻기 위해 generate_canonical()은 g()를 정확히 k번 호출해요. 여기서 k = max(1, ⌈b / log₂ R⌉)이고,
- b = std::min(Bits, std::size_t {std::numeric_limits
::digits}), - R = g.max() - g.min() + 1.
이에요.
매개변수 (Parameters)
- g — 엔트로피를 얻기 위해 사용할 생성기
반환값 (Return value)
범위 [0, 1)의 부동소수점 값.
예외 (Exceptions)
g가 던지는 것 외에는 없어요.
참고 (Notes)
libstdc++는 GCC 16부터 올바른 동작을 해요.
libc++은 때때로 잘못 1.0을 반환할 수 있어요 (이슈).
vc++는 1.0 반환을 피하지만, 생성기를 다시 굴리는 대신 작은 값을 빼는 방식으로 잘못 처리해요 (테스트케이스 이슈).
결과가 0에 가까운 경우, 얻은 엔트로피 비트의 일부만 결과에 들어가야 해요. 즉 생성된 모든 값이 0.001보다 작은 어떤 값이면 버킷에 들어갈 때, 나타날 수 있는 서로 다른 값의 수가 표현 가능한 것보다 훨씬 적을 수 있어요. 대부분의 구현은 결과에 표현할 수 있는 만큼 얻은 엔트로피를 보존해요.
예제 (Example)
최대 난수성으로 난수를 생성해요.
#include <iostream>
#include <random>
int main()
{
std::mt19937 gen;
// [0,1)의 double 생성, 64비트 엔트로피
std::cout << std::generate_canonical<double, 64>(gen) << '\n';
}