c++ 랜덤함수를 이용하여 랜덤범위 구현하기
구현목표 몬스터가 생성될때 매개변수 int level 을 인자로 가져와 (level 20) or (level 30)의 체력을 가진 몬스터 생성
의사코드 : 몬스터의 생성자에서 인자를 넘겨받는다. 이후 생성자에서 0,1 을 랜덤으로 출력하는 코드를 구현한다. 삼항연산자를 이용하여 0이나올경우 (level 20) 이 전달되고 1이 나올경우
(level 30) 의 체력을 가진 몬스터가 생성된다.
구현방법 : c++ 에서 랜덤함수를 구현 rand() 함수를 사용하여 구현 rand() 함수는 #include 을 통해 랜덤 라이브러리를 추가한 후 사용해야한다. rand() 함수는 0~32767의 매우 큰범위 내에서 숫자를 랜덤으로 생성한다. 때문에 우리가 구현에 필요한 0,1 을 출력하려면 % 연산자를 이용하여 범위를 줄여주어야 한다. 기본적으로 (0, n-1) 규칙이기에 0,1이 나오게 하려면 2로 나눈 나머지를 구하면 홀수 아니면 짝수 두가지로 나뉘므로 0,1 만 나오게된다.
rand() % 2 == 1또는 0 이후 health 변수를 가지고있다고 가정하면 health = (rand % 2) ? (level * 30) : (level * 20) 이렇게 구현하면 랜덤값을 이용하여 랜덤하게 체력을 가진 몬스터를 생성할 수 있다. 단, rand 함수를 사용할때 주의할점이있는데, 타임시드값을 갱신해주지않으면 동일한 시드값에 생성될때마다 항상 동일한 값이 나올 수 있다. 즉, 랜덤으로 나오지만 랜덤의 결과가 항상 같을수 있다. 때문에 srand() 함수를 사용하여 시간값을 계속초기화 해주어야한다. 코드로 구현하게되면 srand((unsigned int)time(NULL)) srand의 인자인 time 함수를 통해 1970년 1월 1일을 기준으로 호출될때마다 시간을 갱신한다. Null 값을 넣는이유는 현재시간을 반환하기위해서이다. 즉, 한번호출된후 조금이라도 시간이지나면 시드값이바뀜으로 다른결과가 나오게된다.
ChangMinKong(int level) : name_("changMin")
{
std::srand((unsigned int)time(NULL));
health_ = (level * ((rand() % 11) + 20)); //체력
attack_ = (level * ((rand() % 6) + 5));
//std::cout << (rand() % 2) << std::endl;
std::cout << "Health : " << health_ << " ATK : " << attack_ << " Name : " << name_ << std::endl;
}
추가적으로 지정된 범위안에서 랜덤함수의 값을 출력하고싶을시에 0, a-1 공식을이용해 값을 낸 후 원하는만큼 더해주면 범위지정또한 할 수 있다.