๊ฒ์ ๊ฐ๋ฐ์์๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฌด์์๋ก ๋ฌถ์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Unity์๋ ์ด๋ฅผ ์ํ ์์ฒด Random์ด ์๊ณ ์ด์ ๋ณํํ์ฌ System.Random์ด ์์ต๋๋ค. ์๋ ์์ ์ ํ๋ก์ ํธ ์ค ํ๋์์ ๋ ๋ค ๋ค๋ฅด๊ฒ ์๋ํ ์ ์๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค(๋ฌผ๋ก ๊ท ๋ฑํ๊ฒ ๋ฐฐํฌ๋์ด์ผ ํจ).
๊ทธ๋ฐ ๋ค์ ์ธ๋ถ ์ฌํญ์ ๋ค๋ฃจ์ง ์์์ต๋๋ค. System.Random์ผ๋ก ์ ํํ์ฌ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ณ RNG๊ฐ ์ผ๋ง๋ "ํธํฅ์ "์ด๊ฑฐ๋ ์์ธก ๊ฐ๋ฅํ์ง, ์ด๋ค ๊ฒ์ ์ ํํ ๊ฒ์ธ์ง์ ๋ํ ์ฝ๊ฐ์ ์ฐ๊ตฌ๋ฅผ ์ํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋์ฑ์ด ๋๋ ๊ทธ๋ค์ "์ ์ง์ฑ"์ ๋ํด ์์ถฉ๋๋ ์๊ฒฌ์ ํ ๋ฒ ์ด์ ๋ค์์ต๋๋ค. ์ค์ ๊ฒฐ๊ณผ๊ฐ ์ ์ธ ๋ ๊ฒฐ๊ณผ์ ์ด๋ป๊ฒ ๋น๊ต๋๋์ง ์์ ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋ตํ ๊ต์ก ํ๋ก๊ทธ๋จ ๋๋ RNG๋ ์ค์ ๋ก RNG์ ๋๋ค.
๋์ ์์ฑ๊ธฐ์ ์ด๋ฏธ ์ต์ํ๋ค๋ฉด ์ฆ์ "ํ ์คํธ" ์น์ ์ผ๋ก ๊ฑด๋๋ธ ์ ์์ต๋๋ค.
๋์(RN)๋ ์ํธ๋กํผ์ ์์ธ์ธ ๋ฌด์์(ํผ๋) ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ผ๋ จ์ ์ซ์์ ๋๋ค. ์ฆ, ์ด๊ฒ์ ์์๊ฐ ์ํ์ ๋ฒ์น์ ์ํด ์ํธ ์ฐ๊ฒฐ๋์ง ์์ ์ํ์ค์ด๋ฉฐ ์ธ๊ณผ ๊ด๊ณ๊ฐ ์์ต๋๋ค.
๋์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋์ ์์ฑ๊ธฐ(RNG)๋ผ๊ณ ํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ด๋ณด์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ด๋ก ์์ ์ค์ต์ผ๋ก ์ด๋ํ๋ฉด ์ค์ ๋ก ๊ทธ๋ฌํ ์ํ์ค๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ํํธ์จ์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๊ฐ๋จํ์ง ์์ต๋๋ค.
๊ทธ ์ด์ ๋ ํ๋ ๊ฐ์ ์ ํ์ ์ด์ ๊ฐ์ ํผ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ด ์์ผ๋ฉด ๋์๋ ๋ ์ด์ ๋ฌด์์๊ฐ ์๋๋ฉฐ ์์ฑ๊ธฐ๋ ๋ช ํํ๊ฒ ์ ์๋ ์ธ์์ ์ผ๋ฐ ํจ์๋ก ๋ณํฉ๋๋ค. IT ๋ถ์ผ์ ์ฌ๋ฌ ์ ๋ฌธ ๋ถ์ผ์์๋ ์ด๊ฒ์ด ์ฌ๊ฐํ ๋ฌธ์ (์: ์ํธํ)์ด์ง๋ง ๋ค๋ฅธ ๋ถ์ผ์์๋ ์์ ํ ์์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์์ต๋๋ค.
์ค์ ๋์๋ ์๋์ง๋ง ๊ฐ๋ฅํ ํ ๊ฐ๊น์ด ์์ ์์ฌ ๋์(PRN)๋ฅผ ๋ฐํํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ฌ ๋์ ์์ฑ๊ธฐ(PRNG)๋ผ๊ณ ํฉ๋๋ค.
PRNG๋ฅผ ์์ฑํ๋ ๋ฐ๋ ์ฌ๋ฌ ๊ฐ์ง ์ต์ ์ด ์์ง๋ง ๋ค์์ ๋ชจ๋ ์ฌ๋์๊ฒ ํด๋น๋ฉ๋๋ค.
- ์๋น ์ด๊ธฐํ๊ฐ ํ์ํฉ๋๋ค.
PRNG์๋ ์ํธ๋กํผ ์์ค๊ฐ ์์ผ๋ฏ๋ก ์ฌ์ฉํ๊ธฐ ์ ์ ์ด๊ธฐ ์ํ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ซ์(๋๋ ๋ฒกํฐ)๋ก ์ง์ ํ์ฌ ์๋(Random Seed)๋ผ๊ณ ํฉ๋๋ค. ์ข ์ข ํ๋ก์ธ์ ํด๋ญ ์นด์ดํฐ ๋๋ ์์คํ ์๊ฐ๊ณผ ๋๋ฑํ ์์น๊ฐ ์๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์์ด ์ฌํ์ฑ.
PRNG๋ ์์ ํ ๊ฒฐ์ ์ ์ด๋ฏ๋ก ์ด๊ธฐํ ์ค์ ์ง์ ๋ ์๋๊ฐ ์ ์ฒด ๋ฏธ๋ ์ซ์ ์ํ์ค๋ฅผ ๊ณ ์ ํ๊ฒ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ๋์ผํ ์๋(๋ค๋ฅธ ์๊ฐ, ๋ค๋ฅธ ํ๋ก๊ทธ๋จ, ๋ค๋ฅธ ์ฅ์น)๋ก ์ด๊ธฐํ๋ ๋ณ๋์ PRNG๊ฐ ๋์ผํ ์ํ์ค๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ํ PRNG๋ฅผ ํน์ง์ง๋ ํ๋ฅ ๋ถํฌ, ์ฆ PRNG๊ฐ ์์ฑํ ์ซ์์ ํ๋ฅ ์ ์์์ผ ํฉ๋๋ค. ๋๋ถ๋ถ ์ด๋ ์ ๊ท ๋ถํฌ์ด๊ฑฐ๋ ๊ท ์ผ ๋ถํฌ์
๋๋ค.
์ ๊ท ๋ถํฌ(์ผ์ชฝ) ๋ฐ ๊ท ๋ฑ ๋ถํฌ(์ค๋ฅธ์ชฝ)
๋ฉด์ด 24๊ฐ์ธ ๊ณต์ ํ ์ฃผ์ฌ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๊ฒ์ ๋์ง๋ฉด 1์ด ๋์ฌ ํ๋ฅ ์ 24/XNUMX(๋ค๋ฅธ ์ซ์๊ฐ ๋์ฌ ํ๋ฅ ๊ณผ ๋์ผ)๊ฐ ๋ฉ๋๋ค. ์ฌ๋ฌ ๋ฒ ๋์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ๋ฉด ๋ชจ๋ ๊ฐ์ฅ์๋ฆฌ๊ฐ ๊ฑฐ์ ๋์ผํ ๋น๋๋ก ๋จ์ด์ง๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋ค์ด๋ ๊ท ์ผํ ๋ถํฌ๋ฅผ ๊ฐ์ง RNG๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
์ด ์ฃผ์ฌ์ 10๊ฐ๋ฅผ ํ๋ฒ์ ๋์ ธ์ ์ด์ ์ ๊ณ์ฐํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ํต์ผ์ฑ์ด ์ ์ง๋ ๊ฒ์ธ๊ฐ? ์๋์. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ธ์ก์ 125ํฌ์ธํธ, ์ฆ ํ๊ท ๊ฐ์ ๊ฐ๊น์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ง๊ธฐ ์ ์๋ ํฅํ ๊ฒฐ๊ณผ๋ฅผ ๋๋ต์ ์ผ๋ก ์ถ์ ํ ์ ์์ต๋๋ค.
๊ทธ ์ด์ ๋ ํ๊ท ์ ์๋ฅผ ์ป๊ธฐ ์ํ ์กฐํฉ์ ์๊ฐ ๊ฐ์ฅ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฉ์ด์ง์๋ก ์กฐํฉ ์๊ฐ ์ ์ด์ง๊ณ ๊ทธ์ ๋ฐ๋ผ ์์ค ํ๋ฅ ๋ ๋ฎ์์ง๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๋ฉด ์ข ๋ชจ์๊ณผ ์ด๋ ดํํ๊ฒ ๋ฎ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ๊ฐ์ ํ์ฅ์ ํตํด 10๊ฐ์ ์ฃผ์ฌ์๋ก ๊ตฌ์ฑ๋ ์์คํ ์ ์ ๊ท ๋ถํฌ๋ฅผ ๊ฐ๋ RNG๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์๋ ์ด๋ฒ์๋ ๋นํ๊ธฐ์์ ํ์ ์ ์๋ ๊ฒ์
๋๋ค. ์ํฐ๋ ๊ทธ๋ํ์ ํ์๋๋ ์ซ์ ์(x, y)์ ์์ฑํ๋ RNG๊ฐ ๋ฉ๋๋ค.
์ผ์ชฝ ์ต์
์ด ์ค์ ์ํ์ ๋ ๊ฐ๊น๋ค๋ ๋ฐ ๋์ํ์ธ์. ์ด๋ ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ RNG์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋์ด ํ๋์ ๋ณ์ ํฉ๋ฟ๋ ค์ผ ํ๋ ๊ฒฝ์ฐ ๊ท ์ผํ ๋ถํฌ์ RNG๋ฅผ ์ฌ์ฉํ์ฌ ์ป์ ์ฌ๋ฐ๋ฅธ ์ต์
์ด ๋ ์ ํฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ์์
์ ๋ฐ๋ผ ์์ฑ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค.
์ด์ PNG ์ํ์ค์ ์ํธ๋กํผ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์์ํ๋ ์ํ์ค๊ฐ โโ์์ต๋๋ค.
89, 93, 33, 32, 82, 21, 4, 42, 11, 8, 60, 95, 53, 30, 42, 19, 34, 35, 62, 23, 44, 38, 74, 36, 52, 18, 58, 79, 65, 45, 99, 90, 82, 20, 41, 13, 88, 76, 82, 24, 5, 54, 72, 19, 80, 2, 74, 36, 71, 9, ...
์ผํ ๋ณด๋ฉด ์ด ์ซ์๋ค์ด ์ผ๋ง๋ ๋ฌด์์์ ์ธ๊ฐ? ๋ถํฌ๋ฅผ ํ์ธํ๋ ๊ฒ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
๊ท ์ผํด ๋ณด์ด์ง๋ง ์ผ๋ จ์ ๋ ์ซ์๋ฅผ ์ฝ๊ณ ์ด๋ฅผ ํ๋ฉด์ ์ขํ๋ก ํด์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
ํจํด์ด ์ ๋ช
ํ๊ฒ ๋ณด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ์ค์ ๋ฐ์ดํฐ๋ ํน์ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์(์ฆ, ์ํธ๋กํผ๊ฐ ๋ฎ์) ๋ฐ๋ก ๊ทธ "ํธํฅ"์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ต์ํ ์ด๋ฌํ PRNG๋ ํ๋ฉด์์ ์ขํ๋ฅผ ์์ฑํ๋ ๋ฐ ์ ํฉํ์ง ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์์:
42, 72, 17, 0, 30, 0, 15, 9, 47, 19, 35, 86, 40, 54, 97, 42, 69, 19, 20, 88, 4, 3, 67, 27, 42, 56, 17, 14, 20, 40, 80, 97, 1, 31, 69, 13, 88, 89, 76, 9, 4, 85, 17, 88, 70, 10, 42, 98, 96, 53, ...
๋นํ๊ธฐ ์์์๋ ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ณผ๋ฅจ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค(ํ ๋ฒ์ ์ธ ๊ฐ์ ์ซ์๋ฅผ ์ฝ์).
๊ทธ๋ฆฌ๊ณ ๋ค์ ํจํด. ๋ ์ด์ 4์ฐจ์ ์๊ฐํ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ํจํด์ ์ด ์ฐจ์๊ณผ ๋ ํฐ ์ฐจ์์ ์กด์ฌํ ์ ์์ต๋๋ค.
PRNG์ ๊ฐ์ฅ ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ด ์ ์ฉ๋๋ ์ํธํ์์๋ ์ด๋ฌํ ์ํฉ์ด ์ฉ๋ฉ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ง์ ํ๊ฐํ๊ธฐ ์ํด ํน์ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฐ๋ฐ๋์์ง๋ง ์ง๊ธ์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค. ์ฃผ์ ๋ ๊ด๋ฒ์ํ๋ฉฐ ๋ณ๋์ ๊ธฐ์ฌ๊ฐ ํ์ํฉ๋๋ค.
ํ ์คํธ
์ฐ๋ฆฌ๊ฐ ํ์คํ ๋ชจ๋ฅด๋ ๊ฒ์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ์์ ํด์ผ ํ ๊น์? ์ด๋ค ์ ํธ๋ฑ์ด ํ์ฉํ๋์ง ๋ชจ๋ฅธ๋ค๋ฉด ๊ธธ์ ๊ฑด๋๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์์ต๋๊น? ๊ฒฐ๊ณผ๋ ๋ค๋ฅผ ์ ์์ต๋๋ค.
Unity์ ์ ๋ช ๋์ ๋ฌด์์์ฑ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ฌธ์์ ํ์ํ ์ธ๋ถ ์ฌํญ์ด ๋ฐํ์ง๋ฉด ์ข์ง๋ง ๊ธฐ์ฌ ์์ ๋ถ๋ถ์ ์ธ๊ธ๋ ์ด์ผ๊ธฐ๋ ์ํ๋ ์ธ๋ถ ์ฌํญ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ตฌ์ ์๋ ๋ฐฉ์์ ๋ชจ๋ฅด๋ฉด ๋๊ตฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ต์ํ์ ๋ถํฌ ์ ๋๋ฅผ ํ์ธํ๊ธฐ ์ํด ์คํ์ ํ์ธํ๊ณ ์ํํด์ผ ํ ๋๊ฐ ์์ต๋๋ค.
ํด๊ฒฐ์ฑ ์ ๊ฐ๋จํ๊ณ ํจ๊ณผ์ ์ด์์ต๋๋ค. ํต๊ณ๋ฅผ ์์งํ๊ณ , ๊ฐ๊ด์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด์์ต๋๋ค.
์ฐ๊ตฌ ์ฃผ์
Unity์์ ๋์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 5๊ฐ์ง๋ฅผ ํ ์คํธํ์ต๋๋ค.
- ์์คํ .๋๋ค.๋ค์(). ์ฃผ์ด์ง ๊ฐ ๋ฒ์์์ ์ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์์คํ .Random.NextDouble(). [0; 1).
- UnityEngine.Random.Range(). ์ง์ ๋ ๊ฐ ๋ฒ์์์ ๋จ์ ๋ฐ๋ ์ซ์(๋ถ๋ ์์์ )๋ฅผ ์์ฑํฉ๋๋ค.
- UnityEngine.Random.value. [0; 1).
- Unity.Mathematics.Random.NextFloat(). ์๋ก์ด Unity.Mathematics ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ ๋๋ค. ์ง์ ๋ ๊ฐ ๋ฒ์์์ ๋จ์ ๋ฐ๋ ์ซ์(๋ถ๋ ์์์ )๋ฅผ ์์ฑํฉ๋๋ค.
UnityEngine.Random.value(๋ถํฌ๊ฐ ์ง์ ๋์ง ์์์ง๋ง UnityEngine.Random.Range() ์ ๋ํผ๊ณผ ์ ์ฌํ๊ฒ ์์๋๋ ๊ฒฝ์ฐ) ๋ฐ Unity.Mathematics.Random์ ์ ์ธํ๊ณ ๋ฌธ์์ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์์ ๊ท ๋ฑ ๋ถํฌ๊ฐ ์ง์ ๋์์ต๋๋ค. .NextFloat() (์ฌ๊ธฐ์ ๊ธฐ๋ณธ์ xorshift ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ด๋ ๋ค์ ๊ท ์ผํ ๋ถํฌ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํจ์ ์๋ฏธํฉ๋๋ค).
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฒฐ๊ณผ๋ ๋ฌธ์์ ์ง์ ๋ ๋๋ก ์ ์ฉ๋์์ต๋๋ค.
๋ฐฉ๋ฒ๋ก
์ฐ๋ฆฌ๋ ์ ์๋ ๊ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ผ๋ จ์ ๋์๋ฅผ ์์ฑํ๊ณ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ์ต๋๋ค.
๊ฐ ์ํ์ค์ ๊ธธ์ด๋ 100๊ฐ์ ์ซ์์
๋๋ค.
๋์์ ๋ฒ์๋ [0, 100)์
๋๋ค.
๋ฐ์ดํฐ๋ ์ฌ๋ฌ ๋์ ํ๋ซํผ์์ ์์ง๋์์ต๋๋ค.
- Windows
โ Unity v2018.3.14f1, ํธ์ง๊ธฐ ๋ชจ๋, ๋ชจ๋ ธ, .NET Standard 2.0 - macOS
โ Unity v2018.3.14f1, ํธ์ง๊ธฐ ๋ชจ๋, ๋ชจ๋ ธ, .NET Standard 2.0
โ Unity v5.6.4p4, ํธ์ง๊ธฐ ๋ชจ๋, ๋ชจ๋ ธ, .NET Standard 2.0 - Android
โ Unity v2018.3.14f1, ์ฅ์น๋ณ ๋น๋, Mono, .NET Standard 2.0 - iOS
โ Unity v2018.3.14f1, ์ฅ์น๋ณ ๋น๋, il2cpp, .NET Standard 2.0
ะ ะตะฐะปะธะทะฐัะธั
๋์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๊ฐ๊ฐ์ ๋ํด ๋ค์์ ์ ๊ณตํ๋ ๋ณ๋์ ๋ํผ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฐ ๋ฒ์ [์ต์/์ต๋) ์ค์ ๊ฐ๋ฅ. ์์ฑ์๋ฅผ ํตํด ์ค์ ๋ฉ๋๋ค.
- MF๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ ๋๋ค. ๋ ์ผ๋ฐ์ ์ด๋ฏ๋ก ์ ํ์ผ๋ก float๋ฅผ ์ ํํ๊ฒ ์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๊ธฐ ์ํ ์์ฑ ๋ฐฉ๋ฒ์ ์ด๋ฆ์ ๋๋ค. ํธ์์ ํด๋์ค ์ ์ฒด ์ด๋ฆ + MF ์์ฑ์ ์ฌ์ฉ๋ ๋ฉ์๋ ์ด๋ฆ์ ๊ฐ์ผ๋ก ๋ฐํํ๊ฒ ์ต๋๋ค.
๋จผ์ IRandomGenerator ์ธํฐํ์ด์ค๋ก ํํ๋ ์ถ์ํ๋ฅผ ์ ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
namespace RandomDistribution
{
public interface IRandomGenerator
{
string Name { get; }
float Generate();
}
}
System.Random.Next() ๊ตฌํ
์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์์ง๋ง ์ ์๋ฅผ ๋ฐํํ์ง๋ง ๋ถ๋ ์์์ ์ด ํ์ํฉ๋๋ค. ๋จ์ํ ์ ์๋ฅผ ๋ถ๋์์์ ์ผ๋ก ํด์ํ ์๋ ์๊ณ , ๊ฐ์ ๋ฒ์๋ฅผ ๋ช ๋ฐฐ๋ก ํ์ฅํ์ฌ ์ค๊ฐ ๋ฒ์์ ๊ฐ ์ธ๋์ ๋ฐ๋ผ ๋ณด์ํ ์๋ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ฃผ์ด์ง ์ ํ๋์ ๊ณ ์ ์์์ ๊ณผ ๊ฐ์ต๋๋ค. ์ค์ float ๊ฐ์ ๋ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ์ด ์ต์ ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
using System;
namespace RandomDistribution
{
public class SystemIntegerRandomGenerator : IRandomGenerator
{
private const int DefaultFactor = 100000;
private readonly Random _generator = new Random();
private readonly int _min;
private readonly int _max;
private readonly int _factor;
public string Name => "System.Random.Next()";
public SystemIntegerRandomGenerator(float min, float max, int factor = DefaultFactor)
{
_min = (int)min * factor;
_max = (int)max * factor;
_factor = factor;
}
public float Generate() => (float)_generator.Next(_min, _max) / _factor;
}
}
System.Random.NextDouble() ๊ตฌํ
์ฌ๊ธฐ์ ๊ณ ์ ๋ ๊ฐ ๋ฒ์๋ [0; 1). ์์ฑ์์ ์ง์ ๋ ๊ฒ์ ํฌ์ํ๊ธฐ ์ํด X * (max โ min) + min๊ณผ ๊ฐ์ ๊ฐ๋จํ ์ฐ์ ์ ์ฌ์ฉํฉ๋๋ค.
using System;
namespace RandomDistribution
{
public class SystemDoubleRandomGenerator : IRandomGenerator
{
private readonly Random _generator = new Random();
private readonly double _factor;
private readonly float _min;
public string Name => "System.Random.NextDouble()";
public SystemDoubleRandomGenerator(float min, float max)
{
_factor = max - min;
_min = min;
}
public float Generate() => (float)(_generator.NextDouble() * _factor) + _min;
}
}
UnityEngine.Random.Range() ๊ตฌํ
UnityEngine.Random ์ ์ ํด๋์ค์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ฒ์๋ฅผ ์ค์ ํ๊ณ ๋ถ๋ ์์์ ์ ํ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ถ๊ฐ ๋ณํ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
using UnityEngine;
namespace RandomDistribution
{
public class UnityRandomRangeGenerator : IRandomGenerator
{
private readonly float _min;
private readonly float _max;
public string Name => "UnityEngine.Random.Range()";
public UnityRandomRangeGenerator(float min, float max)
{
_min = min;
_max = max;
}
public float Generate() => Random.Range(_min, _max);
}
}
UnityEngine.Random.value ๊ตฌํ
์ ์ ํด๋์ค UnityEngine.Random์ value ์์ฑ์ ๊ณ ์ ๋ ๊ฐ ๋ฒ์์์ ๋ถ๋ ์์์ ์ ํ์ ๋ฐํํฉ๋๋ค. [0; 1). System.Random.NextDouble()์ ๊ตฌํํ ๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฃผ์ด์ง ๋ฒ์์ ํฌ์ํด ๋ณด๊ฒ ์ต๋๋ค.
using UnityEngine;
namespace RandomDistribution
{
public class UnityRandomValueGenerator : IRandomGenerator
{
private readonly float _factor;
private readonly float _min;
public string Name => "UnityEngine.Random.value";
public UnityRandomValueGenerator(float min, float max)
{
_factor = max - min;
_min = min;
}
public float Generate() => (float)(Random.value * _factor) + _min;
}
}
Unity.Mathematics.Random.NextFloat() ๊ตฌํ
Unity.Mathematics.Random ํด๋์ค์ NextFloat() ๋ฉ์๋๋ float ์ ํ์ ๋ถ๋ ์์์ ์ ๋ฐํํ๊ณ ๊ฐ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์๋๋ก ํด์ค๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ Unity.Mathematics.Random์ ๊ฐ ์ธ์คํด์ค๊ฐ ์ผ๋ถ ์๋๋ก ์ด๊ธฐํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ๋ณต ์ํ์ค ์์ฑ์ ํผํ ์ ์์ต๋๋ค.
using Unity.Mathematics;
namespace RandomDistribution
{
public class UnityMathematicsRandomValueGenerator : IRandomGenerator
{
private Random _generator;
private readonly float _min;
private readonly float _max;
public string Name => "Unity.Mathematics.Random.NextFloat()";
public UnityMathematicsRandomValueGenerator(float min, float max)
{
_min = min;
_max = max;
_generator = new Random();
_generator.InitState(unchecked((uint)System.DateTime.Now.Ticks));
}
public float Generate() => _generator.NextFloat(_min, _max);
}
}
MainController ๊ตฌํ
IRandomGenerator์ ์ฌ๋ฌ ๊ตฌํ์ด ์ค๋น๋์์ต๋๋ค. ๋ค์์ผ๋ก ์ํ์ค๋ฅผ ์์ฑํ๊ณ ์ฒ๋ฆฌ๋ฅผ ์ํด ๊ฒฐ๊ณผ ๋ฐ์ดํฐ์ธํธ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด Unity์์ ์ฅ๋ฉด๊ณผ ์์ MainController ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ํ์ํ ๋ชจ๋ ์์ ์ ์ํํ๋ ๋์์ UI์์ ์ํธ ์์ฉ์ ๋ด๋นํฉ๋๋ค.
๋ฐ์ดํฐ์ธํธ์ ํฌ๊ธฐ์ MF ๊ฐ์ ๋ฒ์๋ฅผ ์ค์ ํ๊ณ , ๊ตฌ์ฑ๋์ด ์๋ํ ์ค๋น๊ฐ ๋ ์์ฑ๊ธฐ ๋ฐฐ์ด์ ๋ฐํํ๋ ๋ฉ์๋๋ ๊ฐ์ ธ์ต๋๋ค.
namespace RandomDistribution
{
public class MainController : MonoBehaviour
{
private const int DefaultDatasetSize = 100000;
public float MinValue = 0f;
public float MaxValue = 100f;
...
private IRandomGenerator[] CreateRandomGenerators()
{
return new IRandomGenerator[]
{
new SystemIntegerRandomGenerator(MinValue, MaxValue),
new SystemDoubleRandomGenerator(MinValue, MaxValue),
new UnityRandomRangeGenerator(MinValue, MaxValue),
new UnityRandomValueGenerator(MinValue, MaxValue),
new UnityMathematicsRandomValueGenerator(MinValue, MaxValue)
};
}
...
}
}
์ด์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์์ฑ์ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํธ ์คํธ๋ฆผ(csv ํ์)์ผ๋ก ๊ธฐ๋กํ๋ ๊ฒ๊ณผ ๊ฒฐํฉ๋ฉ๋๋ค. ๊ฐ IRandomGenerator์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ๋ณ๋์ ์ด์ด ํ ๋น๋๋ฉฐ ์ฒซ ๋ฒ์งธ ์ค์๋ ์์ฑ๊ธฐ์ ์ด๋ฆ์ด ํฌํจ๋ฉ๋๋ค.
namespace RandomDistribution
{
public class MainController : MonoBehaviour
{
...
private void GenerateCsvDataSet(TextWriter writer, int dataSetSize, params IRandomGenerator[] generators)
{
const char separator = ',';
int lastIdx = generators.Length - 1;
// write header
for (int j = 0; j <= lastIdx; j++)
{
writer.Write(generators[j].Name);
if (j != lastIdx)
writer.Write(separator);
}
writer.WriteLine();
// write data
for (int i = 0; i <= dataSetSize; i++)
{
for (int j = 0; j <= lastIdx; j++)
{
writer.Write(generators[j].Generate());
if (j != lastIdx)
writer.Write(separator);
}
if (i != dataSetSize)
writer.WriteLine();
}
}
...
}
}
๋จ์ ๊ฒ์ ์์ฑCsvDataSet ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ์ ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ต์ข ์ฅ์น์์ ์์ ์๋ฒ๋ก ์ฆ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ ๋๋ค.
namespace RandomDistribution
{
public class MainController : MonoBehaviour
{
...
public void GenerateCsvDataSet(string path, int dataSetSize, params IRandomGenerator[] generators)
{
using (var writer = File.CreateText(path))
{
GenerateCsvDataSet(writer, dataSetSize, generators);
}
}
public string GenerateCsvDataSet(int dataSetSize, params IRandomGenerator[] generators)
{
using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture))
{
GenerateCsvDataSet(writer, dataSetSize, generators);
return writer.ToString();
}
}
...
}
}
ํ๋ก์ ํธ ์์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
๊ธฐ์ ์ ์ผ์ด๋์ง ์์์ต๋๋ค. ๊ทธ๋ค์ด ๊ธฐ๋ํ๋ ๊ฒ์ ๊ทธ๋ค์ด ์ป์ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ชจ์ ํํธ ์์ด ๊ท ๋ฑํ ๋ถํฌ๊ฐ ์ด๋ฃจ์ด์ก์ต๋๋ค. ํ๋ซํผ์ ๋ํด ๋ณ๋์ ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ ๊ฑฐ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
ํ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
5๊ฐ์ง ์์ฑ ๋ฐฉ๋ฒ ๋ชจ๋์์ ํ๋ฉด์ ์ํ์ค ์๊ฐํ:
๊ทธ๋ฆฌ๊ณ 3D๋ก ์๊ฐํํฉ๋๋ค. ๋์ผํ ๋ด์ฉ์ด ๋ง์ด ์์ฑ๋์ง ์๋๋ก System.Random.Next()์ ๊ฒฐ๊ณผ๋ง ๋จ๊ฒจ ๋๊ฒ ์ต๋๋ค.
UnityEngine.Random์ ์ ๊ท ๋ถํฌ์ ๋ํ ์๊ฐ ๋ถ๋ถ์์ ์ด์ผ๊ธฐํ ์ด์ผ๊ธฐ๋ ๋ฐ๋ณต๋์ง ์์์ต๋๋ค. ์ฒ์์๋ ์ค๋ฅ๊ฐ ์์๊ฑฐ๋ ๋์ค์ ์์ง์์ ๋ญ๊ฐ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ํ์ง๋ง ์ด์ ์ฐ๋ฆฌ๋ ํ์ ํฉ๋๋ค.
์ถ์ฒ : habr.com