BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ

BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ฌถ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. Unity์—๋Š” ์ด๋ฅผ ์œ„ํ•œ ์ž์ฒด Random์ด ์žˆ๊ณ  ์ด์™€ ๋ณ‘ํ–‰ํ•˜์—ฌ System.Random์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜›๋‚  ์˜›์ ์— ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ ๋‘˜ ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐฐํฌ๋˜์–ด์•ผ ํ•จ).

๊ทธ๋Ÿฐ ๋‹ค์Œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. System.Random์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  RNG๊ฐ€ ์–ผ๋งˆ๋‚˜ "ํŽธํ–ฅ์ "์ด๊ฑฐ๋‚˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ์ง€, ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”์šฑ์ด ๋‚˜๋Š” ๊ทธ๋“ค์˜ "์ •์ง์„ฑ"์— ๋Œ€ํ•ด ์ƒ์ถฉ๋˜๋Š” ์˜๊ฒฌ์„ ํ•œ ๋ฒˆ ์ด์ƒ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ์„ ์–ธ ๋œ ๊ฒฐ๊ณผ์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋žตํ•œ ๊ต์œก ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” RNG๋Š” ์‹ค์ œ๋กœ RNG์ž…๋‹ˆ๋‹ค.

๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์— ์ด๋ฏธ ์ต์ˆ™ํ•˜๋‹ค๋ฉด ์ฆ‰์‹œ "ํ…Œ์ŠคํŠธ" ์„น์…˜์œผ๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚œ์ˆ˜(RN)๋Š” ์—”ํŠธ๋กœํ”ผ์˜ ์›์ธ์ธ ๋ฌด์ž‘์œ„(ํ˜ผ๋ˆ) ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ผ๋ จ์˜ ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ ์š”์†Œ๊ฐ€ ์ˆ˜ํ•™์  ๋ฒ•์น™์— ์˜ํ•ด ์ƒํ˜ธ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์‹œํ€€์Šค์ด๋ฉฐ ์ธ๊ณผ ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ(RNG)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ดˆ๋ณด์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด๋ก ์—์„œ ์‹ค์Šต์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์‹ค์ œ๋กœ ๊ทธ๋Ÿฌํ•œ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ˜„๋Œ€ ๊ฐ€์ „์ œํ’ˆ์— ์ด์™€ ๊ฐ™์€ ํ˜ผ๋ž€์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด ๋‚œ์ˆ˜๋Š” ๋” ์ด์ƒ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ƒ์„ฑ๊ธฐ๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์ธ์ˆ˜์˜ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. IT ๋ถ„์•ผ์˜ ์—ฌ๋Ÿฌ ์ „๋ฌธ ๋ถ„์•ผ์—์„œ๋Š” ์ด๊ฒƒ์ด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ(์˜ˆ: ์•”ํ˜ธํ™”)์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋ถ„์•ผ์—์„œ๋Š” ์™„์ „ํžˆ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋‚œ์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๊นŒ์šด ์†Œ์œ„ ์˜์‚ฌ ๋‚œ์ˆ˜(PRN)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ(PRNG)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

PRNG๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ๋‹ค์Œ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

  1. ์˜ˆ๋น„ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    PRNG์—๋Š” ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž(๋˜๋Š” ๋ฒกํ„ฐ)๋กœ ์ง€์ •ํ•˜์—ฌ ์‹œ๋“œ(Random Seed)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ข…์ข… ํ”„๋กœ์„ธ์„œ ํด๋Ÿญ ์นด์šดํ„ฐ ๋˜๋Š” ์‹œ์Šคํ…œ ์‹œ๊ฐ„๊ณผ ๋™๋“ฑํ•œ ์ˆ˜์น˜๊ฐ€ ์‹œ๋“œ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  2. ์„œ์—ด ์žฌํ˜„์„ฑ.

    PRNG๋Š” ์™„์ „ํžˆ ๊ฒฐ์ •์ ์ด๋ฏ€๋กœ ์ดˆ๊ธฐํ™” ์ค‘์— ์ง€์ •๋œ ์‹œ๋“œ๊ฐ€ ์ „์ฒด ๋ฏธ๋ž˜ ์ˆซ์ž ์‹œํ€€์Šค๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋™์ผํ•œ ์‹œ๋“œ(๋‹ค๋ฅธ ์‹œ๊ฐ„, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ, ๋‹ค๋ฅธ ์žฅ์น˜)๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ„๋„์˜ PRNG๊ฐ€ ๋™์ผํ•œ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ PRNG๋ฅผ ํŠน์ง•์ง“๋Š” ํ™•๋ฅ  ๋ถ„ํฌ, ์ฆ‰ PRNG๊ฐ€ ์ƒ์„ฑํ•  ์ˆซ์ž์™€ ํ™•๋ฅ ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ด๋Š” ์ •๊ทœ ๋ถ„ํฌ์ด๊ฑฐ๋‚˜ ๊ท ์ผ ๋ถ„ํฌ์ž…๋‹ˆ๋‹ค.
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ
์ •๊ทœ ๋ถ„ํฌ(์™ผ์ชฝ) ๋ฐ ๊ท ๋“ฑ ๋ถ„ํฌ(์˜ค๋ฅธ์ชฝ)

๋ฉด์ด 24๊ฐœ์ธ ๊ณต์ •ํ•œ ์ฃผ์‚ฌ์œ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋˜์ง€๋ฉด 1์ด ๋‚˜์˜ฌ ํ™•๋ฅ ์€ 24/XNUMX(๋‹ค๋ฅธ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ฌ ํ™•๋ฅ ๊ณผ ๋™์ผ)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฒˆ ๋˜์ง€๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ•˜๋ฉด ๋ชจ๋“  ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋นˆ๋„๋กœ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋‹ค์ด๋Š” ๊ท ์ผํ•œ ๋ถ„ํฌ๋ฅผ ๊ฐ€์ง„ RNG๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฃผ์‚ฌ์œ„ 10๊ฐœ๋ฅผ ํ•œ๋ฒˆ์— ๋˜์ ธ์„œ ์ด์ ์„ ๊ณ„์‚ฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ํ†ต์ผ์„ฑ์ด ์œ ์ง€๋  ๊ฒƒ์ธ๊ฐ€? ์•„๋‹ˆ์š”. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ธˆ์•ก์€ 125ํฌ์ธํŠธ, ์ฆ‰ ํ‰๊ท ๊ฐ’์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋˜์ง€๊ธฐ ์ „์—๋„ ํ–ฅํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ‰๊ท ์ ์ˆ˜๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ์กฐํ•ฉ์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฉ€์–ด์งˆ์ˆ˜๋ก ์กฐํ•ฉ ์ˆ˜๊ฐ€ ์ ์–ด์ง€๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์†์‹ค ํ™•๋ฅ ๋„ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋ฉด ์ข… ๋ชจ์–‘๊ณผ ์–ด๋ ดํ’‹ํ•˜๊ฒŒ ๋‹ฎ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฝ๊ฐ„์˜ ํ™•์žฅ์„ ํ†ตํ•ด 10๊ฐœ์˜ ์ฃผ์‚ฌ์œ„๋กœ ๊ตฌ์„ฑ๋œ ์‹œ์Šคํ…œ์„ ์ •๊ทœ ๋ถ„ํฌ๋ฅผ ๊ฐ–๋Š” RNG๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ์ด๋ฒˆ์—๋Š” ๋น„ํ–‰๊ธฐ์—์„œ ํ‘œ์ ์„ ์˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šˆํ„ฐ๋Š” ๊ทธ๋ž˜ํ”„์— ํ‘œ์‹œ๋˜๋Š” ์ˆซ์ž ์Œ(x, y)์„ ์ƒ์„ฑํ•˜๋Š” RNG๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด 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, ...

์–ผํ• ๋ณด๋ฉด ์ด ์ˆซ์ž๋“ค์ด ์–ผ๋งˆ๋‚˜ ๋ฌด์ž‘์œ„์ ์ธ๊ฐ€? ๋ถ„ํฌ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ
๊ท ์ผํ•ด ๋ณด์ด์ง€๋งŒ ์ผ๋ จ์˜ ๋‘ ์ˆซ์ž๋ฅผ ์ฝ๊ณ  ์ด๋ฅผ ํ‰๋ฉด์˜ ์ขŒํ‘œ๋กœ ํ•ด์„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ
ํŒจํ„ด์ด ์„ ๋ช…ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œํ€€์Šค์˜ ๋ฐ์ดํ„ฐ๋Š” ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—(์ฆ‰, ์—”ํŠธ๋กœํ”ผ๊ฐ€ ๋‚ฎ์Œ) ๋ฐ”๋กœ ๊ทธ "ํŽธํ–ฅ"์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ด๋Ÿฌํ•œ 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, ...

๋น„ํ–‰๊ธฐ ์•ˆ์—์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ
๋ณผ๋ฅจ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(ํ•œ ๋ฒˆ์— ์„ธ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ฝ์Œ).
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ
๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ํŒจํ„ด. ๋” ์ด์ƒ 4์ฐจ์› ์‹œ๊ฐํ™”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจํ„ด์€ ์ด ์ฐจ์›๊ณผ ๋” ํฐ ์ฐจ์›์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PRNG์— ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋Š” ์•”ํ˜ธํ™”์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ์šฉ๋‚ฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐœ๋ฐœ๋˜์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ๋Š” ๊ด‘๋ฒ”์œ„ํ•˜๋ฉฐ ๋ณ„๋„์˜ ๊ธฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

์šฐ๋ฆฌ๊ฐ€ ํ™•์‹คํžˆ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ž‘์—…ํ•ด์•ผ ํ• ๊นŒ์š”? ์–ด๋–ค ์‹ ํ˜ธ๋“ฑ์ด ํ—ˆ์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด ๊ธธ์„ ๊ฑด๋„ˆ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ณผ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Unity์˜ ์•…๋ช… ๋†’์€ ๋ฌด์ž‘์œ„์„ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ํ•„์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ฐํ˜€์ง€๋ฉด ์ข‹์ง€๋งŒ ๊ธฐ์‚ฌ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์–ธ๊ธ‰๋œ ์ด์•ผ๊ธฐ๋Š” ์›ํ•˜๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ถ€์กฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„๊ตฌ์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ชจ๋ฅด๋ฉด ๋„๊ตฌ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ๋ถ„ํฌ ์ •๋„๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ—˜์„ ํ™•์ธํ•˜๊ณ  ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๊ฐ๊ด€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ตฌ ์ฃผ์ œ

Unity์—์„œ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 5๊ฐ€์ง€๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์‹œ์Šคํ…œ.๋žœ๋ค.๋‹ค์Œ(). ์ฃผ์–ด์ง„ ๊ฐ’ ๋ฒ”์œ„์—์„œ ์ •์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ์‹œ์Šคํ…œ.Random.NextDouble(). [0; 1).
  3. UnityEngine.Random.Range(). ์ง€์ •๋œ ๊ฐ’ ๋ฒ”์œ„์—์„œ ๋‹จ์ •๋ฐ€๋„ ์ˆซ์ž(๋ถ€๋™ ์†Œ์ˆ˜์ )๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. UnityEngine.Random.value. [0; 1).
  5. 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

ะ ะตะฐะปะธะทะฐั†ะธั

๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ œ๊ณตํ•˜๋Š” ๋ณ„๋„์˜ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐ’ ๋ฒ”์œ„ [์ตœ์†Œ/์ตœ๋Œ€) ์„ค์ • ๊ฐ€๋Šฅ. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  2. MF๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ์œ ํ˜•์œผ๋กœ float๋ฅผ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํŽธ์˜์ƒ ํด๋ž˜์Šค ์ „์ฒด ์ด๋ฆ„ + 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();
            }
        }

        ...
    }
}

ํ”„๋กœ์ ํŠธ ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. GitLab.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

๊ธฐ์ ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ธฐ๋Œ€ํ–ˆ๋˜ ๊ฒƒ์€ ๊ทธ๋“ค์ด ์–ป์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์— ์Œ๋ชจ์˜ ํžŒํŠธ ์—†์ด ๊ท ๋“ฑํ•œ ๋ถ„ํฌ๊ฐ€ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ˜„์‹ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ

5๊ฐ€์ง€ ์ƒ์„ฑ ๋ฐฉ๋ฒ• ๋ชจ๋‘์—์„œ ํ‰๋ฉด์˜ ์‹œํ€€์Šค ์‹œ๊ฐํ™”:
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ

๊ทธ๋ฆฌ๊ณ  3D๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋‚ด์šฉ์ด ๋งŽ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก System.Random.Next()์˜ ๊ฒฐ๊ณผ๋งŒ ๋‚จ๊ฒจ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.
BlessRNG ๋˜๋Š” ๊ณต์ •์„ฑ์„ ์œ„ํ•ด RNG ํ™•์ธ

UnityEngine.Random์˜ ์ •๊ทœ ๋ถ„ํฌ์— ๋Œ€ํ•œ ์†Œ๊ฐœ ๋ถ€๋ถ„์—์„œ ์ด์•ผ๊ธฐํ•œ ์ด์•ผ๊ธฐ๋Š” ๋ฐ˜๋ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ์—”์ง„์—์„œ ๋ญ”๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ ์šฐ๋ฆฌ๋Š” ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€