์•„๋ž˜ ๊ฒŒ์ด๊ฐ€ ์“ด ๊ธ€์— ๋ณด์ถฉ ์„ค๋ช… ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋ปํ‚น ๊ฑ Chat ๊ฐ“ GPT ํ•œํ…Œ ๋ฌผ์–ด๋ดค๋‹ค. ใ…‹

https://gall.dcinside.com/m/game_dev/161430

weighted random alias method์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž - ์ธ๋”” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ๋งˆ์ด๋„ˆ ๊ฐค๋Ÿฌ๋ฆฌ

๊ฐ€์ค‘์น˜ ์žˆ๋Š” ๋žœ๋ค์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด๋ณดํ†ต์€ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค์˜ˆ๋ฅผ ๋“ค์–ด [1,2,3] ์ด๋ ‡๊ฒŒ weight๊ฐ€ ์žˆ์œผ๋ฉด, [1, 6] ์‚ฌ์ด ๊ฐ’์„ ๋ฝ‘์•„์„œ, weight๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ํ•˜๋‹ค๊ฐ€, ๊ทธ ๊ฐ’์„ ๋„˜์–ด๊ฐ€๋ฉด pick ํ•˜๋Š” ์‹์ด๋‹ค

gall.dcinside.com


์ผ๋‹จ ๊ฐ€์ค‘์น˜ ๋žœ๋ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์™œ ์“ฐ๋ƒ? ๊ทธ๋ƒฅ ๋žœ๋ค ํ•จ์ˆ˜ ์“ฐ๋ฉด ๋  ๊ฒƒ์„? ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ.

๋ฃฐ๋ ›์„ ์˜ˆ๋กœ ๋“ค๋ฉด (๊ฑ ์ธํ„ฐ๋„ท์— ์•„๋ฌด ๋ฃฐ๋ ›์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ด)


24b0d121e09c28a8699fe8b115ef046ecc4dc8f2

์œ„์— ๋นจ๊ฐ„์ƒ‰ ์˜์—ญ์ด ๊ฝ์ด๋ผ๊ณ  ํ•  ๋•Œ ๋Œ€์ถฉ 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) ๋‚ด์— ์ƒ์„ฑ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.



๋‚œ ๊ฑ ๋ณต๋ถ™(+์•ฝ๊ฐ„์˜ ์ •๋ฆฌ)ํ–ˆ๊ณ , ์ดํ•ด์•ˆ๋˜๋ฉด ๋‹ˆ๋“ค๋„ ๋ฌผ์–ด๋ด๋ผ ใ…‹ใ…‹ ๊ทธ๋Š” ๊ฐ“๊ฐ“!



์œ ๋‹ˆํ‹ฐ์งฑ