일반적으로 프로그래밍 할 때 흔히 사용하는 rand() 함수.
난수를 발생시키고 [ rand()%범위 ] 이런 형태로 범위를 지정해서 사용하곤 했다
이런 rand() 함수가 정상적인 랜덤이 아니라니... 생각해보면 당연한 얘길수도 있겠구나 싶다
rand() 함수는 0부터 RAND_MAX 사이의 값을 임의 반환하고 RAND_MAX 는 32767로 정의되어 있다.
따라서 % 연산자를 이용하여 범위를 제한하게 되면 진정한 랜덤이 되지 않는다는거.
만약 %100 으로 0~100 까지 범위를 사용한다고 하면 확률적으로 0~67까지의 숫자가 나올 확률이
68~100 까지 의 확률보다 더 높다. 뭐 이런얘기다.
이것 말고도 여러 이유가 있겠지만 아무튼 정확한 랜덤이 아니므로 다른 난수생성기를 사용 할 필요가 있다.
내가 사용하기 시작한 것은 메르센 트위스터 라는 난수발생기이다.
프로그램에서 <random> 을 포함하면 사용 가능하다.
사용법도 rand() 에 비해 크게 어렵지 않으니 교체해서 사용하는데 큰 어려움은 없을 것 같다.
인터넷에 흔히 나오는 방법1 과 내가 사용하는 방법2 둘다 가능하니 읽기 편한대로 쓰면 될거 같다.
- #include <random>
- // 방법 1
- mt19937 rEngine( (unsigned)time(NULL) );
- uniform_int_distribution<int> dist( min, max );
- auto rGenerator = bind( dist, rEngine );
- int randomValue = rGenerator();
- // 방법 2
- mt19937 rEngine( (unsigned)time(NULL) );
- uniform_int_distribution<int> dist( min, max );
- 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 |