http://tibyte.kr/218 에서 이어집니다.




주의) Matlab에서는 특정 분포를 하는 다양한 난수생성을 지원합니다.

이 포스트는 코드를 간단히 구현해 보기 위한 목적으로 matlab을 사용합니다.



정규난수를(normal random variable)얻기 위해 박스-뮬러 변환(Box-Muller Transform) 을 쓸 수 있지만


연산과정에 삼각함수가 들어 있기 때문에

이 복잡성을 해결하기 위해 George Marsaglia가 고안한 극좌표법(polar method)을 쓸 수 있다.




박스뮬러 방법에서 균일랜덤변수 u를 사용하여  sin(2pi*u)와 cos(2pi*u)로 나타냈던 것을

극좌표법에서는 원 위에 무작위로 점(u1, u2)을 찍어서 cos이 밑변/빗변,

sin이 높이/빗변인 것을 이용하여  삼각함수를 대체한다. 


박스뮬러 방법에서의 U1이 거리제곱(sq)으로 대체되고,

삼각함수 대신 제곱과 제곱근연산이 들어가게 된다.

[그림 1]





매틀랩 코드로 구현한 결과이다. 표준편차가 1이고 평균이 0인 정규분포를 생성. 


N = 1000000;

u1 = zeros(1,N);

u2 = zeros(1,N);

wsq = zeros(1,N);

for i=1:N

   sq = 2;

   while sq>1

      r1 = rand;

      r2 = rand;

      sq = r1.*r1 + r2.*r2;

   end

   u1(i) = r1;

   u2(i) = r2;

   wsq(i) = sq;

end

s = 1;

m = 0;

x = m+s*sqrt(-2*log(wsq)).*u1./(wsq.^0.5);

y = -1.*(m+s*sqrt(-2*log(wsq)).*u2./(wsq.^0.5));

n = horzcat(x,y);

hist(n, 50);



히스토그램 결과.


[그림 2]





이 방법의 단점은 [그림 1]과 코드에서 볼 수 있듯이

점이 원 밖에 찍혔을 경우 평균적으로 1.27배 만큼 난수를 다시 뽑아야 한다는 것이다.

(1.27배는 기하분포의 급수로 계산)








  1. test 2015.03.06 16:00

    테스트



매틀랩에서는 normrnd()함수로 정규난수(normal random variable)를 발생시킬 수 있긴 하지만

여기서는 균일분포(균등분포)를 변환하여 생성해보도록 한다. 



균일분포(uniform distribution)인 랜덤변수와

박스뮬러 변환(Box-Muller Transformation)을 이용하여 정규난수(Gaussian Random)을 만들 수 있다.


아래는 매트랩으로 작성한 코드와 실행결과이다.



format long

N = 1000000;

u1 = rand(1,N);

u2 = rand(1,N);

s = 1;

m = 0;

x = m+s*sqrt(-2*log(u1)).*cos(2*pi*u2);

y = m+s*sqrt(-2*log(u1)).*sin(2*pi*u2);

n = horzcat(x,y);

hist(n, 50);









- 매틀랩의 다양한 plot들을 사용해서 그려본 도표들.










- 누적분포함수(cdf)






극좌표 방법(polar method)에 대해서는 다음 글에 이어집니다.


관련글 : http://tibyte.kr/219




  1. 뉴비스크립터 아님 2015.02.07 15:50

    와아 굳굳

  2. 질문 2016.04.28 13:19

    pdf랑 cdf 그리실 때 plot 어떻게 사용하셨어요??

    • BlogIcon 티바이트 2016.04.29 21:33 신고

      지금 매트랩이 설치되어 있지 않아서 정확하게는 확인을 못해보겠네요.. 데이터를 선택하고 매트랩 위쪽 메뉴 중에서 클릭해서 선택했던 것으로 기억합니다..

  3. ㅇㅇ 2018.02.06 21:36

    진짜 큰 도움이 되었습니다. 감사합니다!


랜덤 이름 생성기입니다.

2007~2008년 쯤에 만들었던걸로 기억합니다.

  1. 늣풀 2010.12.26 19:45

    You Just Activated My Trap Card는 뭐야 ㅡㅡ

    • BlogIcon 티바이트 2010.12.26 22:01 신고

      플래시-자바스크립ㅌ 통신(?) 연습하려고 해본건데 그이후로 내리지를 않아서..ㄹㄹ

  2. BlogIcon 게임에그 2011.01.03 02:11 신고

    오래 전에 본 덧글인데 위 플래시 초록 공 버튼을 계속 누르면 나오는 건가 싶어서 40~50초 가량 초록 공만 눌렀다가 포기했던 기억이.. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

    오늘 티바이트 갤러리를 발견해서 눌렀고.. 어떤 메시지가 나타나는 순간 이 글의 늣풀님 덧글이 떠올라 찾아와 다는 덧글.

+ Recent posts