계산기코어 2.1 뜯어보기 8강. 난수 생성
안녕하세요? noname01입니다.
드디어 계산기코어 2.1을 뜯어보는 글도 끝이 보이네요. 이번에는 마지막으로 n미만의
난수를 생성하는 트리거에 대해 살펴봅시다.
먼저 기본적으로 사용하는 방법은 다들 잘 알고 계시듯이 스위치와 이진법을 사용하는 방식
입니다. 아래는 관련 팁입니다. (이 팁은 jin3[진삼]님이 쓰셨습니다.)
[MS] 분배 합산 값 스위치 트리거 구조
이건 항상 구간 [0, 2^n) 내의 난수만을 생성하는데 우리가 만들고자 하는 것은 바로
맵 실행중 임의로 정해지는 변수 n이 있을 때 구간 [0, n) 내의 난수를 생성하는 트리거
입니다.
이거 뭐 당연히 생성된 난수와 n을 비교해보고 범위밖이면 다시 돌리는 방식을 쓰면 되겠죠?
하지만 n의 범위가 아주 클수도 있고 아주 작을수도 있다면?? n이 아주 작은 경우에는 난수를
구하기 위한 반복횟수가 늘어날 가능성이 아주 높아집니다.
그래서 우리는 n값의 크기를 보고 사용하는 랜덤스위치의 수를 적절히 조절할 겁니다.
(실제로는 한개의 스위치만 사용할 겁니다.) 물론 n의 범위는 정수형 변수 전체이므로
랜덤 스위치는 최대 32개까지 사용됩니다.
먼저 스위치의 개수와 생성되는 난수 사이의 관계를 알아봐야겠죠?? 그런데 이건 이미 다들
알고 계실겁니다. x개의 스위치가 사용될 경우 생성되는 난수를 포함하는 구간은 [0, 2^x)
가 되죠. 따라서 트리거를 다음과 같이 짜면 필요한 만큼의 랜덤 스위치만 작동하여 보다
효율적으로 원하는 구간 내의 난수를 구할 수 있습니다.
참고로 아래 스크린샷(50-34)의 트리거 호출 주소는 다음과 같습니다.
8^4 * 1 : r=rand()%(2^n);

이렇게 필요한 만큼의 랜덤스위치만을 동작시킨 난수라도 A가 2의 제곱수가 아닐경우 원하는
범위에 들지 않을수도 있겠죠?? 이럴 경우엔 위에서 언급했듯이 평소 하는대로 랜덤 스위치를
다시 돌립니다. ㅇㅅㅇ 이 과정을 수행하기 위해 호출해야 하는 트리거를 살펴봅시다.
------------------------------------------------
①시작
8^4 * 1 : r=rand()%(2^n); //필요한 수만큼의 랜덤스위치를 동작시켜 난수생성
X : ②동작
------------------------------------------------
------------------------------------------------
②
8^9 * 1 : a=A;
8^8 * 3 : b=r;
8^7 * 3 : x=compare(&a, &b); //생성한 난수와 A의 크기 비교
X : ③동작
------------------------------------------------
③
X : x값을 비교한다.
x의 값이 1 이하일 경우 ④동작 //구한 난수가 원하는 범위 내에 들어온 경우
x의 값이 2 이상일 경우 ①동작 //구한 난수가 원하는 범위를 벗어난 경우
------------------------------------------------
④
8^5 * 1 : X=r; r=0;
X : 계산완료
------------------------------------------------
간단하죠? 마지막은 간단하게 끝내자구요. ^ㅅ^
실제 트리거로 구현한 것도 살펴봅시다.

사실 여기 치명적인 버그가 하나 있습니다. (귀찮아서 수정안하는건 안자랑)
바로 A에 0을 넣으면 무한루프에 빠지는 점인데요. 사실 A가 0인 경우에는 즉시 계산을
끝내는 트리거를 넣어야 하지만 실수로 그걸 빠뜨렸답니다. ㅇㅅㅇ
하지만 지금까지의 글들을 잘 읽고 이해하셨다면 이정도는 스스로 수정해서 쓸 수 있을거라고
믿어요.^-^ 그럼 이것으로 계산기코어 2.1 뜯어보기 팁을 마치도록 하겠습니다. 끝까지 읽어
주셔서 감사합니다.
[50]계산기코어 2.1 뜯어보기 1강. 전체구조와 호출방식
[50]계산기코어 2.1 뜯어보기 2강. 오류와 입력처리
[50]계산기코어 2.1 뜯어보기 3강. 덧셈, 뺄셈, 곱셈
[50]계산기코어 2.1 뜯어보기 4강. 나눗셈
[50]계산기코어 2.1 뜯어보기 5강. 제곱근
[50]계산기코어 2.1 뜯어보기 6강. 거듭제곱, 팩토리얼, 순열
[50]계산기코어 2.1 뜯어보기 7강. 조합
[50]계산기코어 2.1 뜯어보기 8강. 난수 생성