> 백엔드 개발 > C++ > Box-Muller 변환을 사용하여 C/C에서 정규 분포 난수를 생성하는 방법은 무엇입니까?

Box-Muller 변환을 사용하여 C/C에서 정규 분포 난수를 생성하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-30 12:19:26
원래의
426명이 탐색했습니다.

How to Generate Normally Distributed Random Numbers in C/C   using the Box-Muller Transform?

C/C에서 정규분포 난수 생성

C 또는 C에서 정규분포를 따르는 난수 생성이 자주 발생하는 작업 다양한 계산 및 통계 응용 프로그램에서. 이는 두 개의 균일한 난수를 활용하여 한 쌍의 정규 분포 숫자를 생성하는 널리 사용되는 기술인 Box-Muller 변환을 사용하여 효과적으로 달성할 수 있습니다.

Box-Muller 변환은 간단한 수학 공식을 사용합니다.

x = sqrt(-2 * ln(u1)) * cos(2 * pi * u2)
y = sqrt(-2 * ln(u1)) * sin(2 * pi * u2)
로그인 후 복사

여기서 u1과 u2는 [0, 1] 범위에서 생성된 두 개의 독립적인 균일 난수입니다. 이 두 방정식은 평균과 단위 분산이 0인 정규 분포를 따르는 두 개의 독립 확률 변수 x와 y를 정의합니다.

C/C에서 이 방법을 구현하려면 다음 단계를 수행할 수 있습니다.

  1. 표준 라이브러리 헤더 를 포함합니다. rand() 함수에 액세스합니다.
  2. [0, 1) 범위에 따라 균일한 무작위 double을 생성하는 함수를 정의합니다. 이 작업은 다음을 사용하여 수행할 수 있습니다.
double rand0to1() {
    return rand() / (RAND_MAX + 1.0);
}
로그인 후 복사
  1. Box-Muller 변환 함수 구현:
pair<double, double> box_muller() {
    double u1 = rand0to1();
    double u2 = rand0to1();
    double x = sqrt(-2.0 * log(u1)) * cos(2.0 * M_PI * u2);
    double y = sqrt(-2.0 * log(u1)) * sin(2.0 * M_PI * u2);
    return {x, y};
}
로그인 후 복사
  1. box_muller 함수를 호출하여 생성 필요에 따라 정규 분포된 난수를 사용합니다.

이 방법은 효과적으로 외부 라이브러리 없이도 정규 분포를 따르는 난수를 생성합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿