이번 포스팅에서는 MATLAB 에서 기본으로 제공하는 각종 random number 의 생성 방법에 대해 알아본다.

 

MATLAB 에서도 rand() 함수는 uniform random number 를 발생 시킨다.

 

rand() 함수는 0에서 1 사이 값을 발생 시킨다. 이를 이용하여 다양한 범위의 uniform random number 를 발생 시킬 수 있다.

 

a ~ b 사이의 n행 k열 uniform random number 를 발생시키는 방법은 다음과 같다.

 

Uniform_rand = a + (b-a).*rand(n, k);

 

예를 들어 -10 ~ 5 사이의 4행 5 열 의 uniform random number 를 발생 시키려면 다음과 같이 하면 된다.

 

 

다음으로 정규 분포라 불리는 Gaussian random number 에 대해 알아보자.

 

Gaussian random number 를 발생시키는 함수는 randn() 이다.

 

randn() 함수는 평균이 0 이고 분산이 1 인 Gaussian random number 를 발생 시킨다.

 

평균이 a 이고 분산이 b 인 n행 k 열의 Gaussian random number 를 발생시키는 방법은 다음과 같다.

 

Gaussian_randn=randn(n, k)*sqrt(b)+a;

 

예를 들어 평균이 3 이고 분산이 9인 3행 4열 Gaussian random number 를 발생시켜 보면 다음과 같다.

 

 

다음으로 정수 random number 를 발생시켜주는 randi() 함수에 대해 알아보자.

 

randi(imax, n, m) 이라 정의 하게 되면 1,2,3,…imax 까지의 정수 중 uniform 하게 n 행 m 열 만큼 발생시켜 준다.

 

또는 randi([imin, imax], n, m) 이라 정의 하면 imin, imin+1, imin+2, … imax까지의 정수 중 uniform 하게 n 행 m 열 만큼 발생시켜 준다.

 

예를 들어 randi([-10, 2], 5, 4) 라고 정의 하면 -10,9,8… 2 까지의 정수를 5행 4열로 발생시켜 준다.

 

 

마지막으로 randperm() 함수에 대해 알아보자. randperm(k) 라 하게 되면 1:k 까지의 값들을 random 하게 나열 한다.

 

예를 들어 randperm(5) 하면 다음 그림과 같이 1,2,3,4,5 값을 random 하게 나열하는 식이다.

 

 

randperm(45) 의 값의 임의의 부분 6개를 취하면 간단하게 random한 로또 번호 생성기를 만들 수 있다.

 

 


  1. 글쎄인삼 2013.03.19 23:14

    트럼프카드 셔플 프로그램 짜는 거 때문에 고생하고 있었는데 덕분에 쉽게 해결되었습니다. 감사합니다.

    • 남성 2013.03.20 09:34 신고

      도움되었다니 다행이네여~ 방문해 주셔서 감사합니다. ^^

  2. 민트맛카카오 2016.03.19 21:42

    정수 1~52까지 5x4 random 행렬 만드는 법 있나요?

    • 남성 2016.03.19 21:46 신고

      randi(52,5,4) 라고 하면 됩니다.

    • 2016.03.19 22:05

      비밀댓글입니다

    • 남성 2016.03.19 22:07 신고

      중복없이 하시려면 아래와 같이 하면 됩니다.

      a = randperm(52); b= reshape(a(1:20),5,4)

    • 민트맛카카오 2016.03.19 22:11

      너무 감사합니다. 좋은 주말되세요~

  3. 2016.03.20 23:44

    비밀댓글입니다

    • 남성 2016.03.20 23:47 신고

      위에 질문 하신 분이랑 같이 숙제 하시나 봐요 다음과 같이 하시면 됩니다

      a = randperm(52); b= reshape(a(1:20),5,4)

    • 2016.03.20 23:53

      비밀댓글입니다

    • 남성 2016.03.20 23:58 신고

      키와 값의 형태로 표현하고 싶으면 아래 주소의 글들을 참조하여
      map 형태로 나타내도 될것 같고,

      http://iamaman.tistory.com/749
      http://iamaman.tistory.com/529

      그냥 간단하게 아래와 같이 배열로 나타내도 될것 같네요.

      a=['다이아에이', '스페이드']

      위와 같이 하면 a[1] 은 다이아에이 겠죠.

    • 매트랩초보 2016.03.21 00:05

      늦은 시간에 계속 질문해서 정말 죄송합니다
      a=['다이아에이','스페이드']에서 스페이드는 왜 쓰신거에요??

    • 남성 2016.03.21 00:08 신고

      1~52개 카드를 배열에 넣으려는 의도 아닌가요?

    • 매트랩초보 2016.03.21 00:09

      네 맞아요 아 그럼 그 스페이드는 52를 의미하기위해 넣으신건가요???

    • 남성 2016.03.21 00:11 신고

      그냥 예를 든건데.... ㅎㅎ 아래와 같이 저장해서 52개를 저장하면 된다는거죠.
      a=['다이아에이','다이아2', '다이아3', .... ]

    • 매트랩초보 2016.03.21 00:14

      아 이제야 이해가 갔어요 정말 감사합니다 ㅠㅜㅠㅜㅠㅜ
      진짜 늦은시각에 불쑥질문에 명쾌한 답변 큰 도움이 됐습니다.
      다시한번 정말 감사합니다.

    • 남성 2016.03.21 00:17 신고

      도움 되셨다니 다행이네요 자주 방문해 주세요.

    • 매트랩초보 2016.03.21 00:19

      넵 알겠습니다!!!

  4. 잘봤습니다 2016.04.03 19:36

    글 잘봤습니다. 제가 처음 보는 내용도 있네요.
    질문 하나만 하고싶습니다...
    혹시 randi로 randperm같이 중복안되게 랜덤함수 생성하는 방법이 있나요?

    • 남성 2016.04.04 00:06 신고

      randperm 이 결국에는 카드 섞는거랑 비슷하니까

      randperm 이 있는데 굳이 이렇게 어렵게 할 필요는 없을것 같은데... 다음과 같이 해도 될 것 같긴 하네요.

      a = 1:52;
      b= randi(52,100,2);

      for n=1:100
      if b(n,1) ~= b(n,2)
      temp = a(b(n,1));
      a(b(n,1)) = a(b(n,2));
      a(b(n,2)) = temp;
      end
      end

    • 잘봤습니다 2016.04.04 23:21

      번거롭게해서 죄송하고 감사합니다. 자주들릴게용

    • 남성 2016.04.05 00:12 신고

      네~ 자주 방문해주세요

  5. 2016.04.11 22:44

    혹시 제가 직접 작성한 pdf 함수로 random number를 발생시키려면 어떻게 해야할까요???

    • 남성 2016.04.12 08:55 신고

      위에서 한것과 마찮가지로 CDF 를 구한후에 역함수를 취하고 0~1 사이의 random number 를 생성한후에 역함수에 집어 넣으면 되겠죠.

  6. 메트랩 입문자 2020.03.26 12:44

    혹시 제가 지금 다섯 사람에게 한장씩 총 4장의 카드를 분배하는 시스템을 짜려고 하는데요
    D = ['D_A' , 'D_2' , 'D_3' , 'D_4' , 'D_5' , 'D_6' , 'D_7' , 'D_8' , 'D_9' , 'D_10' , 'D_J' , 'D_Q' , 'D_K' ] ;
    C = ['C_A' , 'C_2' , 'C_3' , 'C_4' , 'C_5' , 'C_6' , 'C_7' , 'C_8' , 'C_9' , 'C_10' , 'C_J' , 'C_Q' , 'C_K' ] ;
    H = ['H_A' , 'H_2' , 'H_3' , 'H_4' , 'H_5' , 'H_6' , 'H_7' , 'H_8' , 'H_9' , 'H_10' , 'H_J' , 'H_Q' , 'H_K' ] ;
    S = ['S_A' , 'S_2' , 'S_3' , 'S_4' , 'S_5' , 'S_6' , 'S_7' , 'S_8' , 'S_9' , 'S_10' , 'S_J' , 'S_Q' , 'S_K' ] ;

    y = [D, C, H, S] ;
    x = randperm(52)
    w = 1 ;
    for i = 1:4
    a(w,:) = y(x(w),:);
    b (w+1,:) = y(x(w+1),:);
    c (w+2,:) = y(x(w+2),:);
    d (w+3,:) = y(x(w+3),:);
    e (w+4,:) = y(x(w+4),:);

    sprintf('Person %d : %s, %s, %s, %s, %s' , i ,a(w,:),b(w+1,:), c(w+2,:), d(w+3,:), e(w+4,:))
    w=w+5;
    end


    라고 코드를 짰는데 위에 D_A이런것들이 각각 D따로 _따로 A따로 인식을 하더라고요... 한개로 인식되게 하려면 어떻게 해야 할까요.. ㅠㅜ

    그리구
    a (w,:) = y(x(w),:);
    b (w+1,:) = y(x(w+1),:);
    c (w+2,:) = y(x(w+2),:);
    d (w+3,:) = y(x(w+3),:);
    e (w+4,:) = y(x(w+4),:);
    이 부분도 코드를 맞게 짰는지 모르겠어요
    정말 죄송하지만 한번만 확인해주실수 있나요..???

    • 남성 2020.03.27 08:40 신고

      네 위와 같이 사용하게 되면 문자의 경우 한글자씩 인식하게 됩니다. 따라서 단어 단위로 저장을 하고 싶으시면 Cell 타입을 사용해야 하고 아래 내용 참조해 보시기 바랍니다.

      https://iamaman.tistory.com/170

  7. 입문자 2020.04.11 02:37

    안녕하세요 블로그로 매트랩 정말 잘 배우고 있습니다:) 혹시 푸아송랜덤변수와 기하랜덤변수를 위와 같이 발생시키는 방법 알 수 있을까요?

    • 남성 2020.04.11 13:06 신고

      포아송 랜덤 변수는 poissrnd 함수를 사용하면되고 기하 랜덤 변수는 geornd 함수를 사용하면됩니다.
      각 메뉴얼의 주소는 아래와 같습니다.

      https://kr.mathworks.com/help/stats/poissrnd.html

      https://kr.mathworks.com/help/stats/geornd.html

      제 블로그의 아래 포스팅엥서 CDF 를 사용하여 포아송 랜덤 변수를 발생시키는 방법에 대해서도 포스팅을 한 적이 있습니다.

      https://iamaman.tistory.com/206

    • 2020.04.12 02:37

      비밀댓글입니다

    • 남성 2020.04.12 18:15 신고

      포스팅 했습니다. ^^

      https://iamaman.tistory.com/3210

+ Recent posts