2017-03-08 3 views
4

C++ 표준은 std::generate_canonical 템플릿 기능 (C++ 코드가 아닌 의사 코드 만 표시 함)이 작동하는 방식에 따라 [rand.util.canonical] 아래에서 매우 상세하게 지정합니다.generate_canonical 출력은 플랫폼간에 일관성이 있습니까?

됩니다 std::generate_canonical뿐만 아니라 동일한 출력을 제공하는 것이, 다른 플랫폼에 RealType에 수학이 동일하게 작동 사양 저자의 의도이며, 두 플랫폼에서 동일한 출력을 제공하는 결정 URNG 하시나요?

Is 1.0 a valid output from std::generate_canonical? 같은 비슷한 질문에 관련되어 - 산문은 1.0 제외한다고하지만, 그들은 의사에주는 알고리즘은 때때로 출력으로하고 RealTypeURNG의 일부 조합을 포함한다.

이는 예를 들어 C++11 random number distributions are not consistent across platforms -- what alternatives are there?으로 설명 된 난수 분포 함수와 대조됩니다. 표준은 어떻게 정규 분포가 생성되고 단지 그 성질이 생성되는지를 지정하지 않는다.

나는 이것이 논의 된 어떤 DR도 찾지 못했고 표준의 표현은 표면적으로 동일하다. C++ 11, C++ 14 및 C++ 17 초안 표준 쉽게 액세스 할 수 있습니다.

답변

1

링크 된 질문에서 발견 된 어려움은 일관성의 기본 문제 인 반올림 모드를 지적합니다. 표준에서 generate_canonical의 수학적 정의의 명확한 의도는 URNG가 여러 번 호출되어 각각이 결과를 채우기 위해 겹치지 않는 엔트로피 블록을 생성한다는 것입니다. 이는 플랫폼 전반에서 완전히 일관성이 있습니다. 문제는 LSB 아래의 추가 비트를 어떻게 처리해야하는지에 대한 표시가 없다는 것입니다. 반올림 모드 및 합계 순서에 따라 다음 블록으로 흘러 올라갈 수 있습니다 (1.0 결과를 허용하는 것).

정확한 표현은 "인스턴스화 결과가 아래에 지정된대로 가능한 한 균일하게 배포됩니다"입니다. 반올림 모드가 가장 둥근 경우 1.0을 생성하는 구현은 이 아닌이 가능한 한 균일합니다 (1-eps가 1-2 * eps보다 적기 때문에). 하지만 여전히 "아래 명시된대로"입니다. 따라서 문장을 구문 분석하는 방법에 따라 generate_canonical이 완전하게 지정되고 일관성이 있거나 구현에 추가 논의되지 않은 비트가 일부 위임되었습니다.

어떤 경우라도 특정 구현체가 1.0을 생성한다는 사실은 현재의 동작이 플랫폼 간 일관성이 없다는 것을 분명히합니다. 원한다면 independent_bits_engine에 URNG를 포장하여 bits 비트의 요소를 생성하는 것이 가장 간단한 방법 인 것 같습니다. 따라서 아무 것도 라운드 할 수 없습니다.

관련 문제