์๋ ๊ฒ์ด๊ฐ ์ด ๊ธ์ ๋ณด์ถฉ ์ค๋ช ์์ ๊ฒ ๊ฐ์์ ๋ปํน ๊ฑ Chat ๊ฐ GPT ํํ ๋ฌผ์ด๋ดค๋ค. ใ
https://gall.dcinside.com/m/game_dev/161430
๊ฐ์ค์น ์๋ ๋๋ค์ ๊ตฌํํ๋ ค๋ฉด๋ณดํต์ ์ด๋ฐ์์ผ๋ก ๊ตฌํํ๊ฒ ๋๋ค์๋ฅผ ๋ค์ด [1,2,3] ์ด๋ ๊ฒ weight๊ฐ ์์ผ๋ฉด, [1, 6] ์ฌ์ด ๊ฐ์ ๋ฝ์์, weight๋ฅผ ํ๋์ฉ ๋ํ๋ค๊ฐ, ๊ทธ ๊ฐ์ ๋์ด๊ฐ๋ฉด pick ํ๋ ์์ด๋ค
gall.dcinside.com
์ผ๋จ ๊ฐ์ค์น ๋๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฐ๋? ๊ทธ๋ฅ ๋๋ค ํจ์ ์ฐ๋ฉด ๋ ๊ฒ์? ์ด๋ผ๊ณ ์๊ฐํ ์ ์์.
๋ฃฐ๋ ์ ์๋ก ๋ค๋ฉด (๊ฑ ์ธํฐ๋ท์ ์๋ฌด ๋ฃฐ๋ ์ด๋ฏธ์ง ๊ฐ์ ธ์ด)
์์ ๋นจ๊ฐ์ ์์ญ์ด ๊ฝ์ด๋ผ๊ณ ํ ๋ ๋์ถฉ 70%๋ผ๊ณ ์น์. ์ด ๊ฐ์ ๋ด๊ฐ 60%๋ก ๋ฐ๊พธ๊ณ ์ถ์ด. ๊ทธ๋ผ ์ด๋ป๊ฒ ํจ? ๋ค๋ฅธ ํ๋์์ด๋ ์ด๋ก์ ์์ญ๋ค ํ๋ฅ ๊น์ง ๋ค ๋ฐ๊ฟ์ผํ์ง?
์ ๊ฑด ๊ฐ์ด 3๊ฐ๋ผ ๊ธ๋ฐฉ ๋ฐ๊พธ๊ฒ ์ง๋ง ํ๋ฅ ๋ฆฌ์คํธ๊ฐ ๋ง 100๊ฐ๋ผ๊ณ ํ๋ฉด ๊ทธ ์ค์ ํ๋ ๋ฐ๊พธ๋ฉด ๋๋จธ์ง 99๊ฐ ํ๋ฅ ๋ ๋ค ์กฐ์ ํด์ผํ์์?(ํฉ๊ณ๊ฐ 100%์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์)
๊ทธ๋์ ๊ฐ์ค์น ๋๋ค ์๊ณ ๋ฆฌ์ฆ์ด ๋์จ ๊ฒ์. ๊ฐ์ค์น๋ฅผ ํ ๋๋ก ํ๋ฅ ์ด ์ ํด์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๋จํ๊ฒ ์ํ๋ ํ๋ฅ ์ ๊ฐ์ค์น ๊ฐ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋จธ์ง ์๋์ผ๋ก ๊ณ์ฐ๋จ.
๊ทผ๋ฐ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๊ฐ O(n)์ด๋ผ์ ๋นํจ์จ์ ์ด๋ผ A. J. Walker๋ผ๋ ๊ฒ์ด๊ฐ ์ข ๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ง๋ ๊ฒ ์(
https://en.wikipedia.org/wiki/Alias_method). ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆฌ ํฌ๊ฒ ์ด๋ ต์ง ์์.
์์ ์ ๊ทธ๊ฑฐ์. ๊ธฐ์กด ๊ฐ์ค์น ๋๋ค ๋ฐฉ์์ ๋ฌด์ํ๊ฒ for๋ฌธ ๋๋ ค์ ์ง์ ๋ ๊ฐ์ด ๋์ฌ ๋๊น์ง ๊ฐ์ ๋ํด๊ฐ๋ฉด์ ์ฐพ๋ ๋ฐฉ๋ฒ์ด์๋ค๋ฉด,
์ด๊ฑด ๋ฏธ๋ฆฌ ๋์ํ
์ด๋ธ ๋ง๋ค์ด์ ๊ทธ๊ฑฐ ์ฌ์ฉํ๋๊ฑฐ. for๋ฌธ ๋๋ฆด ํ์๋ ์๊ณ , ๊ฐ๋ ๋ํ ํ์๋ ์์ ์ด๋ฏธ ๋ค ํด๋จ๊ธฐ ๋๋ฌธ์ ํธํ๊ฒ ๋์ํ
์ด๋ธ ๋ฐฐ์ด์์ ์ฐพ์ ์ฐ๋ฉด๋จ.
๋์ํ ์ด๋ธ์์ ์์ธ๊ฐ ๋ฐ์๋๋ฉด ๊ทธ๊ฑฐ ๋ณด์์ฉ์ผ๋ก alias ํ ์ด๋ธ๋ ํ๋ ๋ ๋ง๋๋ ๊ฒ์.
์๋๋ถํฐ๋ Chat GPT ๋ต๋ณ
๋ค์ ํ๋ฅ ์ ๊ฐ์ง ์ธ ๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ฒฐ๊ณผ A: 50% ํ๋ฅ
๊ฒฐ๊ณผ B: 30% ํ๋ฅ
๊ฒฐ๊ณผ C: 20% ํ๋ฅ
๋ณ์นญ ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1๋จ๊ณ: ํ๋ฅ ์ ๊ทํ
๋จผ์ ํ๋ฅ ์ ์กฐ์ ํ์ฌ ํ๋ฅ ์ ํฉ์ด ๊ฒฐ๊ณผ ์(์ด ๊ฒฝ์ฐ 3)์ ๊ฐ์์ง๋๋ก ํฉ๋๋ค.
์ ๊ทํ๋ ํ๋ฅ :
A: 0.5 * 3 = 1.5
B: 0.3 * 3 = 0.9
C: 0.2 * 3 = 0.6
2๋จ๊ณ: ๋ ๊ฐ์ ๋ชฉ๋ก ๋ง๋ค๊ธฐ
๊ฒฐ๊ณผ๋ฅผ ๋ ๊ฐ์ ๋ชฉ๋ก์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
ํ๋ฅ โค 1์ ๊ฒฝ์ฐ small
ํ๋ฅ > 1์ ๊ฒฝ์ฐ large
small: B(0.9), C(0.6)
large: A(1.5)
3๋จ๊ณ: ํ ์ฑ์ฐ๊ธฐ
๋ ๊ฐ์ ๋ฐฐ์ด prob์ alias๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ๋ ๋ค ํฌ๊ธฐ๊ฐ 3(๊ฒฐ๊ณผ์ ์)์ ๋๋ค.
๋ฐฐ์ด ์ด๊ธฐํ:
prob = [0, 0, 0]
alias = [-1, -1, -1] (๋ณ์นญ์ด ์์์ ๋ํ๋ด๊ธฐ ์ํด -1 ์ฌ์ฉ)
๊ฐ ์ ์ฒ๋ฆฌ:
1. small์์ ํ ์์์ large์์ ํ ์์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
small: C (0.6)
large: A (1.5)
C์ prob๋ฅผ 0.6(์ ๊ทํ๋ ํ๋ฅ )์ผ๋ก ์ค์ ํฉ๋๋ค.
prob = [0.6, 0, 0]
C์ alias๋ฅผ A(๋ ํฐ ์์)๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ค์ ํฉ๋๋ค.
alias = [A, -1, -1]
C์์ ์ฌ์ฉํ ์์ ๋นผ์ A์ ํ๋ฅ ์ ์กฐ์ ํฉ๋๋ค.
A์ ์กฐ์ ๋ ํ๋ฅ = 1.5 - (1 - 0.6) = 1.1
(A์ ํ๋ฅ ์ 0.4๋ฅผ ์ฌ์ฉํ์ฌ C์ ์ด ํ๋ฅ ์ 1.0์ผ๋ก ๋ง๋ค์์ผ๋ฏ๋ก)
์ด์ A์ ์กฐ์ ๋ ํ๋ฅ (1.1)์ ์ฌ์ ํ 1๋ณด๋ค ํฌ๋ฏ๋ก large์ ๋จ์ ์์ต๋๋ค.
2. ๋ค์ ์:
small: B (0.9)
large: A (1.1)
B์ prob๋ฅผ 0.9(์ ๊ทํ๋ ํ๋ฅ )๋ก ์ค์ ํฉ๋๋ค.
prob = [0.6, 0.9, 0]
B์ alias๋ฅผ A๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ค์ ํฉ๋๋ค.
alias = [A, A, -1]
A์ ํ๋ฅ ์ ์กฐ์ ํฉ๋๋ค.
A์ ์กฐ์ ๋ ํ๋ฅ = 1.1 - (1 - 0.9) = 1.0
์ด์ A์ ์กฐ์ ๋ ํ๋ฅ ์ ์ ํํ 1์ด๋ฏ๋ก ๋ ์ด์ aliasing์ด ํ์ํ์ง ์์ต๋๋ค.
3. ๋๋จธ์ง ์์ A๋ prob๋ฅผ ์ง์ ์ค์ ํฉ๋๋ค.
prob = [0.6, 0.9, 1.0]
alias = [A, A, -1]
4๋จ๊ณ: ์ํ๋ง
๊ฒฐ๊ณผ๋ฅผ ์ํ๋งํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
1. ์์ ์ธ๋ฑ์ค i(0, 1 ๋๋ 2)๋ฅผ ์์ฑํฉ๋๋ค.
2. 0๊ณผ 1 ์ฌ์ด์ ๋ค๋ฅธ ๋์ r์ ์์ฑํฉ๋๋ค.
3. r < prob[i]์ด๋ฉด ์ธ๋ฑ์ค i์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ๋ฑ์ค i์ ๋ณ์นญ์ ์ฌ์ฉํฉ๋๋ค.
์์
๋ค์๊ณผ ๊ฐ์ ๋์ ๊ฐ์ ์ป๋๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋์ ์ธ๋ฑ์ค i = 1(๊ฒฐ๊ณผ B ๋๋ ๋ณ์นญ A์ ํด๋น)
๋์ r = 0.7
i = 1(B)์ ๊ฒฝ์ฐ:
prob[1] = 0.9
r = 0.7 < 0.9์ด๋ฏ๋ก ๊ฒฐ๊ณผ B๋ฅผ ์ ํํฉ๋๋ค.
r = 0.95์ธ ๊ฒฝ์ฐ:
r = 0.95 > 0.9์ด๋ฏ๋ก A๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์นญ์ ์ฌ์ฉํฉ๋๋ค.
์์ฝ
์ฌ์ ์ฒ๋ฆฌ๋ ๋ฐฐ์ด:
prob = [0.6, 0.9, 1.0]
alias = [A, A, -1]
๋ค์ ๋ฐฐ์ด์ ํจ์จ์ ์ธ ์ํ๋ง์ ํ์ฉํฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ ๋ฌด์์๋ก ์ ํํฉ๋๋ค.
prob ๋ฐ alias ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ด๊ธฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ ์ดํ ๊ฐ ์ํ์ด ์ผ์ ์๊ฐ O(1) ๋ด์ ์์ฑ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ ๊ฑ ๋ณต๋ถ(+์ฝ๊ฐ์ ์ ๋ฆฌ)ํ๊ณ , ์ดํด์๋๋ฉด ๋๋ค๋ ๋ฌผ์ด๋ด๋ผ ใ ใ ๊ทธ๋ ๊ฐ๊ฐ!

์์ฐ๋์ง์๋ํ ๋๋ฌด์ข์์ค๋ช ์ด์ผ