2009-07-10 4 views
8

C++ 표준 라이브러리에 가우스 분포 숫자 생성기가 있거나 전달할 코드 스 니펫이 있는지 알고 싶습니다.C++ : 가우스 분포 생성

미리 감사드립니다.

+0

AC 코드 스 니펫은 [나중에 질문 (click here)] (http://stackoverflow.com/questions/17995894/normalgaussian-distribution-function-in-c/23609868#23609868) – jcollomosse

답변

15

표준 라이브러리는 그렇지 않습니다. 부스트. 랜덤은 그렇다. 내가 너라면 그걸 쓸거야.

6

GNU 과학 도서관에이 기능이 있습니다. GSL - Gaussian Distribution

+0

"으로 제공됩니다 가지고있어? " – jalf

+0

Lol, 나는 대답을보기 전에 그것을 썼다. 나는 그것을 바꿔야한다고 생각한다. :) –

13

기술 보고서 ​​1에서는 난수 생성 지원이 추가되었습니다. 따라서 비교적 최근의 컴파일러 (Visual C++ 2008 GCC 4.3)를 사용하고 있다면, 바로 사용할 수 있습니다.

std::tr1::normal_distribution (및 더 많은 것)의 샘플 사용에 대해서는 here을 참조하십시오.

+1

아직 없다면 Boost의 일부로 찾을 수있다. http : //www.boost. org/doc/libs/1_39_0/doc/html/boost_tr1/subject_list.html # boost_tr1.subject_list.random – stephan

4

이 질문에 대한 대답은 random headerstd::normal_distribution을 포함하는 C++ 11에서 변경됩니다. Walter Brown의 논문 N3551, Random Number Generation in C++11은 아마도이 라이브러리에 대한 더 나은 소개 중 하나 일 것입니다. 내가 함께 C++ random float number generation에 C++ (11) 내 대답에 난수 생성에 대한 예보다 일반적인 세트를 제공

#include <iostream> 
#include <iomanip> 
#include <map> 
#include <random> 

int main() 
{ 
    std::random_device rd; 

    std::mt19937 e2(rd()); 

    std::normal_distribution<> dist(2, 2); 

    std::map<int, int> hist; 
    for (int n = 0; n < 10000; ++n) { 
     ++hist[std::floor(dist(e2))]; 
    } 

    for (auto p : hist) { 
     std::cout << std::fixed << std::setprecision(1) << std::setw(2) 
        << p.first << ' ' << std::string(p.second/200, '*') << '\n'; 
    } 
} 

:

다음 코드는이 헤더 (see it live)를 사용하는 방법을 보여줍니다 Boost에서 예를 들어 rand()을 사용하는 경우에도 마찬가지입니다.