• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

rand() 는 랜덤이 아니다?? 이제는 랜덤을 바꿔야 할 때!

Programming/C, C++, MFC 2014. 11. 21. 16:53







일반적으로 프로그래밍 할 때 흔히 사용하는 rand() 함수.


난수를 발생시키고 [ rand()%범위 ] 이런 형태로 범위를 지정해서 사용하곤 했다


이런 rand() 함수가 정상적인 랜덤이 아니라니... 생각해보면 당연한 얘길수도 있겠구나 싶다


rand() 함수는 0부터 RAND_MAX  사이의 값을 임의 반환하고 RAND_MAX 는 32767로 정의되어 있다.


따라서 % 연산자를 이용하여 범위를 제한하게 되면 진정한 랜덤이 되지 않는다는거.


만약 %100 으로 0~100 까지 범위를 사용한다고 하면 확률적으로 0~67까지의 숫자가 나올 확률이 

68~100 까지 의 확률보다 더 높다. 뭐 이런얘기다.


이것 말고도 여러 이유가 있겠지만 아무튼 정확한 랜덤이 아니므로 다른 난수생성기를 사용 할 필요가 있다.



내가 사용하기 시작한 것은 메르센 트위스터 라는 난수발생기이다.


프로그램에서 <random> 을 포함하면 사용 가능하다.


사용법도 rand() 에 비해 크게 어렵지 않으니 교체해서 사용하는데 큰 어려움은 없을 것 같다.


인터넷에 흔히 나오는 방법1 과 내가 사용하는 방법2 둘다 가능하니 읽기 편한대로 쓰면 될거 같다.


  1. #include <random>
  2.  
  3. // 방법 1
  4. mt19937 rEngine( (unsigned)time(NULL) );
  5. uniform_int_distribution<int> dist( min, max );
  6. auto rGenerator = bind( dist, rEngine );
  7.  
  8. int randomValue = rGenerator();
  9.  
  10.  
  11. // 방법 2
  12. mt19937 rEngine( (unsigned)time(NULL) );
  13. uniform_int_distribution<int> dist( min, max );
  14. int randomValue = dist( rEngine );


별도의 weight 없이 랜덤한 값을 내는 uniform distribution 외에도 사용가능한 distribution 들이 있으니

필요에 따라 사용 가능하다


  • bernoulli_distribution

  • geometric_distribution

  • poisson_distribution

  • binomial_distribution


뭐 더 있나.. 아무튼 필요에 따라 찾아 쓸 수 있다는거..


마지막으로 http://www.gamedevforever.com/114 해당글에서 rand() 와 개선된 난수생성기의 결과를 시뮬레이션 해 둔 
사진이 있어서 두 사진을 비교해 보면 성능차이가 눈에 보인다.



< rand() >

< WELL512 >

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

[VS2013] error MSB8031 - 멀티바이트문자집합 에러를 해결하자.  (0) 2015.03.06
Dialog에 Drag&Drop 기능을 적용하자.  (0) 2014.12.01
fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다.  (0) 2014.07.29
변수의 메모리 할당과 #pragma pack()  (0) 2014.07.23
함수의 파라미터로 포인터를 사용  (0) 2014.07.02
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

카테고리

  • 살다보니.. (449)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (147)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (58)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (8)
    • 전공관련 (80)
      • Algorithm (6)
      • Deep Learning (54)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (8)
    • Computer (118)
      • Utility (21)
      • Windows (31)
      • Mac (4)
      • Ubuntu, Linux (58)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • Deep Learning
  • ColorMeRad
  • CStdioFile
  • DSLR
  • 스마트체험단
  • 에누리닷컴
  • 갤럭시노트3
  • matlab function
  • 딥러닝
  • LIBSVM
  • 오봉자싸롱
  • ReadString
  • 포르투갈
  • 크롬
  • SVM
  • utility
  • 매트랩 함수
  • 매트랩
  • 후쿠오카
  • function
  • review
  • random variable
  • Computer Tip
  • 큐슈
  • portugal
  • matlab
  • 칼로리 대폭발
  • Convolutional Neural Networks
  • 일본
  • DeepLearning

달력

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
06-18 14:11

LATEST FROM OUR BLOG

RSS 구독하기

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바