C언어로 정규화 분포된 난수를 발생

vicolee의 이미지

그냥 난수를 발생 시키는것은 알겠는데 정규화 분포된 난수를 어떻게 만들 수 있을까요?

예를 들어 1000개의 난수를 발생 시키면 대충 -3 에서 3 사이의 실수가 정규화분포로
나오는 겁니다.

정규분포된 난수 함수가 없어서 만들어야 할것 같은데요. 어떻게 해야 할까요?

익명사용자의 이미지

정규분포로 알고있는데요.

익명사용자의 이미지

아니죠. 그건 균일분포예요.

snowall의 이미지

rand함수가 "만약" 그냥 균일한 분포로 주어지면, 그걸 가우시안 함수 exp(-a*x^2)에 넣고 돌리면 되지 않을까요?

---------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

익명사용자의 이미지

오래간만에 용어를 접하니 정규분포라는 말 자체가 헛갈렸네요.

TYPELIST normdist_sampler(TYPELIST d, TYPE mean, TYPE sigma) {
	TYPE firstRN = - log(d.next());
	TYPE secondRN = - log(d.next());
 
	if( 2 * firstRN >= pow(secondRN - 1, 2) ) {
		if( d.next() < 0.5 ) {
			TYPELIST r;
			r.push_front(-sigma * secondRN + mean);
			return r;
		} else {
			TYPELIST r;
			r.push_front(sigma * secondRN + mean);
			r.insert(normdist_sampler(d, mean, sigma);
			return r;
		}
	}
}

균등분포(?) 리스트가 들어오면 정규분포 리스트로 변환해주는 국적불명의 코드입니다.
C++로 적고싶었는데 오래간만에 쓰니깐 STL이랑 문법이 생각이 안나네요.
대충 의미만 파악하시면 될 듯 합니다.

익명사용자의 이미지

TYPELIST normdist_sampler(TYPELIST d, TYPE mean, TYPE sigma) {
TYPE firstRN = - log(d.next());
TYPE secondRN = - log(d.next());

if( 2 * firstRN >= pow(secondRN - 1, 2) ) {
if( d.next() < 0.5 ) {
TYPELIST r;
r.push_front(-sigma * secondRN + mean);
return r;
} else {
TYPELIST r;
r.push_front(sigma * secondRN + mean);
r.insert(normdist_sampler(d, mean, sigma);
return r;
}
}
}

익명사용자의 이미지

설명을 하자면 d는 균등(균일?)분포의 리스트고 출력은 정규분포의 리스트입니다.
mean과 sigma는 평균과 표준편차입니다.

익명사용자의 이미지

코드는 C++도 아니고 Java도 아닙니다. 급하게 끄적이다 보니까 대충 생각나는데로 적었습니다. C++로 적으려고 했는데 오래간만에 C++으로 쓰려고 하니 STL이 기억이 안나네요. 원래 이 말을 코드와 함께 붙여넣었는데 어디론가 사라져있어서 확인하고 다시 적습니다.

익명사용자의 이미지

seoleda의 이미지

X1, X2이 각각 ~ U(0,1) 이라고 한다면,

Z1 = sqrt(-2*ln(X1))*cos(2*pi*X2);
Z2 = sqrt(-2*ln(X1))*sin(2*pi*X2); 이면,

Z1, Z2는 각각 ~N(0, 1) 입니다.

hokim의 이미지

Randomized 된 function shape을 만드는 방법은 첨부된 파일의 두가지 방법이 있으며,
기본적으로 uniform한 [0,1]사이의 랜덤넘버를 이용합니다. 가우시안과 같이 기본적인
함수는 첫번째 transformation method로 가능하며, 단지 하나의 uniform한 랜덤넘버를 사용합니다.

seoleda의 이미지

일반적으로 누적밀도 함수의 역함수는 균일분포를 따릅니다.
하지만, 정규분포의 확률밀도 함수를 가지고 누적밀도함수를 구하는 것은 쉽지가 않기 때문에 약간의 트릭을 사용합니다.

BuzzLy의 이미지

위에 hokim님이 설명하신 transformation method로
Gaussian random number를 만들어 낼 수 있는 방법입니다.
http://www.taygeta.com/random/gaussian.html

Numerical Recipe( in C) 를 보시면 C로 된 소스코드도
살짝 나와있습니다.
http://www.nrbook.com/b/bookcpdf/c7-2.pdf

seoleda의 이미지

Buzzly님이 첫번째로 제시하신 링크에 보시면, 첫번째 수식 아래 부분에 2개의 독립인 확률변수 (X1, X2)를 가지고 시작한다고 써있습니다.
X1, X2가 모두 균일분포에서 생성된 확율변수이긴 하지만, 둘은 연관이 없는 2개의 확률변수 입니다.
또한, 그 수식도 제가 처음에 올렸던 수식과 똑같은 것 같습니다.
그리고, 두번째 링크에 보시면 Z1과 Z2 (문서에서는 Y1, Y2로 표현했습니다.)가 어떻게 정규분포가 되는지 설명하는 내용이 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.