>  기사  >  백엔드 개발  >  부스트 없이 C/C에서 정규 분포 난수를 생성하는 방법은 무엇입니까?

부스트 없이 C/C에서 정규 분포 난수를 생성하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-23 00:55:16931검색

How to Generate Normally Distributed Random Numbers in C/C   Without Boost?

C/C에서 정규 분포를 사용하여 난수 생성

질문:

난수를 쉽게 생성하는 방법 Boost를 사용하지 않고 C 또는 C에서 정규 분포를 따릅니다. 라이브러리?

답변:

Box-Muller 변환

Box-Muller 변환은 라이브러리 생성에 널리 사용되는 방법입니다. 균일 난수 생성기의 정규 분포 숫자입니다. 가우스 분포를 정확하게 준수하는 값을 생성합니다.

Box-Muller 변환의 수학 공식은 다음과 같습니다.

x = sqrt(-2 * log(U1)) * cos(2 * π * U2)
y = sqrt(-2 * log(U1)) * sin(2 * π * U2)

여기서:

  • U1과 U2는 0과 1 사이에 균일하게 분포된 난수입니다.
  • x와 y는 정규 분포된 난수입니다. 평균이 0이고 표준편차가 1인

구현:

C/C에서 Box-Muller 변환을 구현하려면 다음을 사용할 수 있습니다. 코드:

#include <cmath>
#include <random>

double box_muller() {
  std::random_device rd;  // Seed the random number generator with a system clock seed
  std::default_random_engine rng(rd());
  std::uniform_real_distribution<double> dist(0.0, 1.0);

  double U1 = dist(rng);
  double U2 = dist(rng);

  double x = sqrt(-2 * log(U1)) * cos(2 * M_PI * U2);
  return x;
}

사용법:

정규 분포 난수를 생성하려면 간단히 box_muller() 함수를 호출하세요.

double random_number = box_muller();

Random_number의 값은 평균이 0이고 표준편차가 있는 가우스 분포 확률 변수입니다. 1.

참고:

  • Box-Muller 변환은 두 번째 결과인 y도 생성하지만 나중에 사용하기 위해 버리거나 저장할 수 있습니다.
  • 평균이 0이 아니거나 표준편차가 1이 아닌 정규 분포 숫자를 생성해야 하는 경우 결과에 상수입니다.

위 내용은 부스트 없이 C/C에서 정규 분포 난수를 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.