>백엔드 개발 >C++ >C/C에서 정규 분포 난수를 생성하는 방법은 무엇입니까?

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

Susan Sarandon
Susan Sarandon원래의
2024-11-27 16:51:12314검색

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

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

정규 분포에 따라 난수를 생성해야 하는 필요성은 다양한 프로그래밍 응용 프로그램에서 자주 발생합니다. . C/C에는 이를 달성하기 위해 사용할 수 있는 몇 가지 기술이 있습니다.

널리 채택되는 접근 방식 중 하나는 Box-Muller 변환입니다. 이 방법에는 두 개의 독립적인 균일 난수를 생성하고 정규 분포 값을 얻기 위해 수학 공식을 사용하여 변환하는 작업이 포함됩니다. Box-Muller 변환은 수학적으로 엄격하며 정확한 결과를 생성합니다.

C/C에서 Box-Muller 변환을 구현하는 방법은 다음과 같습니다.

#include <random>
#include <cmath>

// Generate a random number following a Gaussian distribution
double normal_rand() {
    static double z1;
    static bool ready = false;

    // If z1 is not ready, generate two uniform random numbers
    if (!ready) {
        double u1 = std::uniform_real_distribution<double>(0, 1)();
        double u2 = std::uniform_real_distribution<double>(0, 1)();
        z1 = std::sqrt(-2 * std::log(u1)) * std::cos(2 * M_PI * u2);
        ready = true;
    }

    // Return z1 and mark it as used
    ready = false;
    return z1;
}

위 예에서 std:: uniform_real_distribution은 균일한 난수를 생성하는 반면 std::sqrt 및 std::cos는 필요한 수학적 작업을 수행합니다.

Box-Muller 변환을 활용하면 C/C에서 정규 분포에 따라 난수를 생성하는 간단하고 안정적인 방법을 제공합니다. 이 기술을 사용하면 프로그래머는 Boost와 같은 외부 라이브러리를 사용하지 않고 표준 C 라이브러리의 기능을 활용할 수 있습니다.

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

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