RSS

uniform random number generation

06 Aug

0 과 1 사이의 uniform random number를 발생시키기 위해, 기존에 쓰던 코드를 그대로 쓰다가 낭패를 봐서 기록해 두고자 한다.

기존에 쓰던 코드는

(float)rand() / (float)RAND_MAX;

였다. 보통의 uniform random number가 0 <= x < 1 인 소수 x를 구하는 경우가 많아서 위의 코드가 그에 해당하는 코드라고 만 생각했다.
그런데 알고 보니, 위의 코드는 0 <= x <= 1 사이의 값을 리턴해 주는 코드였다. 다시 말해서 결과로 1이 나올 수도 있는 것이다. 아, 그것도 모르고 개삽질 했다.
내가 원하는 대로 0 <= x < 1 사이의 값을 구하려면

(float)rand() / (float)(RAND_MAX + 1);

을 해줘야 했다. 즉 rand() 함수는 0 <= rand() <= RAND_MAX 의 값을 리턴해 주는 함수인 것이다.
그렇다면, 0 < x < 1 사이의 random number가 필요할 경우에는 어떻게 해야 할까?

(float)(rand() + 1) / (float)(RAND_MAX + 2);

이렇게 해주면 되지 않을까?

결과적으로 요약해 보자면

0 <= x <= 1

(float)rand() / (float)(RAND_MAX);

0 <= x < 1


(float)rand() / (float)(RAND_MAX + 1);

0 < x < 1

(float)(rand() + 1) / (float)(RAND_MAX + 2);

돌려 보니까, 대충 맞는거 같다.

2015.12.16 추가 :

0 <= x < 1 의 경우를 위해 다른 방법으로 하는 코드를 발견했다.

(float)(rand() % RAND_MAX) / (float)RAND_MAX;
Advertisements
 
Leave a comment

Posted by on August 6, 2014 in Programming

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: