Numpy: ์ƒˆ PRNG BitGenerator ๊ธฐ๋ณธ๊ฐ’ ๊ฒฐ์ •

์— ๋งŒ๋“  2019๋…„ 05์›” 27์ผ  ยท  166์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

13163์€ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ numpy์˜ PRNG ์ธํ”„๋ผ๋ฅผ ๋Œ€์ฒด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. PR์„ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒฐ์ •์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋งˆ์Šคํ„ฐ์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด BitGenerator ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ธํ”„๋ผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค ์ „์— ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์„๋ฐฉ๋˜๋ฉด ์šฐ๋ฆฌ๋Š” ํ•œ๋™์•ˆ ์šฐ๋ฆฌ์˜ ์„ ํƒ์— ๊ฐ‡ํžˆ๊ฒŒ ๋  ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ๊ฒฐ์ •์— ์ต์ˆ™ํ•ด ์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ•œํŽธ, ๊ธฐ๋ณธ์˜ ์„ ํƒ์€ ๋งŽ์€ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” numpy.random.* ํŽธ์˜ ๊ธฐ๋Šฅ์˜ ๊ธฐ๋ณธ์ด๋˜๋Š” ๊ธฐ๋ณธ BitGenerator ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. NEP 19์— ๋”ฐ๋ผ BitGenerator ๋Š” MT19937 ์œ ์ง€๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ RandomState ๋ณ„์นญ์œผ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ๋“ค์–ด์˜ค๋Š” ์œ ์ผํ•œ ์œ„์น˜๋Š” Generator() ๊ฐ€ ์ธ์ˆ˜์—†์ด ์ธ์Šคํ„ด์Šคํ™”๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜์˜ ์ƒํƒœ๋กœ Generator ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์•„๋งˆ๋„ .seed() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์›ํ•˜๋Š” BitGenerator ์‹œ๋“œ ๋œ ํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ์‚ฌ์šฉ์ž๊ฐ€ BitGenerator ๋ฅผ ์ง€์ •ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” BitGenerator ์‚ฌ๋žŒ๋“ค์ด ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ œ๊ณต ํ•  ๊ฒƒ์ด๋ฉฐ, ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ƒ๋‹นํžˆ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž๋ถ€์‹ฌ์ด์žˆ๋Š” ์‚ฌ๋žŒ์€ ์•„๋งˆ๋„ ์ฑ…, ๋ธ”๋กœ๊ทธ, ์ž์Šต์„œ์—์„œ ๋Œ€๋ถ€๋ถ„์— ๋Œ€ํ•ด ์“ฐ์—ฌ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ๋“ฑ.

IMO์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค (์ œ ์˜๊ฒฌ๊ณผ ํ•จ๊ป˜ ๋™์˜ํ•˜์ง€ ์•Š์œผ์…”๋„๋ฉ๋‹ˆ๋‹ค. # 13163์˜ ๋ชจ๋“  ๊ด€๋ จ ์˜๊ฒฌ์„ ์ด์‹ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

๊ธฐ๋ณธ๊ฐ’ ์—†์Œ

ํ•ญ์ƒ Generator(ChosenBitGenerator(maybe_seed)) . ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ๋น„์šฐํ˜ธ์ ์ด์ง€๋งŒ, ์žฌํ˜„์„ฑ์„ ์œ„ํ•ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋”๋ผ๋„ ์–ด์จŒ๋“  ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MT19937

์ด๊ฒƒ์€ ์ข‹์€ ๋ณด์ˆ˜์  ์ธ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ˜„์ƒ ์œ ์ง€๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Mersenne Twister๋Š” ์—ฌ์ „ํžˆ "ํ‘œ์ค€"์„ ํƒ์œผ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— PRNG์˜ ํŠน์ • ํŠน์„ฑ์— ๊ด€๊ณ„์—†์ด "๋น„ํ‘œ์ค€"์„ ํƒ์— ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ๋…ผ๋ฌธ์„ ๊ฒ€ํ† ํ•ด์•ผํ•˜๋Š” ํ•™์ˆ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "IBM ์ฑ„์šฉ์œผ๋กœ ํ•ด๊ณ  ๋œ ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค." MT19937 ์˜ ์ฃผ์š” ๋‹จ์ ์€ ๋งค์šฐ ํฐ ์ƒํƒœ๋กœ ์ธํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ ์ค‘ ์ผ๋ถ€๋ณด๋‹ค ๋Š๋ฆฌ๊ณ  ์ผ๋ถ€ ํ†ต๊ณ„์  ํ’ˆ์งˆ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ PRNG๋ฅผ ์„ ํƒํ•  ๋•Œ ์—ฌ๊ธฐ์—์„œ ์˜๊ฒฌ์„ ์ œ์‹œ ํ•  _ ๊ธฐํšŒ _ (_ ์˜๋ฌด _, IMO๋Š” ์•„๋‹˜)๊ฐ€ ์žˆ์œผ๋ฉฐ ์›ํ•˜๋Š” ๊ฒฝ์šฐ "ํ‘œ์ค€"์„ ์ด๋™ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

PCG64

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ๋œ ๋‹จ์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ์ •์ˆ˜ ์œ ํ˜•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ C์—์„œ ์—๋ฎฌ๋ ˆ์ดํŠธ๋˜๋Š” 128 ๋น„ํŠธ ์ •์ˆ˜ ์‚ฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ํ”Œ๋žซํผ์€ 32 ๋น„ํŠธ CPU์™€ 64 ๋น„ํŠธ MSVC์ด๋ฉฐ, CPU๊ฐ€ ์ง€์›ํ•˜๋”๋ผ๋„ 128 ๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ์ ์  ๋” ํฌ๊ท€ ํ•ด์ง€๋Š” 32 ๋น„ํŠธ CPU ์„ฑ๋Šฅ์ด ์šฐ๋ฆฌ์˜ ์„ ํƒ์„ ์ง€์‹œํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MSVC ์„ฑ๋Šฅ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Windows ๋นŒ๋“œ์—๋Š” ๋‹ค๋ฅธ Windows ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์–ด์…ˆ๋ธ”๋ฆฌ / ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด MSVC _only_๋ผ๋Š” ์‚ฌ์‹ค์€ ์šฐ๋ฆฌ๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋ณด๋‹ค ๋” ๋ง›์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Xoshiro256

์ž‘๊ณ  ๋น ๋ฅธ PRNG๋ฅผ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํ˜„๋Œ€์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์•Œ๋ ค์ง„ ํ†ต๊ณ„์  ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์šฉ๋„์—์„œ ์ฃผ์š” ์š”์ธ์ด๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ด ํ•œ ์  ๋•Œ๋ฌธ์— ๋ถ€๋„๋Ÿฌ์›Œํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•  ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฐœ์ธ์  ์„ ํƒ์ž…๋‹ˆ๋‹ค.

15 - Discussion numpy.random

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ์˜๊ฐ์„ ๋ฐ›์•„๋ณด๊ณ  ํ•  ๋‰ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

์—ฌ๋Ÿฌ ์ฒ™๋„์—์„œ pcg64 ์€ ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ†ต๊ณ„์  ํ’ˆ์งˆ์˜ ์ผ๋ฐ˜์ ์ธ ์ธก์ • ํ•˜์—์„œ ๊นจ๋—ํ•œ ๊ฑด๊ฐ• ์ง„๋‹จ์„œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ตœ๊ทผ์—๋Š” PractRand๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 0.5 ํŽ˜ํƒ€ ๋ฐ”์ดํŠธ๊นŒ์ง€ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜์ด ์‹ค์—์„œ ๋‚˜์˜จ ๋ณ‘๋ฆฌํ•™์€ ์ €์™€ ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , " ๊ธ€์Ž„์š”, ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋งˆ์„ธ์š” "๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฒ”์šฉ PRNG์˜ ์š”์ ์€ ๊ฒฌ๊ณ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ž˜ํ•˜๊ณ  ์‹ถ์—ˆ์–ด์š” ...

๊ทธ๋ž˜์„œ ์•ฝ 25 ์ผ ์ „์— ์ €๋Š” PCG ์ œํ’ˆ๊ตฐ์˜ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์›์„ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณจ

๋‚ด ๋ชฉํ‘œ๋Š” ํ˜„์žฌ pcg64 ๋ณ€ํ˜•์„ ๋Œ€์ฒด ํ•  ์ˆ˜์žˆ๋Š” ์ƒˆ๋กœ์šด PCG ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด :

  • ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” XSL RR๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„ํŠธ๋ฅผ ์Šคํฌ๋žจ๋ธ”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๋ ‡๊ฒŒํ•˜๋ฉด์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
  • ์„ฑ๋Šฅ์€ ํ˜„์žฌ pcg64 ๋ณด๋‹ค ๋น ๋ฅด๊ฑฐ๋‚˜ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ๋””์ž์ธ์€ PCG ๋ฐฉ์‹์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์‚ฌ์†Œํ•˜๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์–ด์•ผํ•˜๋ฏ€๋กœ ์ถœ๋ ฅ ํ•จ์ˆ˜ ์ž‘์—…์˜ _any_๋ฅผ ์‰ฝ๊ฒŒ ์ทจ์†Œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค).

ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ตœ์ƒ์˜ ํ’ˆ์งˆ์„ ์–ป์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๋•Œ ์ ˆ์ถฉ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†๋„์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ถœ๋ ฅ ๊ธฐ๋Šฅ์— ๋” ๋งŽ์€ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋” ์‹ฌํ•˜๊ฒŒ ์Šคํฌ๋žจ๋ธ” ๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ PCG์˜ ์š”์ ์€ ๊ธฐ๋ณธ LCG๊ฐ€ "๊ฑฐ์˜ ์ถฉ๋ถ„"ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์นด์šดํ„ฐ๊ฐ€ 1 ์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ์ผ๋Ÿฌ

์„ฑ๊ณต์„๋ณด๊ณ ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค! ์•ฝ 25 ์ผ ์ „์— ์ฒ˜์Œ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ํœด๊ฐ€ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. 10 ์ผ ์ „์ฏค ๋Œ์•„ ์™”์„ ๋•Œ ์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์•„์ด๋””์–ด๋ฅผ ์‹œ๋„ํ•ด ๋ณด์•˜๊ณ  ์ž˜ ์ž‘๋™ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜์–ด ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์‹œ๊ฐ„์€ ๋Œ€๋ถ€๋ถ„ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ œ๋Š” C ++ ๋ฒ„์ „์˜ PCG์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ๋งŒํผ ๋งŒ์กฑ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ํฌ๊ธฐ์˜ ํ…Œ์ŠคํŠธ๋Š” XSL RR๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๊ณ  RXS M๊ณผ ๊ฒฝ์Ÿํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋” ํฐ ํฌ๊ธฐ์—์„œ ๋น›๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ชฉํ‘œ๋„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

์„ธ๋ถ€

FWIW์—์„œ ์ƒˆ๋กœ์šด ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (64 ๋น„ํŠธ ์ถœ๋ ฅ์˜ ๊ฒฝ์šฐ).

uint64_t output(__uint128_t internal)
{
    uint64_t hi = internal >> 64;
    uint64_t lo = internal;

    lo |= 1;
    hi ^= hi >> 32;
    hi *= 0xda942042e4dd58b5ULL;
    hi ^= hi >> 48;
    hi *= lo;
    return hi;
}

์ด ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” xorshift-multiply์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์Šน์ˆ˜์˜ ์„ ํƒ์€ (a) ๋งค์ง ์ƒ์ˆ˜์˜ ์ˆ˜๋ฅผ ๋‚ฎ์ถ”๊ณ  (b) ์ˆœ์—ด์ด ์ทจ์†Œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  (ํ•˜์œ„ ๋น„ํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด์—†๋Š” ๊ฒฝ์šฐ) ์ „์ฒด "๋ฌด์ž‘์œ„ ํ™”"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PCG ์ถœ๋ ฅ ๊ธฐ๋Šฅ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ–๋Š” ์ž์ฒด ํ’ˆ์งˆ.

๊ธฐํƒ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ

๋˜ํ•œ 0xda942042e4dd58b5 ์ด์ด PRNG (๋ฐ ๋ชจ๋“  cm_ ์ ‘๋‘์‚ฌ๊ฐ€์žˆ๋Š” 128 ๋น„ํŠธ ์ƒํƒœ PCG ์ƒ์„ฑ๊ธฐ)์— ๋Œ€ํ•œ LCG ์Šน์ˆ˜ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. 0x2360ed051fc65da44385df649fccf645 ์‚ฌ์šฉํ•˜๋Š” pcg64 ์™€ ๋น„๊ตํ•˜๋ฉด์ด ์ƒ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์ŠคํŽ™ํŠธ๋Ÿผ ํ…Œ์ŠคํŠธ ์†์„ฑ ์ธก๋ฉด์—์„œ ์ƒ๋‹นํžˆ ์ข‹์ง€๋งŒ 128 ๋น„ํŠธ ร— 64 ๋น„ํŠธ๊ฐ€๋ณด๋‹ค ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๊ณฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. 128 ๋น„ํŠธ ร— 128 ๋น„ํŠธ. ์ €๋Š”์ด LCG ์ƒ์ˆ˜๋ฅผ ๋ช‡ ๋…„ ๋™์•ˆ ๋ฌธ์ œ์—†์ด ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ €๋ ดํ•œ ์Šน์ˆ˜ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ช…๋ น ์ˆ˜์ค€์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต ํ›„ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๋ฐ˜๋ณต ์ „ ์ƒํƒœ์—์„œ ์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŒ…

์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธ (PractRand ๋ฐ TestU01)ํ–ˆ์œผ๋ฉฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—๋Š”์ด ์Šค๋ ˆ๋“œ์— ์„ค๋ช… ๋œ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ฐฑ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์  ์ธ ์ŠคํŒ€์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ 2 ^ 64๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ธํ„ฐ๋ฆฌ๋น™ โ€” ๋ฌธ์ œ์—†์ด 4 ๊ฐœ์˜ ๊ฐฑ๊ณผ 8192 ๊ฐœ์˜ ๊ฐฑ์„ 8TB๊นŒ์ง€ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ฒœ๊ณผ ๊ทธ ๋ฐ˜๋Œ€ํŽธ ๋•…์œผ๋กœ).

์†๋„

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

์œ ํšจ์„ฑ

C ++ ํ—ค๋” ์‚ฌ์šฉ์ž๋Š”์ด ์ƒˆ ํŒจ๋ฐ€๋ฆฌ ๊ตฌ์„ฑ์› _now_์— pcg_engines::cm_setseq_dxsm_128_64 ๋กœ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์–ธ์  ๊ฐ€๋Š” pcg64 ์„ pcg_engines::setseq_xsl_rr_128_64 ์—์„œ์ด ์ƒˆ๋กœ์šด ์ฒด๊ณ„๋กœ ์ „ํ™˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์˜ ํ˜„์žฌ ๊ณ„ํš์€ ์ด๋ฒˆ ์—ฌ๋ฆ„์— PCG 2.0 ๋ฒ„์ „ ๋ฒ”ํ”„์˜ ์ผ๋ถ€๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณต์‹ ๋ฐœํ‘œ

์ „๋ฐ˜์ ์œผ๋กœ ์ €๋Š”์ด ์ƒˆ๋กœ์šด ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด ๋งค์šฐ ๋งŒ์กฑํ•˜๋ฉฐ ์—ฌ๋ฆ„ ํ›„๋ฐ˜์—์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜์žˆ๋Š” ๋” ์ž์„ธํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์„ ํƒ ...

๋ฌผ๋ก  ์ด๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋“  ์•ˆํ•˜๋“ ๊ฐ„์—, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์†๋„ ๋ฒค์น˜ ๋งˆํฌ์—์„œ ๋” ๋‚˜์€์ง€ ๋‚˜์œ์ง€ ์‹ค์ œ๋กœ ๋งค์šฐ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  166 ๋Œ“๊ธ€

์ธํ…” Windows ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 128 ๋น„ํŠธ ์ •์ˆ˜์— ๋Œ€ํ•ด ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ? Windows์˜ MT1993์— ๋น„ํ•ด MSVC๋กœ PCG64 ์ปดํŒŒ์ผ์ด ์–ผ๋งˆ๋‚˜ ๋Š๋ฆฝ๋‹ˆ๊นŒ? ์ ํ”„ ์–ด๋“œ๋ฐด์Šค ๊ธฐ๋Šฅ์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ธํ…” Windows ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 128 ๋น„ํŠธ ์ •์ˆ˜์— ๋Œ€ํ•ด ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ?

์™„์ „ํžˆ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ICC๊ฐ€ ์ œ์•ฝ์„๋ฐ›๋Š” ABI ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ƒ์„ฑ ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์ด ์œ ์šฉํ•œ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. https://godbolt.org/z/kBntXH

์ ํ”„ ์–ด๋“œ๋ฐด์Šค ๊ธฐ๋Šฅ์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜คํžˆ๋ ค ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ข‹์€ ์ง€์ ์ด์ง€๋งŒ, ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ ˆ๋‹จ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ PRNG ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ "๊ณ ๊ธ‰"๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฌธ์„œํ™”์—†์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "ํ‘œ์ค€"์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์†๋„ ๋‚˜ ๊ธฐํƒ€ ์ด์œ ๋กœ ๊ธฐ๋Šฅ์ด ๋–จ์–ด์ง€๋Š” BitGenerator ๋กœ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ๋ฒฝ๋Œ ๋ฒฝ์— ๋ถ€๋”ช ํž ๊ฒƒ์ž…๋‹ˆ๋‹ค. No default ๋˜๋Š” MT19937 ์„ธ๊ณ„์—์„œ ๋„์„œ๊ด€์€ ํ•„์š”ํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ๋ฌธ์„œํ™” ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.

์†์— ์ฅ๊ณ ์žˆ๋Š” ์†์—, ๊ทธ ๊ฒฐ๊ณผ๋Š” ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ์ด์—†๋Š” BitGenerator ๋œ ๋ฐ”๋žŒ์งํ•˜๊ฒŒ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ฉฐ, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฐœ๋…์„ _do_ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค (์ˆœ์ „ํžˆ ๊ฐœ์ธ์ ์œผ๋กœ; NumPy-the-project๊ฐ€ ๊ทธ ๊ฐœ๋…์„ ๊ณต์œ ํ•˜๋„๋ก ํ•  ์˜๋ฌด). ์ฝ”๋“œ ์ค‘๊ฐ„์— .seed() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ๋‚จ์šฉ์„ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ถˆ์ดํ–‰์ด ์žˆ์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์˜ ํ–‰๋™์ด ํฌ๊ฒŒ ๋ฐ”๋€” ๊ฒƒ์ด๋ผ๋Š” ๊ฐœ๋…์— ๊ทผ๊ฑฐํ•œ ๋ชจ๋“  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์šฐ๋ ค๋Š” ์ƒ๋‹นํžˆ ์•ฝํ™” ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

Windows์˜ MT1993์— ๋น„ํ•ด MSVC๋กœ PCG64 ์ปดํŒŒ์ผ์ด ์–ผ๋งˆ๋‚˜ ๋Š๋ฆฝ๋‹ˆ๊นŒ?

@bashtage ๊ฐ€ #

์ธํ…” Windows ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 128 ๋น„ํŠธ ์ •์ˆ˜์— ๋Œ€ํ•ด ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ?

Clang, GCC ๋ฐ Intel ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 32 ๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ 64 ๋น„ํŠธ ์ •์ˆ˜๋ฅผ ๊ตฌํ˜„ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ 64 ๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ 128 ๋น„ํŠธ ์ •์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๊ฐ€ ํ•„์š”์—†๋Š” ๋ชจ๋“  ๋™์ผํ•œ ๊ธฐ์ˆ . Microsoft๋Š” MSVC์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง์ ‘ ์ง€์›ํ•˜๋Š” 128 ๋น„ํŠธ ์ •์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, MSVC ํ˜ธ์ถœ ์•„์›ƒ๊ณผ ๊ฐ™์€ ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ์˜ ๋‚ด์žฅ ํ•จ์ˆ˜์— ์˜ํ•ด # 13163 ์†์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” 128 ๋น„ํŠธ ์ˆ˜ํ•™ PCG64 ๊ธฐ์กด์˜ ๊ตฌํ˜„์„์œ„ํ•œ _umul128 x86_64์—์žˆ๋Š” (๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋˜ํ•œ ๊ฐ™์€ ๋™๋“ฑํ•œ ๋” ํœด๋Œ€์šฉ ์ธํ…” ๋‚ด์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•  ์ˆ˜ _mulx_u64 ๋Œ€์‹ )์„, ๋”ฐ๋ผ์„œ GCC, Clang ๋ฐ Intel ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šค์Šค๋กœ ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์„ ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Microsoft์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์ž˜ ์ตœ์ ํ™”ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ ์–ด๋„ ์ธ๋ผ์ธ ๋œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?). ์ˆ˜์ž‘์—…์œผ๋กœ ์ฝ”๋”ฉ ํ•œ ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ๋” ๋นจ๋ฆฌ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ ์ ˆํ•œ ์ˆ˜์ •์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„ˆ๋ฌด ๋‚˜์˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ ํ”„ ์–ด๋“œ๋ฐด์Šค ๊ธฐ๋Šฅ์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•ž์„œ๊ฐ€๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜ ์‹ ๋‹ค๋‹ˆ ๊ธฐ์˜์ง€๋งŒ ์™œ ๋„๋ฆฌ ์“ฐ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” distance ์ •๋ง ์ข‹์•„ํ•˜๋Š”๋ฐ ๋‘ ๊ฐœ์˜ PRNG๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. PCG์˜ C ++ ๋ฒ„์ „์—๋Š” ์žˆ์ง€๋งŒ C ๋ฒ„์ „์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ด€์‹ฌ.)

์•ž์„œ๊ฐ€๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜ ์‹ ๋‹ค๋‹ˆ ๊ธฐ์˜์ง€๋งŒ ์™œ ๋„๋ฆฌ ์“ฐ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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

Microsoft๋Š” MSVC์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง์ ‘ ์ง€์›ํ•˜๋Š” 128 ๋น„ํŠธ ์ •์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ๋ฐ”ํ€ด, OTOH๋ฅผ ํ•ด์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Windows์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Anaconda ๋˜๋Š” Enthought์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค Intel์„ ์‚ฌ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ •๋ง๋กœ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ Linux, Mac ๋˜๋Š” AIX์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ Microsoft๊ฐ€ ์šฐ๋ คํ•œ๋‹ค๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ํ˜„์ƒ๊ธˆ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FWIW, ๋‹ค์Œ์€ uint128_t ๋ฅผ uint64_t s์˜ ๊ตฌ์กฐ์ฒด๋กœ ํ’€๊ฑฐ๋‚˜ ๋‹ค์‹œ ์••์ถ•ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„ํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ clang ๊ฐ€ ์ค‘์š”ํ•œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ƒ์„ฑํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์ž…๋‹ˆ๋‹ค. https : // godbolt.org/z/Gtp3os

@rkern ๋งค์šฐ ๋ฉ‹์ง€๋‹ค. ์†์œผ๋กœ ์ž‘์„ฑํ•œ 128 ๋น„ํŠธ ์ฝ”๋“œ๋กœ MSVC๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@rkern ๋งค์šฐ ๋ฉ‹์ง€๋‹ค. ์†์œผ๋กœ ์ž‘์„ฑํ•œ 128 ๋น„ํŠธ ์ฝ”๋“œ๋กœ MSVC๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์–ด, ์˜ˆ์˜์ง€ ์•Š์•„์š”. ~ https://godbolt.org/z/a5L5Gz~

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. -O3 ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์œผ ์…จ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค : https://godbolt.org/z/yiQRhd

๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ธ๋ผ์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. /Ox (๋” ๋‚˜์€ ์˜ต์…˜์ด ์žˆ์„๊นŒ์š”?). ๋˜ํ•œ MSVC๊ฐ€ C ํšŒ์ „ ๊ด€์šฉ๊ตฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์žฅ ํšŒ์ „ ๋‚ด์žฅ ( _rotr64 )์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ์ผ์ข…์˜ ์—ด์ฐจ ์‚ฌ๊ณ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฝ๊ฐ„์˜์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋ฉด PCG64 ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•˜์—ฌ MSVC์—์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์™„์ „ํžˆ ๋‹นํ™ฉ์Šค๋Ÿฝ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ณ‘ํ•ฉํ•˜๋ ค๋ฉด ์ง€๊ธˆ์€ "๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ํ˜ธํ™˜์„ฑ์„ ๊นจ์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— (ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฆด๋ฆฌ์Šค ์ดํ›„์—๋„) ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ์ž์œ ๋กญ๊ฒŒ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ๋‚œ์ˆ˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

"์ด์ œ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง์„ ๋„˜์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? BitGenerator๊ฐ€ ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ๊ฒฝ์šฐ (๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—) ์ด์ œ ๋ชจ๋“  ์ •๊ตํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผํ•˜๋ฉฐ ์„ ํƒํ•œ ๋‰˜์•™์Šค๋ฅผ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ณ ). ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋ฉด ์ƒˆ ๊ธฐ๋ณธ๊ฐ’ ๋˜๋Š” ์ƒˆ ๋ฒ„์ „์ด ๋น„ํŠธ ์ŠคํŠธ๋ฆผ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๋„๋Ÿฝ๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๋‹จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„ํŠธ ์ŠคํŠธ๋ฆผ์ด ํ•ญ์ƒ ์ผ์ • ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •๊ณผ NumPy ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์ดํ•˜๋Š” ์ผ์„ ์•Œ๊ณ  ์žˆ๊ณ  ๊ธฐ๋ณธ๊ฐ’์ด ์ตœ๊ณ  ๋ธŒ๋žœ๋“œ ์—ฌ์•ผํ•œ๋‹ค๋Š” ๊ฐ€์ • ์‚ฌ์ด์—์„œ, ๋‘ ๋ฒˆ์งธ ๊ฐ€์ •์˜ ์ธก๋ฉด์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋ฅผ ๋Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์ดํ•˜๋Š” ์ผ์„ ์•Œ์•„์•ผํ• ์ง€ ๋ช…ํ™•ํžˆํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ๋‚œ์ˆ˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์šฐ๋ฆฌ๋Š” ์ตœ์†Œํ•œ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€์— ๊ด€๊ณ„์—†์ด ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋ฌธ์„œํ™” ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์ด์ œ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง์„ ๋„˜์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋ฌด์Šจ "๋ฌด์–ธ๊ฐ€"์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

"์ด์ œ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง์„ ๋„˜์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋ฌด์Šจ "๋ฌด์–ธ๊ฐ€"์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@mattip ์€ ๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„

์ด woudl์€ ๊ทธ๊ฒƒ์„ ์ฑ„ํƒํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๋ฏธ์น˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ผ๋ถ€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

g = Generator()
g.bit_generator.seed(1234)

๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๊ฑด์ „ํ•œ ์ผ์„ํ•˜๊ณ  ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด

Generator(BitGenerator(1234))

๊ทธ๋Ÿฌ๋ฉด ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IMO, ๊ธฐ๋ณธ ์„ ํƒ์„ ๊ณ ๋ คํ•  ๋•Œ ๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ์—์„œ ์น˜๋ช…์ ์ธ ๊ฒฐํ•จ์ด ๋ฐœ๊ฒฌ๋˜๊ฑฐ๋‚˜ ์ธํ…”์ด ์นฉ์— QUANTUM_NI๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌด์ž‘์œ„ ์„ฑ๋Šฅ์—์„œ ๋งŽ์€ OOM ๊ฐœ์„ ์„ ์ƒ์„ฑ ํ•  ๋•Œ๊นŒ์ง€ ์ˆ˜์ •๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ์•ฝ๊ฐ„์˜ ์™ธ๋ถ€์ธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์–ด๋–ค PRNG๊ฐ€ ๊ธฐ๋ณธ ์„ ํƒ์ธ์ง€ ์˜์›ํžˆ ๊ณ ์ •๋˜๊ณ  ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด, C ++์—์„œ std::default_random_engine ๋Š” ๊ตฌํ˜„์˜ ์žฌ๋Ÿ‰์ด๋ฉฐ ๋ฆด๋ฆฌ์Šค์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์˜คํžˆ๋ ค ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ๊ตฌํ˜„์ด ์กด์žฌํ•˜๋ฉด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : MT19937 _is_ MT19937, ๋‹ค๋ฅธ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•˜๋„๋ก ์กฐ์ •ํ•  ์ˆ˜ ์—†์Œ). [์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ตฌํ˜„์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.]

๊ธฐ๋ณธ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์† ์žฌ์ƒํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฆ„์œผ๋กœ ์ด์ „ ๊ธฐ๋ณธ๊ฐ’์„ ์š”์ฒญํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์ด์ „ ๋ฆด๋ฆฌ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์„ ํƒํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

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

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

(FWIW, ์ด๊ฒƒ์ด ์ œ๊ฐ€ PCG์—์„œ ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ PCG 32 ๋น„ํŠธ PRNG๋Š” ํ˜„์žฌ XSH-RR ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค [C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ pcg_setseq_64_xsh_rr_32_random_r ๋กœ ์•ก์„ธ์Šคํ•˜๊ณ  C ++์—์„œ pcg_engines::setseq_xsh_rr_64_32 ํด๋ž˜์Šค๋กœ ์•ก์„ธ์Šค) library], ๊ทธ๋Ÿฌ๋‚˜ ์›์น™์ ์œผ๋กœ ๋ฏธ๋ž˜ ๋ณด์žฅํ˜• ์žฌํ˜„์„ฑ์„ ์›ํ•  ๊ฒฝ์šฐ ๋ณ„์นญ ์ธ pcg32_random_r ๋˜๋Š” pcg32 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  XSH-RR์„ ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผํ•˜๋ฉฐ ์›์น™์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .)

์ •๋ง ์˜์›ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ (์ด ์ „์ฒด ํ”„๋กœ์ ํŠธ๋Š” ์•ฝ 14 ๋…„ ์ „์— ์ด๋ฃจ์–ด์ง„ ์‹ค์ œ์ ์ด๊ณ  ์ง„์‹คํ•˜๋ฉฐ ์˜์˜ˆ๋กœ์šด ์•ฝ์†์— ์˜ํ•ด 90 % ์ถ”์ง„๋จ), ๋ง์”€ํ•˜์‹  ๋ฐ”์™€ ๊ฐ™์ด ์ „ํ™˜์€ (a) ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์„ค๋“๋ ฅ์žˆ๋Š” ์ด์œ ์ด๋ฉฐ (b) ๊ฐ๊ฐ€ ์ƒ๊ฐ์ฃผ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด ์ตœ์†Œํ•œ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ์˜ค๋ฅธ์ชฝ์— ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜ค๋Š˜ ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ธˆ์ง€๋˜์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€๋Š” ๋™์ผํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋ฆด๋ฆฌ์Šค ํ›„ PRNG ์ฝ”๋“œ๋ฅผ logn์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, uint128์„ ์‚ฌ์šฉํ•˜๋Š” PRNG๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ MS๊ฐ€ uint128 ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ (์šฐ์—ฐํ•œ ๊ธฐํšŒ) ํ–ฅํ›„ ๋ฒ„์ „์—์„œ Win64 ์šฉ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

g = Generator()
g.bit_generator.seed(1234)

๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. @ eric-wieser์™€ ํ•จ๊ป˜ "๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์˜ต์…˜์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. "๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ๋‚œ์ˆ˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. . "

๊ธฐ๋ณธ๊ฐ’ ์—†์Œ๊ณผ ์นœ์ˆ™ํ•˜๊ณ  ์™„์ „ํžˆ ๊ฐ€์ •ํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์ด์—์„œ ์ €๋Š” ํ•ญ์ƒ ํ›„์ž๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ:

Generator() # OK
Generator(DefaultBitGenerator(seed)) # OK
Generator(seed) # error

_my_ ๊ธฐ๋ณธ ์„ค์ • :

Generator(1234) == Generator(DefaultBitGenerator(1234)
Generator(*args**kwargs) == Generator(DefaultBitGenerator(*args, **kwargs))

์ด์ œ๋Š” ์ด๊ฒƒ์ด ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ RandomState์˜ ์‚ฌ์šฉ์„ ์—ฐ์žฅํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ์„ ํƒํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ „๋ฌธ๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋„ค, ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” BitGenerator ๋ฅผ ์ด๋ฆ„ (์˜ˆ : MT19937 , PCG64 ๋“ฑ)์œผ๋กœ ์žก๊ณ  ์‹œ๋“œ๋กœ ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BitGenerator ๊ฐœ์ฒด๋Š” ๊ท ์ผ ํ•œ [0..1) float64 ๋ฐ ์ •์ˆ˜ (์žฌ๋ฏธ์žˆ๋Š” ์ ํ”„ ์–ด ํ—ค๋“œ / ์ŠคํŠธ๋ฆผ ๊ธฐ๋Šฅ ํฌํ•จ)๋ฅผ ๊ทธ๋ฆฌ๊ธฐ์œ„ํ•œ ์ œํ•œ๋œ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ต์‹ฌ ๊ท ์ผ PRNG ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [0..1) . ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•˜๊ณ ์žˆ๋Š” Generator ํด๋ž˜์Šค๋Š” ์ œ๊ณต๋œ BitGenerator ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋ชจ๋“  ๋น„ ๊ท ์ผ ๋ถ„ํฌ, ๊ฐ€์šฐ์‹œ์•ˆ, ๊ฐ๋งˆ, ์ดํ•ญ ๋“ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. BitGenerator ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์ŠคํŠธ๋ฆผ ํ˜ธํ™˜์„ฑ ๋ณด์žฅ. ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ (์ถœ์‹œ ํ•  ์ˆ˜์žˆ๋Š”) ์–ด๋–ค ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ํ•ต์‹ฌ ์งˆ๋ฌธ์€ "์ธ์ˆ˜๊ฐ€์—†๋Š” g = Generator() ์ฝ”๋“œ๋Š” ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ?"์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ PR์—์„œ ์ž„์˜์˜ ์ƒํƒœ (์˜ˆ : /dev/urandom ์™€ ๊ฐ™์€ ์ข‹์€ ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค์—์„œ ๊ฐ€์ ธ์˜ด)๋กœ Xoshiro256 BitGenerator ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. "๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์˜ต์…˜์€์ด๋ฅผ ์˜ค๋ฅ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” BitGenerator ์ด๋ฆ„์„ ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. @ eric-wieser์˜ ์š”์ ์€ "๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์ด ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค์˜ _safe_ ์˜ต์…˜์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์ดํ›„ ๋ฆด๋ฆฌ์Šค๋Š” ๊ธฐ์กด ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rkern , ์‹œ๋“œ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—”ํŠธ๋กœํ”ผ์—์„œ ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์ธ์ˆ˜๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š”๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( ๋‹ค๋ฅธ ์‹คํ–‰์€ ๋‹ค๋ฅธ ์”จ์•—์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋Œ€์กฐ์ ์œผ๋กœ @bashtage ๋Š” ์‹œ๋“œ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ์— ๊ด€์‹ฌ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@rkern , ์‹œ๋“œ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—”ํŠธ๋กœํ”ผ์—์„œ ์ž๋™ ์ƒ์„ฑ๋˜๋Š”

BitGenerator ์„ ๋งŒ๋“  ํ›„์— ๋‹ค์‹œ ์‹œ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Generator() ์ž‘๋™ํ•˜๋ฉด ์‹œ๋“œ ๋œ PRNG๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ @bashtage ์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด ๋‹ค์Œ ์ค„์— ์‹œ๋“œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

g = Generator()
g.bit_generator.seed(seed)

๊ทธ๊ฒƒ์€ ๋‹ค์†Œ ์ง€๋ฃจํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ Generator(PCG64(<seed>)) ์„ ํƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ œ์•ˆํ•œ ์ด์œ ๋Š” ํƒ€์ดํ•‘ ๋ฐฉ์‹๋งŒํผ์ด๋‚˜ ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @bashtage ๋Š” ์ถ”๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ ์ผ๋ถ€ ์ €ํ•ญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” "๋˜ํ•œ _ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์— ๊ธฐ๋ณธ ์„ค์ •์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๋ณธ๊ฐ’์€ ๋ฌด์—‡์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?"๋ผ๋Š” ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์งˆ๋ฌธ์ด ์šฐ๋ฆฌ ์•ž์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐฉํ˜• ๋””์ž์ธ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉฐ Generator(<seed>) ๋˜๋Š” Generator(DefaultBitGenerator(<seed>)) ๋Œ€ํ•œ @bashtage ์˜ ์ œ์•ˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค.

@bashtage ๋ฌธ์„œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ฆ‰, ๋งจ ์œ„์— " PCG64 ์€ (๋Š”) ์šฐ๋ฆฌ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ์ธ BitGenerator "์ด๊ณ  ๋ชจ๋“  ์˜ˆ์ œ์—์„œ ์ผ๊ด€๋˜๊ฒŒ Generator(PCG64(seed)) ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด (๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)?

๋‚˜๋Š” Generator(<seed>) ๋˜๋Š” g=Generator();g.seed(<seed>) ๋ณด๋‹ค default_generator(<seed>) _function_์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ •๋ง๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ๊นจ๋œจ๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด์ „ ๊ธฐ๋Šฅ์— ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค์— experimental ๋กœ ํ‘œ์‹œํ•˜์—ฌ ํ™•๊ณ ํ•œ ์•ฝ์†์„ํ•˜๊ธฐ ์ „์—์ด ์ธํ”„๋ผ๋ฅผ ์•ผ์ƒ์—์„œ ๋ณผ ์‹œ๊ฐ„์„์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

์ •์ˆ˜ ์‹œ๋“œ๋ฅผ Generator ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ์ง์ ‘ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์นœ์ˆ™ํ•˜๋‹ค๋Š” @bashtage์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : np.random.Generator(1234) . ๋ฌผ๋ก  ์ด๊ฒƒ์€ DefaultBitGenerator ํ•ฉ๋‹ˆ๋‹ค.

Generator ๋Œ€ํ•œ ๋ฌธ์„œ์—์„œ NumPy์˜ ๊ฐ ๊ณผ๊ฑฐ ๋ฒ„์ „์—์„œ ๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ „์ฒด ๊ธฐ๋ก์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ @imneme ์˜ ์ œ์•ˆ์ด๋ฉฐ ์žฌํ˜„์„ฑ ๋ชฉ์ ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(์ด์ „ ๋Œ“๊ธ€์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ฐฉ๊ธˆ ๋ณด์•˜์Šต๋‹ˆ๋‹ค)

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. -O3 ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์œผ ์…จ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค : https://godbolt.org/z/yiQRhd

MSVC์˜ ๊ฒฝ์šฐ -O3 ๊ฐ€ ์•„๋‹ˆ๋ผ /O2 ๋˜๋Š” /Ox (ํ•˜์ง€๋งŒ /O3 !).

Generator ๋Œ€ํ•œ ๋ฌธ์„œ์—์„œ NumPy์˜ ๊ฐ ๊ณผ๊ฑฐ ๋ฒ„์ „์—์„œ ๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ „์ฒด ๊ธฐ๋ก์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ @imneme ์˜ ์ œ์•ˆ์ด๋ฉฐ ์žฌํ˜„์„ฑ ๋ชฉ์ ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Generator / DefaultBitGenerator pickle์˜ protocol ์ธ์ˆ˜ ์™€ ๊ฐ™์€ ๋ช…์‹œ์ ์ธ version ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ np.random.Generator(123, version=1) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•˜์—ฌ "๋ฒ„์ „ 1"๋‚œ์ˆ˜ (๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“ ) ๋˜๋Š” np.random.Generator(123, version=np.random.HIGHEST_VERSION) (๊ธฐ๋ณธ ๋™์ž‘)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  / ๊ฐ€์žฅ ํฐ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ์›ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฒŒ ๋ญ๋“ ๊ฐ„์—).

์•„๋งˆ๋„ version=0 ๋Š” NumPy๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ MT19937 ์ด๊ณ  version=1 ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ . ๊ทธ๊ฒƒ์€ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๊ณ ๋ฅด ๋””์šฐ์Šค ๋งค๋“ญ์— ๋˜ ๋‹ค๋ฅธ ๋ฃจํ”„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ (์•Œ๋ ‰์‚ฐ๋” ์Šคํƒ€์ผ์˜ ํš์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋” ๋งŽ์ด ์ œ๊ณต๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค), ๊ทธ๊ฒŒ ์ œ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งํ•ด์•ผ ํ•  ์œ ์ผํ•œ ๋‚˜์œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๊ฒฐ์ •์„ ์‰ฝ๊ฒŒ _ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ต๊ณ„ ํ’ˆ์งˆ๊ณผ ์„ฑ๊ณผ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Generator / DefaultBitGenerator pickle ์™€ ๊ฐ™์€ ๋ช…์‹œ์ ์ธ version ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ํŒฌ์ด ์•„๋‹ˆ๋‹ค. pickle ์ผ€์ด์Šค์™€๋Š” ๋‹ฌ๋ฆฌ, ์ด๊ฒƒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฏธ ๊ตฌํ˜„ ๋œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ํŒฌ์ด ์•„๋‹ˆ๋‹ค. pickle ์ผ€์ด์Šค์™€๋Š” ๋‹ฌ๋ฆฌ, ์ด๊ฒƒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฏธ ๊ตฌํ˜„ ๋œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ NumPy ์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

  • np.random.Generator(seed, version=0) ๋Œ€ np.random.Generator(seed, version=1)
  • np.random.Generator(MT19937(seed)) ๋Œ€ np.random.Generator(PCG64(seed))

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ RNG ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ƒ๋Œ€์ ์ธ ์žฅ์ ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ๋ฅผ ์ฝ์ง€ ์•Š์•„๋„ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ version=1 (์ตœ์‹  ๊ธฐ๋ณธ๊ฐ’)๊ฐ€ version=0 ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์œผ๋กœ ์ถ”์ธก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ด๊ฒƒ์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

๋Œ€์กฐ์ ์œผ๋กœ MT19937 ๋ฐ PCG64 MT19937 ์™€ ๊ฐ™์€ ์ด๋ฆ„์€ ์ „๋ฌธ๊ฐ€ ๋˜๋Š” ์ด๋ฏธ ๋ฌธ์„œ๋ฅผ ์ฝ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :).

๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์•„๋ฌด๋„ ์ž์‹ ์ด _ ์›ํ•˜๋Š” version ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ๋ฒ„์ „์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณต์ œํ•˜๊ธฐ ์œ„ํ•ด _ ํ•„์š”ํ•œ _ version ๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ณต์ œํ•˜๋ ค๋Š” ๊ฒฐ๊ณผ์— ์‚ฌ์šฉ ๋œ ํŠน์ • ๊ฐ’์„ ํ•ญ์ƒ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์•”์‹œ ์ ์œผ๋กœ ํ—ˆ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•”์‹œ ์ ์œผ๋กœ). ์—ฌ๋Ÿฌ ๊ฐ’ ๊ฐ„์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ์ถ”๋ก  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด์จŒ๋“ , ๊ทธ ์ˆ˜์ค€์˜ ๊ต์ฐจ ๋ฆด๋ฆฌ์Šค ์žฌํ˜„์„ฑ์€ ์šฐ๋ฆฌ๊ฐ€ NEP 19 ์—์„œ ๋ถ€์ธ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌํŒ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ ์—ฌ๊ธฐ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ :

  • 99.9 %์˜ ์‚ฌ์šฉ์ž๋Š” ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๊ด€์‹ฌ์ด ์—†๊ฑฐ๋‚˜ ์•Œ๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‚œ์ˆ˜ ๋งŒ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•ด ๋…๋‹จ์  ์ธ ์„ ํƒ์„ํ•˜๋ ค๋ฉด +1์„ํ•˜์„ธ์š”. ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • dSFMT ์€ ๋‹จ์ˆœํžˆ MT19937 ๋ณด๋‹ค ๋น ๋ฅธ ๋ฒ„์ „ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๋ฌธ์„œ์— "SSE2"๋ฅผ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์ œ๊ฑฐํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”?). ์–ด์จŒ๋“  ๋น„ํŠธ ์ŠคํŠธ๋ฆผ ์žฌํ˜„์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ์ƒํƒœ ์ฐจ์ด๋Š” ๊ทธ๋‹ค์ง€ ํฅ๋ฏธ๋กญ์ง€ ์•Š์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์šฐ์Šน ํ•œ ์ฃผ์žฅ์ด "๊ธฐ์‚ฌ ๊ฒ€ํ†  ์ค‘์— ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ"๋ผ๊ณ ํ•˜๋”๋ผ๋„ dSFTM ๋ณด๋‹ค MT19937 ์„ ํ˜ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .
  • ์„ฑ๋Šฅ์€ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์˜ ์ƒ๋‹น ๋ถ€๋ถ„์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ์˜ ํ†ต๊ณ„์  ์†์„ฑ์€ _ ๋งค์šฐ _ ์†Œ์ˆ˜์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ ๋œ ๋ชจ๋“  ์ƒ์„ฑ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ์„ ํƒํ•˜๋ ค๋ฉด +1ํ•˜์‹ญ์‹œ์˜ค.

์ฃ„์†กํ•˜์ง€๋งŒ Windows์—์„œ๋Š” 32 ๋น„ํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. https://github.com/pypa/manylinux/issues/118#issuecomment -481404761 ์ฐธ์กฐ

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

๋‚˜๋Š” ๋” ๋น ๋ฅธ ์ตœ์ฒจ๋‹จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์—ญ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ฒ•์˜ํ•™ ๋ฐ ํ† ๋ก ์€ https://arxiv.org/pdf/1810.10985.pdf๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ต๊ณผ์„œ๋Š” ๋ฌผ์งˆ์  ์˜ค๋ฅ˜ [20, 7, 2, 16, 15]๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ IIDU [0,1) ๋ณ€์ˆ˜๋ฅผ PRNG๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•”์‹œ ์  ๋˜๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š”์ด ๊ฐ€์ •์ด MATLAB, Python์˜ ์ž„์˜ ๋ชจ๋“ˆ, R, SPSS ๋ฐ Stata๋ฅผ ํฌํ•จํ•˜์—ฌ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งŽ์€ ํ†ต๊ณ„ ํŒจํ‚ค์ง€์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@kellieotto , @pbstark- ์ˆœ์—ด ๋ฐ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ์— ๋Œ€ํ•œ ์ตœ์ƒ์˜ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์„œ ์„ ํƒํ•ด์•ผํ•˜๋Š” PRNG์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„์—์„œ ๋ฆฌ์ƒ˜ํ”Œ๋ง ๋ฐฉ๋ฒ•์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํฐ ๋ณ€ํ™”๋ฅผ ๊ฒช๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ†ต๊ณ„์  ์†์„ฑ์— ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ์ด ์ผ๋ถ€ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๊ด€๋ จ์ด์žˆ๋Š” ํ•œ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๊ธฐ๋˜๋Š” ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ๋งค์šฐ ํ•™๋ฌธ์ ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ฒ•์˜ํ•™ ๋ฐ ํ† ๋ก ์€ https://arxiv.org/pdf/1810.10985.pdf๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ธฐ์‚ฌ์ž…๋‹ˆ๋‹ค. R, Python stdlib & co์™€๋Š” ๋‹ฌ๋ฆฌ NumPy๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (9 ํŽ˜์ด์ง€ ์ƒ๋‹จ)์— ๋Œ€ํ•œ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค.

๋…ผ๋ฌธ๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ œ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ๋„ ์–ด๋Š ์‹œ์ ์—์„œ ๊ณ ์žฅ ๋‚˜๋ฉด ์–ธ์ œ์ž…๋‹ˆ๊นŒ? ~ 17 ์–ต ๊ฐœ์˜ ์ƒ˜ํ”Œ์„ ๊ทธ๋ฆด ๋•Œ 40 % ์ง์ˆ˜์™€ 60 % ํ™€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” R์˜ sample ํ•จ์ˆ˜์™€ ๊ฐ™์€ ์˜ˆ. ์—ฌ๊ธฐ์„œ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ / ๋ฆฌ์ƒ˜ํ”Œ๋ง์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

R (3.6)์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋Š” ์ž๋ฅด๊ธฐ ๋Œ€ ์ž„์˜ ๋น„ํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
์ž„์˜์˜ ์ •์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Mersenne Twister๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ PRNG.

@Kellie Ottoboni [email protected] ์™€ ๊ธฐ๋ณธ PRNG๊ฐ€
๊ณผํ•™์  ์–ธ์–ด ๋ฐ ํ†ต๊ณ„ ํŒจํ‚ค์ง€๋Š” ์•”ํ˜ธํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋ณด์•ˆ (CS-PRNG, ์˜ˆ : ์นด์šดํ„ฐ ๋ชจ๋“œ์˜ SHA256), ๋‚™ํ•˜ ์˜ต์…˜ ํฌํ•จ
๋” ๋น ๋ฅด์ง€ ๋งŒ ํ’ˆ์งˆ์ด ๋‚ฎ์€ ๊ฒƒ์œผ๋กœ ๋Œ์•„ ๊ฐ€๊ธฐ (์˜ˆ : Mersenne Twister)
์†๋„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ.

์šฐ๋ฆฌ๋Š” Python ์šฉ CS-PRNG๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/statlab/cryptorandom

์„ฑ๋Šฅ์€ (์•„์ง) ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ์œ ํ˜• ๋ณ€ํ™˜ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ ๋‚ด์—์„œ ์ด์ง„ ๋ฌธ์ž์—ด (ํ•ด์‹œ ์ถœ๋ ฅ)์„ ์ •์ˆ˜๋กœ ์บ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š”
๋” ๋งŽ์€ ์ž‘์—…์„ C๋กœ ์˜ฎ๊ธฐ๋Š” ๊ตฌํ˜„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ,
ํ•„๋ฆฝ

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ ์˜ค์ „ 6:27 Ralf Gommers [email protected]
์ผ๋‹ค :

ํ†ต๊ณ„์  ์†์„ฑ์— ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ฆฌ์ƒ˜ํ”Œ๋ง ๋ฐฉ๋ฒ•์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํฌ๊ฒŒ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ
๋ฐ์ดํ„ฐ ๋ถ„์„

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ์ด ์‹ค์ œ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ์ด์žˆ๋Š” ํ•œ
๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๊ธฐ๋˜๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•ญ์ƒ ๋งค์šฐ ํ•™๋ฌธ์ ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ฒ•์˜ํ•™ ๋ฐ ํ† ๋ก ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://arxiv.org/pdf/1810.10985.pdf

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ธฐ์‚ฌ์ž…๋‹ˆ๋‹ค. NumPy๊ฐ€ ์œ ์ผํ•œ
R, Python stdlib & co์™€๋Š” ๋‹ฌ๋ฆฌ ์˜ฌ๋ฐ”๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (9 ํŽ˜์ด์ง€ ์ƒ๋‹จ).

๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ œ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ข…์ด. ํ˜„์žฌ ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ๋„ ์–ด๋Š ์‹œ์ ์—์„œ ๊ณ ์žฅ ๋‚˜๋ฉด
๊ทธ๊ฒŒ ์–ธ์ œ ์•ผ? 40 % ์ง์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” R์˜ ์ƒ˜ํ”Œ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ์˜ˆ
17 ์–ต ๊ฐœ์˜ ์ƒ˜ํ”Œ์„ ๊ทธ๋ฆด ๋•Œ ์ˆซ์ž ๋ฐ 60 % ํ™€์ˆ˜. ๋ฌด์—‡์ž…๋‹ˆ๊นŒ
์—ฌ๊ธฐ์—์„œ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ / ๋ฆฌ์ƒ˜ํ”Œ๋ง์— ํ•ด๋‹นํ•ฉ๋‹ˆ๊นŒ?

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWJEIA4CTLLHVGZVKBLPXPOUFA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVZLOBW63LNODWcomW2ZLOBW63LNODWcomW2ZLOBW63LNODWcomWXHJKTY
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWJW445QDPGZDGXMPA3PXPOUFANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

์„ฑ๋Šฅ์€ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์˜ ์ƒ๋‹น ๋ถ€๋ถ„์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ์˜ ํ†ต๊ณ„์  ์†์„ฑ์€ _ ๋งค์šฐ _ ์†Œ์ˆ˜์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ ๋œ ๋ชจ๋“  ์ƒ์„ฑ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ์„ ํƒํ•˜๋ ค๋ฉด +1

์ฒซ์งธ, "๊ฐ€์žฅ ๋น ๋ฅธ"๊ฒƒ์„ ์„ ํƒํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. @bashtage ๋Š” # 13163์˜ ํ˜„์žฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‹คํ–‰ ํ–ˆ์œผ๋ฉฐ์ง€๋„ ์ „์ฒด์—์„œ dSFMT๊ฐ€ Windows์—์„œ ์Šน๋ฆฌํ•˜๊ณ  Linux์—์„œ PCG-64 ๋ฐ Xoroshiro 256์— ์˜ํ•ด ํฌ๊ฒŒ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ชจ๋‘ ๋™์ผํ•œ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ๊ฐ€์ง„ ๋™์ผํ•œ ๋จธ์‹ ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ (X86 ๋‚ด์˜ ์ˆ˜์ • ๋ฒ„์ „ ํฌํ•จ)๋„ ๋‹ค๋ฅธ ๋ฒค์น˜ ๋งˆํฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฐจ์ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ ๋…ผ์˜ํ–ˆ๋“ฏ์ด PCG๋Š” MSVC ๋ฌธ์ œ๋กœ ์ธํ•ด Windows ๋ฒค์น˜ ๋งˆํฌ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MSVC๊ฐ€ ๊ฐœ์„ ๋˜๊ฑฐ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์‹œ์ ์ธ ๋ฌธ์ œ ์ผ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์œ ์‚ฌํ•œ MSVC ๋ฌธ์ œ๊ฐ€ Xoshiro์˜ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋งž์•˜๋‹ค.)

๋˜ํ•œ ์†๋„์— ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ "์ƒ๋‹น์ˆ˜"๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฐ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ์ž์ฒด๋Š” ํ‰๊ท ์ ์œผ๋กœ C๋ณด๋‹ค ์•ฝ 50 ๋ฐฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค . NumPy ์‚ฌ์šฉ์ž ์ค‘ ๋ช‡ ๋ถ„์˜ 1์ด PyPy์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ (4 ๋ฐฐ์˜ ์†๋„ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•จ)? ํ™•์‹คํžˆ ์ผ๋ถ€๋Š” ์žˆ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ๋†’์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋“  ๊ฐ€๋ณ€์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ์†๋„์— ๊ด€์‹ฌ์ด์žˆ๋Š” "์ค‘์š”ํ•œ ๋ถ€๋ถ„"์— ๋Œ€ํ•ด ๋ˆ„๊ฐ€ ๊ธฐ๋ณธ PRNG๊ฐ€ ํ•ด๋‹น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ท€ํ•˜์˜ ๋ง์„ ๋ฐ›์•„๋“ค์ด๊ฒ ์Šต๋‹ˆ๊นŒ? ํ•  ์ˆ˜์žˆ๋Š” ํ˜„๋ช…ํ•œ ์ผ์€ (๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๊ฝค ์žฌ๋ฏธ ์žˆ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์˜ ์†์ด ๋‹ฟ๋Š” ๋ฒ”์œ„ ๋‚ด์—์„œ) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ PRNG๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ณ  ์–ด๋–ค ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

ํฌํ•จ ๋œ ๋ชจ๋“  PRNG๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ ์ƒ๋‹นํžˆ ๋‚ฎ์€ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. Unix ์‹œ์Šคํ…œ์—๋Š” ํ†ต๊ณ„์ ์œผ๋กœ ๋ชจ๋‘ ๋”์ฐํ•œ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ PRNG๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์ „ ์„ธ๊ณ„๊ฐ€ ์ถ•์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ์ˆ˜๋…„ ๋™์•ˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ†ต๊ณ„์  ์†์„ฑ ์™ธ์—๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋ฅด์ง€๋งŒ ์›ํ•˜๋Š” ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ PRNG ์ œ๊ณต ์—…์ฒด๋กœ์„œ ์ €๋Š” ์‚ฌ์†Œํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ PRNG์˜ ๋ช‡ ๊ฐ€์ง€ ์ถœ๋ ฅ์„๋ณด๊ณ  ํ–ฅํ›„ ๋ชจ๋“  ์ถœ๋ ฅ์ด ๋ฌด์—‡์ธ์ง€ ๋งํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. NumPy๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œํ€€์Šค๋ฅผ ์‰ฝ๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜์žˆ๋Š” ๊ณต๊ฒฉ์ž๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๋Š” ํ†ต๊ณ„๋ฅผํ•˜๊ธฐ ์œ„ํ•ด NumPy๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ด์ „์— PRNG๋ฅผ ๋ฐœ๊ฒฌ ํ•œ ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€์—์„œ NumPy์˜ PRNG๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” PRNG๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜์žˆ๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜์žˆ๋Š” ์‹ค์ œ ์ ๊ณผ ๋งˆ์ฃผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ดํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด ํ™•๊ณ ํ•˜๊ฒŒ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋น„์šฉ (์˜ˆ : ์ƒ๋‹นํ•œ ์†๋„ ์†์‹ค)์„ ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†์ง€๋งŒ ์ ๋‹นํ•œ ๋ณดํ—˜์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ฒ•์˜ํ•™ ๋ฐ ํ† ๋ก ์€ https://arxiv.org/pdf/1810.10985.pdf๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ต๊ณผ์„œ๋Š” ๋ฌผ์งˆ์  ์˜ค๋ฅ˜ [20, 7, 2, 16, 15]๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ IIDU [0,1) ๋ณ€์ˆ˜๋ฅผ PRNG๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•”์‹œ ์  ๋˜๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š”์ด ๊ฐ€์ •์ด MATLAB, Python์˜ ์ž„์˜ ๋ชจ๋“ˆ, R, SPSS ๋ฐ Stata๋ฅผ ํฌํ•จํ•˜์—ฌ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งŽ์€ ํ†ต๊ณ„ ํŒจํ‚ค์ง€์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

FWIW, @lemire ๊ฐ€ ํŽธ๊ฒฌ์—†์ด ๋ฒ”์œ„ ๋‚ด์—์„œ ์ˆซ์ž๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ๋…ผ๋ฌธ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‚ด ๊ธฐ์‚ฌ ์—์„œ๋„ ๋ช‡ ๊ฐ€์ง€ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ์ถœ๋ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. (64 ๋น„ํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ Lemire์˜ ๋ฐฉ๋ฒ•์€ MSVC ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ์นœ์ˆ™ํ•œ ๋ฌธ์ œ์™€ ํ•จ๊ป˜ ๋Š๋ฆฐ 64 ๋น„ํŠธ ๋ถ„ํ• ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด 128 ๋น„ํŠธ ๊ณฑ์…ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

@pbstark @kellieotto arXiv์— ์˜ฌ๋ผ ์™”์„ ๋•Œ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ๋‹น์‹ ์˜ ๋…ผ๋ฌธ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. BIDS์—์žˆ๋Š” ์นœ๊ตฌ๋“ค์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”๋ฐ ๊ทธ๋“ค์€ ๋‹น์‹ ์˜ ์ผ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ๋ก  ์„น์…˜์—์„œ๋Š” "์ง€๊ธˆ๊นŒ์ง€ MT19937์— ๋Œ€ํ•ด O (10 ^ 5) ๋ณต์ œ์—์„œ ํƒ์ง€ ๋ ๋งŒํผ ํฐ ์ผ๊ด€๋œ ํŽธํ–ฅ์„ ๊ฐ€์ง„ ํ†ต๊ณ„๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์ฐพ์•˜๋‚˜์š”? PCG64์™€ ๊ฐ™์€ 128 ๋น„ํŠธ ์ƒํƒœ PRNG์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์ ์–ด๋„ ๋ฒ”์šฉ ๊ธฐ๋ณธ๊ฐ’์„ ์„ ํƒํ•  ๋ชฉ์ ์œผ๋กœ์ด ๊ณ ๋ ค ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ (IMO)์„ ๋Šฅ๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜์žˆ๋Š” ์‹ค์šฉ์ ์ธ ๊ด€๋ จ์„ฑ์˜ ํ•ฉ๋ฆฌ์ ์ธ ์ž„๊ณ„ ๊ฐ’ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด PRNG ํ”„๋ ˆ์ž„ ์›Œํฌ # 13163์˜ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์€ ๋ˆ„๊ตฌ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ์ž์‹ ์˜ BitGenerator ์„ (๋ฅผ) ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•”ํ˜ธ. C์—์„œ cryptorandom ๋ฅผ BitGenerator ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋‹ค๋ฅธ ์˜ต์…˜๊ณผ ์ •๋ฉด์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์†๋„์— ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ๋งŽ์€ ๋งˆ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค (์—ฌ๊ธฐ์—๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๋Š” ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผํ•˜๋ฉฐ, ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๊ฒƒ์ด ์•”ํ˜ธํ™”๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ชฉ์ ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋ฌธ์„œ์—์„œ ์ด์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ). ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์†๋„๋ฅผ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ์†”์งํžˆ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
Numpy๊ฐ€ ์ž˜ ํ•œ ๊ทธ ๊ธฐ์‚ฌ๋Š” ํฅ๋ฏธ๋กœ์›Œ ๋ณด์ด์ง€๋งŒ (์•„๋งˆ๋„ Robert๊ฐ€ ์ œ๋Œ€๋กœ ๋œ ๊ฒƒ์— ๋Œ€ํ•ด ์ฐฌ์‚ฌ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค!), ์‹ค์ œ๋กœ๋Š” ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์•„๋‹Œ ์ƒ˜ํ”Œ๋Ÿฌ์ž…๋‹ˆ๋‹ค.

@pbstark ์•„๋งˆ๋„ ์ด๊ฒƒ์„ numpy / randomgen๊ณผ ํ˜ธํ™˜๋˜๋Š” BitGenerator๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ทธ ๊ฐ€๋Šฅ์„ฑ์ด ๋ชจ๋‘ ๊ทธ๊ฒƒ์„ ์†๋„๋ฅผ ํ›จ์”ฌ ๋” ์œ ์šฉํ•œ ํ˜•ํƒœ๋กœ ํญ ๋„“์€ ๊ด€๊ฐ๋“ค์—๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ• ์ผ ์ˆ˜์žˆ๋‹ค. ๋‹น์‹ ๊ณผ Kellie Ottoboni๊ฐ€ ๋ฒ„ํด๋ฆฌ์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์šฐ๋ฆฌ๊ฐ€ ์‹œ๊ฐ„์„ ๋‚ด์„œ ๋งŒ๋‚  ์ˆ˜ ์žˆ์„๊นŒ์š”? (๋‹จ์ง€ ์ œ์•ˆ, ๋จผ์ € ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค).

_Random Sampling : Practice Makes Imperfect_ ๋…ผ๋ฌธ์— ๊ด€ํ•ด์„œ๋Š” ์ฝ๊ธฐ๋„ ์ข‹์ง€๋งŒ 100 ๋…„ ๋™์•ˆ ๋‚˜๋…ธ ์ดˆ๋‹น 1 ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” 1 ์กฐ ๊ฐœ์˜ ์ฝ”์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด 2 ^ 102 ๊ฐœ ๋ฏธ๋งŒ์˜ ์ˆซ์ž๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์†Œํ•˜๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜์žˆ๋Š” PRNG (Mersenne Twister์™€ ๊ฐ™์€ ํฐ ์ƒํƒœ ๊ณต๊ฐ„์ด์žˆ๋Š” PRNG)์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ํŠน์ • ์ถœ๋ ฅ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ ํ•  ์‹œ๋“œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ดด๋กœ์›€์„ ๋Š๋‚๋‹ˆ๋‹ค). ), ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์†Œํ•˜๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜์—†๋Š” ๋‹ค๋ฅธ PRNG์˜ ๊ฒฝ์šฐ ์–ด๋–ค ์ถœ๋ ฅ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์ƒ์„ฑ ๋  ์ˆ˜ ์—†๋Š”์ง€, ์–ด๋–ค ์ถœ๋ ฅ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์žˆ๋Š”์ง€ (์‰ฝ๊ฒŒ) ์•Œ ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ์ฐพ์„ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์•„์‹œ๋‹ค์‹œํ”ผ, 2 ^ 80 ์ถœ๋ ฅ ๋‚ด์—์„œ _Twelth Night_๊ฐ€ ํฌํ•จ ๋œ zip ํŒŒ์ผ์„ ๋ฑ‰์–ด ๋‚ผ ์ˆ˜์žˆ๋Š” PRNG ๊ฐ€ ์žˆ์ง€๋งŒ ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค.)

์ •๋ง๋กœ cryptoprng๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์ตœ์‹  ํ•˜๋“œ์›จ์–ด์—์„œ ์œ ์ผํ•œ ์„ ํƒ์€
์ „์šฉ ๋ช…๋ น์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— AES. @lemire ์—๋Š” ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ https://github.com/lemire/testingRNG/blob/master/source/aesctr.h
๋น„ ์•”ํ˜ธํ™” ์ƒ์„ฑ๊ธฐ๋งŒํผ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ฐˆ ์ˆ˜์žˆ๋Š” ChaCha20๋„ ์žˆ์Šต๋‹ˆ๋‹ค
SIMD๋กœ ๋น ๋ฅด๊ฒŒ. ๋‘˜ ๋‹ค ์˜ค๋ž˜๋œ ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ThreeFry์™€
Philox๋Š” ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ cryptolite ์นด์šดํ„ฐ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค.

IMO ์•”ํ˜ธํ™”๋Š” ๋น„์šฉ ์ด์  ์ธก๋ฉด์—์„œ ๊ณผ๋Œ€ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅธ๋‹ค
Mt์˜ PRNG ๋ฌธ์ œ๋กœ ์ธํ•ด ์ค‘์š”ํ•œ ํ›„ํ‡ด๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
10e6 ์ถœํŒ ๋œ ๋…ผ๋ฌธ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณธ ์œ ์ผํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ
PRNG๊ฐ€ ์ •๋ง ๋ฌธ์ œ๊ฐ€ ๋œ ๊ณณ์€ ๊ทธ ๊ธฐ๊ฐ„์ด
๋ฐœ์ „๊ธฐ๊ฐ€ ์ „์ฒด ์‚ฌ์ดํด์„ ์™„๋ฃŒ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋„ ์œ ์ผํ•œ
ํšจ๊ณผ๋Š” ์—ฐ๊ตฌ์˜ ํ‘œ๋ณธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๊ฐ„์ด ๋” ๊ธด ์‹œ์Šคํ…œ์—์„œ ๋‹ค์‹œ ์‹คํ–‰๋˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ 19:50 Robert Kern [email protected] ์ž‘์„ฑ :

@pbstark https://github.com/pbstark @kellieotto
https://github.com/kellieotto ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋…ผ๋ฌธ์„ ํฅ๋ฏธ๋กญ๊ฒŒ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.
arXiv์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. BIDS์—์„œ ์นœ๊ตฌ๋“ค์„ ๋งŒ๋‚˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ
๋‹น์‹ ์˜ ์ผ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ๋ก  ์„น์…˜์—์„œ๋Š” "์ง€๊ธˆ๊นŒ์ง€๋Š”
์ผ๊ด€๋œ ํŽธํ–ฅ์ด ๊ฐ์ง€ ๋ ๋งŒํผ ํฐ ํ†ต๊ณ„๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
O (10 ^ 5) replications "for MT19937. ์•„์ง ํ•˜๋‚˜๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?
PCG64์™€ ๊ฐ™์€ 128 ๋น„ํŠธ ์ƒํƒœ PRNG์˜ ๊ตฌ์ฒด์ ์ธ ์˜ˆ? ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ณด์ธ๋‹ค
์‹ค์šฉ์ ์ธ ๊ด€๋ จ์„ฑ์˜ ํ•ฉ๋ฆฌ์ ์ธ ์ž„๊ณ„ ๊ฐ’์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ ์–ด๋„ ์„ ํƒ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ (IMO)๋ณด๋‹ค ์ค‘์š”ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฒ”์šฉ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด PRNG ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ # 13163
https://github.com/numpy/numpy/pull/13163 ์€ ๋ˆ„๊ตฌ๋‚˜
ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๊ฝ‚์„ ์ˆ˜์žˆ๋Š” ์ž์ฒด BitGenerator๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ๋žŒ๋“ค์ด numpy ์ฝ”๋“œ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด numpy์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š”
C์—์„œ BitGenerator๋กœ cryptorandom ๊ตฌํ˜„์„ ์‚ดํŽด ๋ณด๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์˜ต์…˜๊ณผ ์ •๋ฉด์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRO5PKW4MRFSBGUFUNTPXQUOLA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMWW2ZLOBW63LNMWVXHJKissue ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABKTSRMRIHC4OYDR52HLTHDPXQUOLANCNFSM4HPX3CHA
.

๋˜ํ•œ ์†๋„์— ๊ด€์‹ฌ์ด์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ "์ƒ๋‹น์ˆ˜"๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฐ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. Python ์ž์ฒด๋Š” ํ‰๊ท ์ ์œผ๋กœ C๋ณด๋‹ค ์•ฝ 50 ๋ฐฐ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค. NumPy ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜ ์ค‘ ๋ช‡ ๋ถ„์˜ 1์ด PyPy์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๊นŒ (4 ๋ฐฐ ์†๋„ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•จ)? ํ™•์‹คํžˆ ์ผ๋ถ€๋Š” ์žˆ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ๋†’์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค :) NumPy๋Š” ๋Œ€๋ถ€๋ถ„ ๋‚ด๋ถ€์ ์œผ๋กœ C์ด๊ณ , C์—์„œ ๋‹น์‹  ์ž์‹ ์˜ ์ผ์„ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๋น ๋ฅด๋‹ค. ๋˜ํ•œ PyPy๋Š” ๊ณผํ•™์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„์œ„ํ•œ ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๋Š๋ฆฝ๋‹ˆ๋‹ค (NumPy๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” CPython API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ œํ•œ๋˜์–ด JIT์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

์–ด๋Š ์ชฝ์ด๋“  ์ด๊ฒƒ์€ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†๋„ ๋ฌธ์ œ๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@imneme ์šฐ๋ฆฌ๋Š” ์ œํ•œ๋œ ์ •์ˆ˜์— lemires ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ดํ›„
๋ ˆ๊ฑฐ์‹œ ๋‚˜ ๊ฐ๊ฐ€ ์ƒ๊ฐ์—†์ด ์ƒˆ๋กœ์šด ์‹œ์ž‘
์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ 19:46 imneme [email protected] ์ž‘์„ฑ :

์ผ๋ถ€ ๋ฒ•์˜ํ•™ ๋ฐ ํ† ๋ก ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://arxiv.org/pdf/1810.10985.pdf

๊ต๊ณผ์„œ๋Š” PRNG๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•”์‹œ ์  ๋˜๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์žฌ๋ฃŒ๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ IIDU [0,1) ๋ณ€์ˆ˜๋กœ ๋Œ€์ฒด
์˜ค๋ฅ˜ [20, 7, 2, 16, 15]. ์šฐ๋ฆฌ๋Š”์ด ๊ฐ€์ •์ด
MATLAB์„ ํฌํ•จํ•˜์—ฌ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งŽ์€ ํ†ต๊ณ„ ํŒจํ‚ค์ง€์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜,
Python์˜ ์ž„์˜ ๋ชจ๋“ˆ, R, SPSS ๋ฐ Stata.

FWIW, @lemire์˜ ๋ฉ‹์ง„ ์ข…์ด https://arxiv.org/abs/1805.10941
https://github.com/lemire ๋ฒ”์œ„์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ˆซ์ž ์ƒ์„ฑ
ํŽธ๊ฒฌ์—†์ด. ์ €๋Š” ๊ทธ๊ฒƒ์„ ํƒํ—˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ์ถœ๋ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ๊ธฐ์‚ฌ์—์„œ๋„ ๋ฒค์น˜ ๋งˆํฌ
http://www.pcg-random.org/posts/bounded-rands.html (์ƒ์„ฑ์‹œ
64 ๋น„ํŠธ, Lemire์˜ ๋ฐฉ๋ฒ•์€ ๋Š๋ฆฐ ์†๋„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด 128 ๋น„ํŠธ ๊ณฑ์…ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
MSVC์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ์นœ์ˆ™ํ•œ ๋ฌธ์ œ๋ฅผ ํฌํ•จํ•œ 64 ๋น„ํŠธ ๋ถ„ํ• 
์‚ฌ์šฉ์ž.)

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKNAQAK4WIXG5SVLO3PXQUA3A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVRWSG43VMVLOBW63LNODW96284ZLOBW63LNODVXHJK
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABKTSRKV3KYKRLNMBKNU4JLPXQUA3ANCNFSM4HPX3CHA
.

์šฐ๋ฆฌ๋Š” _safe_ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผํ•˜๋ฉฐ ํ˜„์žฌ ๊ฐ€์žฅ ์ข‹์€ ์ถ”์ธก์€ ์ด๊ฒƒ์ด ์•”ํ˜ธํ™”๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ชฉ์ ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋…ผ์Ÿํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚ด ์งˆ๋ฌธ์€-๋ฌด์—‡์ด ์•ˆ์ „ํ•œ๊ฐ€์š”? ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ๊ฐ€์ง„ ์ค€ ๋ฌด์ž‘์œ„์„ฑ์˜ ์ •๋„๋Š” ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ, PR ๋˜๋Š” ์Šค๋ ˆ๋“œ์—์„œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ์‹œํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ถ”์ƒ์  ์ธ ํ†ต๊ณ„์  ์†์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐ๊ฐ์€ PCG64๊ฐ€ ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Windows์˜ ์†๋„ ๋‹จ์ ์€ Anaconda ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. al., ๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ์‹œ์ ์—์„œ ์ˆ˜์ • ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ ์‹คํ–‰์ด Python์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ์†์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” Visual Studio์˜ PCG64 ์†๋„ ํŒจ๋„ํ‹ฐ๊ฐ€ ์ง€์›Œ์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์— ๋งค์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์–ด๋”˜๊ฐ€์—์„œ ์‹ ์ค‘ํ•˜๊ฒŒ ํ‰๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์†๋„ ๋ฌธ์ œ๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ์€-๋ฌด์—‡์ด ์•ˆ์ „ํ•œ๊ฐ€์š”?

๋…ผ๋ฆฌ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค. "๋ฌด์—‡์ด ๋น ๋ฅธ๊ฐ€"? ๋‚˜๋Š” numpy ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ BitGenerator ์˜ ์„ฑ๋Šฅ์„ ์ค‘์š”ํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ ๋น ๋ฅธ BitGenerator ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๊ณ„์‚ฐ์—์„œ 5 %์˜ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋ฉ๋‹ˆ๊นŒ? ์•„๋งˆ ๊ทธ๊ฒƒ๋„ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C๋งŒํผ ๋น ๋ฅด์ง€ ์•Š์€ Python์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์œ ์šฉํ•œ PRNG๊ฐ€ ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ์กฐ์ฐจ๋„ BitGenerator ์—์„œ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ ํƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” Visual Studio์˜ PCG64 ์†๋„ ํŒจ๋„ํ‹ฐ๊ฐ€ ์ง€์›Œ์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์— ๋งค์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค.

Up-thread ์ €๋Š” clang ์–ด๋–ป๊ฒŒ PCG64๋ฅผ 64 ๋น„ํŠธ MSVC๋ฅผ ์œ„ํ•ด ํ›”์น  ์ˆ˜์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 64 ๋น„ํŠธ Windows์˜ MSVC๊ฐ€ ๊ทน๋ณต ํ•  ์ˆ˜์—†๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋” ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ 32 ๋น„ํŠธ ์‹œ์Šคํ…œ์˜ PCG64์ด๋ฉฐ,์ด ์ค‘ 32 ๋น„ํŠธ Windows๋งŒ์ด ์—ฌ์ „ํžˆ ์‹ค์งˆ์ ์œผ๋กœ ์ค‘์š” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ 32 ๋น„ํŠธ ISA๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค MSVC์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@Kellie Ottoboni [email protected] ์™€ ์ œ๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์€
์ ๋‹นํ•œ ํฌ๊ธฐ์˜ ๋ฌธ์ œ๋ผ๋„ MT์˜ ์ƒํƒœ ๊ณต๊ฐ„์€ ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ถ”์ • ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ท ์ผ ํ•œ ์ˆœ์—ด (n <2100) ๋˜๋Š” ๊ท ์ผ ํ•œ ๋žœ๋ค ์ƒ˜ํ”Œ (n = 4e8, k = 1000).

์ด๋Š” ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ์—์„œ ์ˆœ์—ด ํ…Œ์ŠคํŠธ, MCMC์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
์˜๋„ ๋œ ๋ฐฐํฌํŒ๊ณผ ์‹ค์ œ ๋ฐฐํฌํŒ์˜ ์ฐจ์ด
๋ถ„ํฌ๋Š” ์ž„์˜๋กœ ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ๋ณ€๋™ ๊ฑฐ๋ฆฌ๊ฐ€
2). ํฌ๊ณ  ์‹ฌ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” "ํ†ต๊ณ„์ "๊ธฐ๋Šฅ์— ๋Œ€ํ•ด MT๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๋…ธ๋ ฅ์„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋ช‡ ๋…„. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊นจ๋Š” ์ฒด๊ณ„์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค
(๋ถ„ํฌ ๊ฑฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ธฐ ๋•Œ๋ฌธ์—).

๊ฑด๋ฐฐ,
ํ•„๋ฆฝ

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ ์˜คํ›„ 12:26 Robert Kern [email protected]
์ผ๋‹ค :

์†๋„ ๋ฌธ์ œ๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ์€-๋ฌด์—‡์ด ์•ˆ์ „ํ•œ๊ฐ€์š”?

๋…ผ๋ฆฌ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค. "๋ฌด์—‡์ด ๋น ๋ฅธ๊ฐ€"? ๋‚˜๋Š” ์ข‹์€ ์ƒ๊ฐ์ด ์—†๋‹ค
์–ด๋–ค numpy ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ BitGenerator์˜ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€
์‹ฌ๊ฐํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ ๋น ๋ฅธ BitGenerator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
์ „์ฒด ๊ณ„์‚ฐ์—์„œ 5 % ์†๋„ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ ๊ทธ๊ฒƒ๋„ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
C๋งŒํผ ๋น ๋ฅด์ง€ ์•Š์€ Python์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‹ฌ์ง€์–ด ๊ทธ์ €
์‹ค์ œ๋กœ ์œ ์šฉํ•œ PRNG๊ฐ€ ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ์€ ๋งŽ์€ ๋น„์šฉ์„ ์ง€์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
BitGenerator์˜ ์‹œ๊ฐ„. ์•„๋งˆ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ ํƒ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š”
์ถฉ๋ถ„ํ•œ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWKSMPAG3GFUCUFRXCDPXQYVRA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW290PWSZGODWcomW2ZLO290PWSZGODWcomVXHJKT#5WcomWXHJKT
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWIDCPAJJ6DJ3RO332LPXQYVRANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

@pbstark ๋‚ด๊ฐ€๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์€ MT ๋˜๋Š” 128 ๋น„ํŠธ PRNG๊ฐ€ ์‹คํŒจํ•˜๊ณ  cryptorandom ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฌธ์ œ์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ (์ธ์œ„์  ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด ์ธ์œ„์ ์ด์ง€๋Š” ์•Š์Œ)์ž…๋‹ˆ๋‹ค. ๋ฆฌ์ƒ˜ํ”Œ๋ง ๋ฐฉ๋ฒ•์ด 128 ๋น„ํŠธ PRNG๋กœ ์ž˜๋ชป๋œ ์ถ”๋ก ์„ ์ œ๊ณตํ•˜๊ณ  cryptorandom ์˜ฌ๋ฐ”๋ฅธ ์ถ”๋ก ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ง€์  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

PCG64๋กœ ์ด๋™ํ•˜๋ฉด ๋ฌธ์ œ ํฌ๊ธฐ์˜ ํ•˜ํ•œ์ด ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.
์ƒํƒœ ๊ณต๊ฐ„์ด MT๋ณด๋‹ค ํ›จ์”ฌ ์ž‘๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก 
์—ฌ์ „ํžˆ "๋” ๋‚˜์€"์ž„์˜์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ˆœ์—ด ๊ทธ๋ฃน์€ MT๋ณด๋‹ค ๋” ๊ท ๋“ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ „์— ๋ถ„ํ•ด๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค
500์€ 10์„ ์„ ํƒํ•˜๊ณ  21์€ ์ „์—!.

๊ฑด๋ฐฐ,
ํ•„๋ฆฝ

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 30 ๋ถ„ Robert Kern [email protected]
์ผ๋‹ค :

์ €๋Š” Visual Studio์˜ PCG64 ์†๋„ ํŒจ๋„ํ‹ฐ๊ฐ€
์ง€์šธ ์ˆ˜์—†๋Š” ๊ฒƒ.

Up-thread ๋‚˜๋Š” clang์ด PCG64๋ฅผ ์–ด๋–ป๊ฒŒ ํ›”์น  ์ˆ˜์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
64 ๋น„ํŠธ MSVC์˜ ๊ฒฝ์šฐ 64 ๋น„ํŠธ Windows์˜ MSVC๊ฐ€
๊ทน๋ณต ํ•  ์ˆ˜์—†๋Š” ๋ฌธ์ œ.

๋” ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ 32 ๋น„ํŠธ ์‹œ์Šคํ…œ์˜ PCG64์ž…๋‹ˆ๋‹ค.
Windows๋Š” ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ์—๊ฒŒ ์‹ค์งˆ์ ์œผ๋กœ ์ค‘์š” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋” ์ ์Šต๋‹ˆ๋‹ค
32 ๋น„ํŠธ ISA๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค MSVC์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWJFCINQCYGFCI7ULI3PXQZGLA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSEXG43VMV261BW63LNMW2962M261BW63LNMVXHJPI
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWK6QTB65Z4TJU76XKTPXQZGLANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

๋‚˜๋Š” PRNG์— ๋Œ€ํ•ด ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์‹ค์ œ๋กœ ๋ฌด๊ฒŒ๋ฅผ ์ง€์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ํ†ต๊ณ„์  ์†์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (์ •๋‹ต์ด ๋ชจ๋‘ ๋งค์šฐ ํ›Œ๋ฅญํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค). ์ œ๊ฐ€ ์ง€๊ธˆ ๊ถ๊ธˆํ•ดํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” k ์ฐจ์› ๋“ฑ๋ถ„ ํฌ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ MT์— ๋น„ํ•ด ์—ฌ๊ธฐ์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” PCG ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (๋น„์„ ํ˜• ์—ญํ•™์—์„œ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๊ธด์žฅ๋˜์ง€๋งŒ PRNG์— ๋Œ€ํ•œ ๊ฐœ์š”๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•ž์œผ๋กœ 2 ์ผ ๋‚ด์— ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ...

์ตœ์ฒจ๋‹จ ์„ฑ๋Šฅ์— ๊ด€์‹ฌ์ด์žˆ๋Š” Windows 32 ๋น„ํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 64 ๋น„ํŠธ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ˆ˜ํ•™์— ๊ธฐ์ดˆํ•˜์—ฌ ๋งŽ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์•„์ง ์˜ˆ๋ฅผ ์ง€์  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฐฉ ์›์น™์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ• (CS-PRNG)์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์ฃผ์˜๋ฅผ ๋œ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ ์˜คํ›„ 12:39 Robert Kern [email protected]
์ผ๋‹ค :

@pbstark https://github.com/pbstark ๋‚ด๊ฐ€๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ
๋ฌธ์ œ์˜ ๊ตฌํ˜„ (์ธ์œ„์  ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด ์ธ์œ„์ ์ด์ง€๋Š” ์•Š์Œ)
MT ๋˜๋Š” 128 ๋น„ํŠธ PRNG๊ฐ€ ์‹คํŒจํ•˜๊ณ  cryptorandom์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋Š” ํ• ์ˆ˜ ์žˆ๋‹ˆ
๋ฆฌ์ƒ˜ํ”Œ๋ง ๋ฐฉ๋ฒ•์ด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ง€์ ํ•˜์‹ญ์‹œ์˜ค.
128 ๋น„ํŠธ PRNG๋กœ ์ถ”๋ก ํ•˜๊ณ  cryptorandom์œผ๋กœ ์ถ”๋ก ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๊นŒ?

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWODTUIPNMVOJB6QP3DPXQ2FPA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSEXG43VMLOBW63LNG43VMVORBW63LNODW962292489 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWITAGQFZDQSIFNEHETPXQ2FPANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

k- ๋“ฑ๋ถ„ ํฌ๋Š” ์ „์ฒด PRNG ์ถœ๋ ฅ์˜ ์•™์ƒ๋ธ” ์†์„ฑ์ž…๋‹ˆ๋‹ค.
PRNG ๊ธฐ๊ฐ„. ์ข‹์€ ์ผ์ด์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด ๋ง๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
์ถœ๋ ฅ์˜ ์ง๋ ฌ ์ƒ๊ด€๊ณผ ๊ฐ™์€ ์ž„์˜์„ฑ ์‹คํŒจ์˜ ์ข…๋ฅ˜.
์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ๋ง‰๋Œ€์ž…๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 27 ์ผ ์›”์š”์ผ ์˜คํ›„ 12:48 Sebastian Berg [email protected]
์ผ๋‹ค :

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

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWPOBTPYHC3XBINQYA3PXQ3HZA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVLOBW63LNODcomW2962ZLOBW63LNODMVXHJKT
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWOEB7KR2YJZWHRRAHLPXQ3HZANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

@pbstark MT๋Š” PCG (๋ฐ ๊ธฐํƒ€ ์ƒ์„ฑ๊ธฐ)๊ฐ€ ํ†ต๊ณผํ•˜๋Š” ์—ฌ๋Ÿฌ ํ†ต๊ณ„ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

@rkern

MSVC์—์„œ ror ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด "_rotr64"๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด '/ O2'ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ ํ˜ธ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

PCG64๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

@pbstark์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์‹œ๋“œ๋กœ ์ดˆ๊ธฐํ™” ๋œ PCG-64์˜ ์ผ๋ถ€ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 0x559107ab8002ccda3b8daf9dbe4ed480 ).

  64bit: 0x21fdab3336e3627d 0x593e5ada8c20b97e 0x4c6dce7b21370ffc
     0xe78feafb1a3e4536 0x35a7d7bed633b42f 0x70147a46c2a396a0
  Coins: TTTHHTTTHHTHTTTTHTHHTTTTTHTTHHTTHHTHHTHHHHHHHHTTHHTTHHTHHHHHTHTHH
  Rolls: 5 3 5 2 5 3 1 6 6 5 4 4 5 5 5 6 2 3 5 3 2 3 2 5 6 2 4 6 2 3 4 6 3
  Cards: 5h 3h 3c 8d 9h 7s Kh Ah 5d Kc Tc 6h 7h 8s Ac 5c Ad Td 8c Qd 2h As
     8h 2d 3s 5s 4d 6d 2s Jd 3d 4h Ks 6s Qc Js Th 9d 9c Ts Jh 4c 2c 9s
     6c 4s 7c 7d Jc Qs Kd Qh

์ด์ œ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•œ ์‹œ๋“œ๋กœ ๋‹ค๋ฅธ pcg ์ƒ์„ฑ๊ธฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 0xb124fedbf31ce435ff0151f8a07496d3 ์ธ์ˆ˜๋ฅผ ์œ„ํ•ด ์„ ํƒํ•ฉ์‹œ๋‹ค. ์ด ์•Œ๋ ค์ง„ ์ถœ๋ ฅ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐœ์˜ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์œ„์—์„œ ์‚ฌ์šฉํ•œ ์‹œ๋“œ๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— (PCG์˜ ๊ฑฐ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด) ์•ฝ 2.5 ร— 10 ^ 38 (๋˜๋Š” ์•ฝ 2 ^ 127.5) ์ถœ๋ ฅ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ 10 ^ 38 ๋‚˜๋…ธ์ดˆ๋Š” ์šฐ์ฃผ ๋‚˜์ด์˜ 2300 ์–ต ๋ฐฐ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ๊ฑฐ๊ธฐ์—์žˆ๋Š” PCG-64์˜ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋‚ด๊ฐ€ ์–ด๋””๋ฅผ ๋ด์•ผํ• ์ง€ ๋งํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹น์‹ ์€ ์ ˆ๋Œ€ ์ฐพ์„ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ŠคํŠธ๋ฆผ์„ ๋ณ€ํ™” ์‹œํ‚ค๋ฉด ๋” ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ •๊ทœ PCG๋Š” ์‹ค์ œ๋กœ ์…ฐ์ต์Šคํ”ผ์–ด ์—ฐ๊ทน์„ ์ถœ๋ ฅ ํ•  ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. PCG ํ™•์žฅ ์ƒ์„ฑ ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ ์…ฐ์ต์Šคํ”ผ์–ด ์—ฐ๊ทน์„ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋น„์ธ ์œ„ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋งค์šฐ ์ ์–ด์„œ ๋ณธ์งˆ์ ์œผ๋กœ 0์ž…๋‹ˆ๋‹ค. ์ œ ๋ˆˆ์—๋Š” ์‹ค์งˆ์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ์ „ํ˜€์—†๋Š” ์žฌ์‚ฐ์—๋Š” ๊ฐ€์น˜๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

(๋˜ํ•œ ์•”ํ˜ธํ™” ๋ณด์•ˆ PRNG๋Š” k ์ฐจ์› ๋“ฑ๋ถ„ ํฌ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” PRNG๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งˆ๋ฒ•์˜ ์ด์•Œ์ด ์•„๋‹™๋‹ˆ๋‹ค. PRNG์—์„œ๋ฐ›๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„ํŠธ๋ฅผ ์›ํ•˜๋Š” ์ˆœ๊ฐ„ ์‹œ๋“œ์™€ ์ €์žฅ์„ ์ƒํƒœ๋กœํ•˜๋ฉด ์ƒ์„ฑ ํ•  ์ˆ˜์—†๋Š” ๋น„ํŠธ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹ํ•„์—ฐ์ ์œผ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค (์ฆ๋ช… : ๋น„๋‘˜๊ธฐ ๊ตฌ๋ฉ ์›์น™์— ์˜ํ•ด). ๊ทธ๋ฆฌ๊ณ  ์‹œ๋“œ์— ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์–‘์˜ ์ถœ๋ ฅ์œผ๋กœ ์ œํ•œํ•˜๋ฉด ์‹ค์ œ๋กœ ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์€ ํ•ด์‹œ ํ•จ์ˆ˜์ด๊ฑฐ๋‚˜, ์‹œ๋“œ ์ž…๋ ฅ์ด PRNG๊ฐ€ ์•„๋‹ˆ๋ผ ์ง„์ •์œผ๋กœ ๋ฌด์ž‘์œ„ ์ธ ๊ฒฝ์šฐ ์‹๋ณ„ ํ•จ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ €๋Š” aesctr.h , ์ž„์˜ ๊ฐ’๋‹น ns์˜ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ AES ์นด์šดํ„ฐ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ž˜ํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

|                     |   Xoshiro256 |    PCG64 |   AESCounter |
|---------------------+--------------+----------+--------------+
| 32-bit Unsigned Int |      3.40804 |  3.59984 |      5.2432  |
| Uniform             |      3.71296 |  4.372   |      4.93744 |
| 64-bit Unsigned Int |      3.97516 |  4.55628 |      5.76628 |
| Exponential         |      4.60288 |  5.63736 |      6.72288 |
| Normal              |      8.10372 | 10.1101  |     12.1082  |
+---------------------+--------------+----------+--------------+

์ž˜ ํ–ˆ์–ด์š”, @bashtage.

๋ช…์‹ฌํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ํŠน์ • AES ๋ช…๋ น์ด ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  CPU์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ (๋Š๋ฆฐ) ํด๋ฐฑ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ ์–ด๋„ ํ•œ ๊ฐ€์ง€ ํ•ฉ์˜์ ์„ ์š”์•ฝ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” numpy๊ฐ€ ์‚ฌ์šฉํ•  BitGenerator ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ณ  ๋‹ค๋ฅธ BitGenerator ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™๋ณดํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ•ฉ์˜์™€ ์ผ์น˜ํ•˜๊ณ  ๋‹ค๋ฅธ ์˜ต์…˜ ์ค‘ ์ผ๋ถ€๊ฐ€ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋Š” "๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์˜ต์…˜์„ ์Šค์ผ€์น˜ํ•˜๋Š” ๋ฐ ํ•œ ๋ฒˆ ๋” ์ฐŒ๋ฅด์‹ญ์‹œ์˜ค. ๊ฒฌ์ธ๋ ฅ์ด ์—†์œผ๋ฉด ์ž…์„ ๋‹ค๋ฌผ๊ฒ ์Šต๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์˜ต์…˜์ด ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ "์ต๋ช… ๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋“œ ๋œ Generator ๋ฅผ ์–ป๋Š” ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ PRNG์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋˜๋„๋ก API๋ฅผ ์„ค๊ณ„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด BitGenerator ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜์ง€ _ ์•Š์•˜๋‹ค _ ๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” numpy๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์™„์„ฑ๋„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ scipy ๋ฐ ๊ธฐํƒ€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‚จ๊ฒจ ๋‘๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์•„ํ‚คํ…์ฒ˜์˜ ์žฅ์ ์€ BitGenerator ๋ฅผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด RandomState ๋ฐ ์‚ฌ๋žŒ๋“ค์ด ์„ ํ˜ธํ•˜๋Š” BitGenerator ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด MT19937 ๋งŒ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์œ„ํ•ด Xoshiro256 ๋ผ๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Generator.__init__() ์ƒ์„ฑ์ž๊ฐ€ BitGenerator ์š”๊ตฌํ•˜๋„๋กํ•ฉ์‹œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,์˜๋Š” ์ •์˜ ํ•  ํ•จ์ˆ˜ np.random.xoshiro256_gen(seed) ๊ฐ€ ๋ฐ˜ํ™˜ Generator(Xoshiro256(seed)) ๋‚ด๋ถ€์ ์œผ๋กœ. ์šฐ๋ฆฌ๋Š” ์‹œ๋“œ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทธ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ๋ฌธ์„œํ™” Generator .

์ด์ œ ๋ช‡ ๊ฐ€์ง€ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋นจ๋ฆฌ ๊ฐ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ PCG64 , ThreeFry ๋“ฑ์„ random-tng ๋˜๋Š” scipy ๋˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ ํ‘ธ์‹œํ–ˆ๋Š”๋ฐ ๊ทธ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๋˜๋Š” ์ƒˆ๋กœ์šด ํ†ต๊ณ„์  ๊ฒฐํ•จ์€ Xoshiro256 ์—์„œ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” BitGenerator ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” numpy์˜ ์˜๊ฒฌ์„ PCG64 ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ PCG64 BitGenerator ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  np.random.pcg64_gen(seed) ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. np.random.xoshiro256_gen(seed) ์— ๋” ์ด์ƒ ์„ ํ˜ธ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ฝ”๋“œ๋Š” np.random.pcg64_gen(seed) ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜์ง€๋งŒ ๊ณ„์†ํ•ด์„œ Xoshiro256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋Š” ๋ช…์‹œ ์ ์œผ๋กœ Generator(Xoshiro256(seed)) ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ "์ต๋ช…"API (์˜ˆ : Generator(seed) , Generator(DefaultBitGenerator(seed)) , np.random.default_gen(seed) )์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๊ตฌ์ ์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์˜๊ฒฌ์„ ๋ฐ”๊ฟ€ ๋•Œ ์šฐ๋ฆฌ์˜ "์„ ํ˜ธํ•˜๋Š”"์ƒ์„ฑ์ž๊ฐ€ ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ํ•˜๋„๋ก ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•ญ์ƒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์–ด๋–ค ์ด์œ ๋กœ ๋“  ๋ฌดํ•ดํ•œ ๊ฒฝ๊ณ ๋ฅผ ๊ฒฌ๋”œ ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ). ์ถœ์ฒ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ธฐ๋ก ๋œ numpy ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ๊ฐ€์—†๋Š” ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ œํ•œํ•˜๊ณ  ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์—…์— _ ๊ฐ€์žฅ ์‰ฌ์šด _ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค๋ฉด numpy์˜ ์˜๊ฒฌ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋“ค๋ฆฌ๋‚˜์š”? ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค์—์„œ BitGenerator ๋Œ€ํ•œ ํ™•์‹คํ•œ ์„ ํƒ์„ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฒฐ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์ตœ์ฒจ๋‹จ ์„ฑ๋Šฅ์— ๊ด€์‹ฌ์ด์žˆ๋Š” Windows 32 ๋น„ํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 64 ๋น„ํŠธ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. Win32์—์„œ PCG64 ์˜ ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ์„ฑ๋Šฅ (๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ์œผ๋กœ ๊ฐœ์„  ํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ)์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ?

MSVC์—์„œ ror ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด "_rotr64"๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด '/ O2'ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ ํ˜ธ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ! @imneme ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์‹ค์ˆ˜๋ฅผ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. :-)

@seberg ๋‹น์‹ ์˜ ๋ถ„์•ผ์—์„œ ๋‹น์‹ ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ถˆ๋Ÿฌ k . ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ€์ง€๊ณ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚ด๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํŠน์ • ๋ฌธ์ œ๊ฐ€ ๊ท€ํ•˜์˜ ๋ถ„์•ผ์—์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํŠน์ • ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค!

๊ถ๊ธˆํ•ด์„œ aesctr.h ์‚ฌ์šฉํ•˜์—ฌ AES ์นด์šดํ„ฐ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ํฌ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด @pbstark ์˜ ์šฐ๋ ค์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AES-CTR์€ CS-RNG์ด์ง€๋งŒ ๋ชจ๋“  CS-RNG๊ฐ€ (์ด๋ก ์ ์œผ๋กœ) ์ƒ๋‹นํ•œ k ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  k! ์ˆœ์—ด์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธด ๊ธฐ๊ฐ„์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์นด์šดํ„ฐ๋Š” ์—ฌ์ „ํžˆ 128 ๋น„ํŠธ ์ˆซ์ž์ด๋ฉฐ ๋กค์˜ค๋ฒ„๋˜๋ฉด ๊ธฐ๊ฐ„์˜ ๋์ž…๋‹ˆ๋‹ค. @pbstark ๋Š” ๋งค์šฐ ํฐ ๊ธฐ๊ฐ„์˜ PRNG๋ฅผ ์˜นํ˜ธํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์€ CS-RNG์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋“ฑ๋ถ„ ํฌ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ PRNG์˜ ๋“ฑ๋ถ„ ํฌ๊ฐ€ PRNG์˜ ์ƒํƒœ ํฌ๊ธฐ์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ตœ๋Œ€ ๊ฐ’์— ๊ฐ€๊นŒ์›Œ์ง€๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์ตœ๋Œ€ ๋“ฑ๋ถ„ ํฌ๋ฅผ ๋ฐ”๋žŒ์งํ•œ ์†์„ฑ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€๋งŒ ๊ฒฐํ•จ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋งŒํผ ๋งŽ์€ ๋…ผ๋ฌธ์ด ๋‚˜์™€ ์žˆ์Œ). _k_-bit PRNG๊ฐ€ ์žˆ๊ณ  ๋ชจ๋“  _k_-bit ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•˜๋ฉด ์ƒ์ผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์•ฝ 2 ^ (k / 2) ์ถœ๋ ฅ ํ›„์— ์ถœ๋ ฅ์ด ๋ฐ˜๋ณต ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ( ์ €๋Š” ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์ผ ๋ฌธ์ œ ํ†ต๊ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค . 64 ๋น„ํŠธ ์ถœ๋ ฅ 64 ๋น„ํŠธ ์ƒํƒœ PRNG ์ธ SplitMix์™€ 32 ๋น„ํŠธ ์ถœ๋ ฅ 64 ๋น„ํŠธ Xoroshiro64 +์—์„œ ํ†ต๊ณ„์ ์œผ๋กœ ๋ฏฟ์„ ์ˆ˜์—†๋Š” ๋ฐ˜๋ณต์ด ์—†์Œ์„ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. -์ƒํƒœ 2 ์ฐจ์› ๋“ฑ๋ถ„ ํฌ PRNG ๋“ฑ.)

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ 64 ๋น„ํŠธ ๋ฐ˜๋ณต ๋ถ€์กฑ (๋˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ˜๋ณต-์šฐ๋ฆฌ๋Š” ํ‘ธ ์•„์†ก ๋ถ„ํฌ๊ฐ€ ์˜ˆ์ƒ ๋จ)์œผ๋กœ ์ธํ•ด PRNG์— ์‹คํŒจํ•˜๋Š” ํ†ต๊ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‹ค์šฉ์ ์ด์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์ด ์ƒ๋žต๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  64 ๋น„ํŠธ ๊ฐ’์˜ 36.8 % ๋ˆ„๋ฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

์ €๋„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ˆ˜ํ•™์— ๊ธฐ์ดˆํ•˜์—ฌ ๋งŽ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์•„์ง ์˜ˆ๋ฅผ ์ง€์  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฐฉ ์›์น™์€ ์šฐ๋ฆฌ๊ฐ€ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ๊ณ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• (CS-PRNG)์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋œ์ฃผ์˜ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ์ฃผ์žฅ๊ณผ ์ฆ๊ฑฐ์— ์„ค๋“๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜๋Š” ์ˆ˜ ๋งŽ์€ ์‚ฌ์šฉ์ž ์•ž์— ์„œ์„œ ๋ถˆํŽธ ํ•จ์„ ๋Š๋ผ์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ „ํ™˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ์ง„์ˆ ์„ ์˜นํ˜ธ ํ•  ์ค€๋น„๊ฐ€๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์˜ˆ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์„ค๋“๋ ฅ์ด์žˆ์„ ๊ฒƒ์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š”์ด ์ž…์žฅ์„ ๋ฐฉ์–ด ํ•  ์ค€๋น„๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ํ•œ PRNG๊ฐ€ ์‹ค์ œ RNG์— ๋ฏธ์น˜์ง€ ๋ชปํ•˜๋Š” ์†์„ฑ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ก ์ ์œผ๋กœ๋Š” ์‹ค์ œ RNG์˜ ์†์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ณ„์‚ฐ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ์ ์–ด๋„์ด๋ฅผ ์™„ํ™” ํ•  ์ˆ˜์žˆ๋Š” ์ •๋„๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ž…์ฆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋‹จ์  ์ค‘ ์ƒ๋‹น์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹ค์ œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์— ๋งค์šฐ ์ž‘๊ณ  ์‹ค์งˆ์ ์œผ๋กœ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ„๋ฐ˜ ํ–‰์œ„๋Š” ํ˜์˜ค ์ ์ด๊ฑฐ๋‚˜ ์ „๋ฌด, ์ง„ํ–‰ / ๋ถˆ๊ฐ€์˜ ์ข…๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ํšจ๊ณผ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ๊ทธ ํšจ๊ณผ์˜ ์–ด๋Š ์ •๋„๋ฅผ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํŠน์ • ํฌ๊ธฐ์˜ PRNG๊ฐ€ ์ผ๋ถ€ k ๋Œ€ํ•ด ๋ชจ๋“  k! ์ˆœ์—ด์„ ๊ท ๋“ฑํ•˜๊ฒŒ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์„ค๋“๋ ฅ์žˆ๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์นœ ๋‹จ๊ณ„๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ˆœ์—ด์„ ์ƒ์„ฑ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ณ ์žํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณ„์‚ฐ์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ค„ PractRand ๋˜๋Š” TestU01์— ์ถ”๊ฐ€ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@imneme ์˜ PCG ๋…ผ๋ฌธ ์—์„œ ๋งค์šฐ ์œ ์ตํ•œ ๋ถ„์„ ๋ผ์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ PRNG์˜ ์—ฌ๋Ÿฌ ์ž‘์€ ์ƒํƒœ ๋ฒ„์ „์„ ํŒŒ์ƒํ•˜๊ณ  TestU01์ด ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ง€์ ์„ ์ •ํ™•ํžˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด "X PRNG ํ†ต๊ณผ"๋˜๋Š” ์‹คํŒจ๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ PRNG ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋น„๊ตํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ค‘์ธ ์ƒํƒœ ํฌ๊ธฐ (์ผ๋ถ€ ๋งŽ์€ GiB ์ƒ˜ํ”Œ์—์„œ TestU01์„ ํ†ต๊ณผ)์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํ—ค๋“œ ๋ฃธ์ด ์žˆ๋Š”์ง€ ์ถ”์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 8 ๋น„ํŠธ PRNG์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณ„์‚ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? 16 ๋น„ํŠธ PRNG? ๊ทธ๋Ÿฌ๋ฉด์ด ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๊ฐ€ ํ˜„์žฌ TestU01 / PractRand๋ณด๋‹ค ์ด์ „์— PRNG์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— PractRand์˜ ํ˜„์žฌ ํ…Œ์ŠคํŠธ ์ œํ’ˆ๊ตฐ์— ๋Œ€ํ•œ ์ž‘์€ PRNG์˜ ์‹คํŒจ ์ง€์ ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ์ˆœ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํŒจ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด PRNG์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด์ด ๋ฌธ์ œ๋Š” ์‹ค์šฉ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ ค ์‚ฌํ•ญ์ด๋ฉฐ ์ˆœ์—ด ๋ฌธ์ œ๊ฐ€ ๋‚ด ๊ณ„์‚ฐ์— ์‹ค์งˆ์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ข‹์€ ํ”„๋ก์‹œ๋กœ "passes PractRand"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์‹คํ–‰ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์†์— ์ฅ๊ธฐ ์ „๊นŒ์ง€๋Š”์ด ๊ธฐ์ค€์œผ๋กœ CS-PRNG๋ฅผ ์ถ”์ง„ํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์„ ํƒ์„ ์„ค๋“๋ ฅ์žˆ๊ฒŒ ์„ค๋ช… ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

32 ๊ฐœ์˜ ์•„์ดํ…œ์„ ์„ž์œผ๋ฉด ๋ชจ๋‘ 32 ๊ฐœ! ์…”ํ”Œ (์ฆ‰, ๋ชจ๋“  263130836933693530167218012160000000)์€ 32 ๊ฐœ์˜ ๋ฌด์ž‘์œ„ ์ƒ˜ํ”Œ ๋งŒ ์ œ๊ณตํ•˜๋Š” PRNG๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์…”ํ”Œ, ๋‚˜๋Š” ์‹ค์ œ๋กœ ๋‹น์‹ ์ด ์—„์ฒญ๋‚œ ์ˆซ์ž๋ฅผ ์š”๊ตฌํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์ถฉ๋ถ„ํžˆ ํฐ ์ƒ๊ฐ์„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ๊ทธ ์…”ํ”Œ์ด ๋‚˜์˜ค๋Š” ์ˆœ์„œ๋„ ๋ฏธ๋ฆฌ ๊ฒฐ์ •๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  (์ง์ ‘์ ์œผ๋กœ) ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค! ๋ถ„๋ช…ํžˆ 32๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋„๋ก ์š”๊ตฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค! ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆœ์„œ๋กœ ์…”ํ”Œ โ€” (32!)! ๋‹น์‹ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค! ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์ƒํƒœ๋ฅผ์œ„ํ•œ 3.8 ร— 10 ^ 18 ์—‘์‚ฌ ๋ฐ”์ดํŠธ์™€ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ๋น„์Šทํ•œ ์–‘์˜ ์—”ํŠธ๋กœํ”ผ๋ฅผ ํ•„์š”๋กœํ•˜์ง€๋งŒ, ๋ชจ๋“  ๊ฒƒ์ด ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

... np.random.xoshiro256_gen(seed) ์— ๋” ์ด์ƒ ์„ ํ˜ธ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ฝ”๋“œ๋Š” np.random.pcg64_gen(seed) ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜์ง€๋งŒ ๊ฒฝ๊ณ ์—†์ด Xoshiro256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Generator(Xoshiro256(seed)) ๋ช…์‹œ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง€์› ์ค‘๋‹จ๊ณผ ๊ทธ๋“ค์ด ์ •๋ง๋กœ ์•Œ๊ณ  ์‹ถ์ง€ ์•Š์€ ์ด์ƒํ•œ ๋“ค๋ฆฌ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๊ดด๋กญ ํžˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

NEP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ๊ฒƒ์€ ์‹ ์ค‘ํ•˜๊ฒŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

"๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์˜ต์…˜์ด ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ "์ต๋ช… ๊ธฐ๋ณธ๊ฐ’ ์—†์Œ"์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ์ค‘์ธ PRNG์˜ ์ด๋ฆ„์„ ์•Œ๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ์ ์ด ์š”์ ์ž…๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ์ด๊ฒƒ์„๋ณด์‹ญ์‹œ์˜ค. np.random.rand & co์—์„œ np.random.RandomState() ๋กœ ์ด๋™ ํ•œ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋” ๋‚˜์€ ์‹œ์Šคํ…œ์„ ์†Œ๊ฐœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ด ๋ณด๊ฒŒ๋˜๋Š” ๊ฒƒ์€ np.random.xoshiro256_gen() ? ๊ทธ๊ฒƒ์€ ์œ ์šฉ์„ฑ ์ธก๋ฉด์—์„œ ์ฃผ์š” ํšŒ๊ท€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ์ค‘์ธ PRNG์˜ ์ด๋ฆ„์„ ์•Œ๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ์ ์ด ์š”์ ์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์‚ฌ๋žŒ๋“ค์ด ์ž‘์—…ํ•˜๋˜ default_generator(seed) ์™€ ๊ฐ™์€ "์ง€์ •๋œ ์ด๋™ ๋Œ€์ƒ"API (์˜ˆ : @shoyer ์˜ version ์ธ์ˆ˜)๋ฅผ ๊ฐ–๋Š” ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NEP 19์—์„œ ๋ถ€์ธํ•˜๋Š” ์ŠคํŠธ๋ฆผ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ API ์†์ƒ์— ์ด์ฐจ์ ์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ BitGenerator ์€ ๊ธฐ๋Šฅ ์„ธํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํšจ๊ณผ์ ์ธ API๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค (์ฃผ๋กœ PRNG์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒƒ์ด์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ, jumpahead). ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ PRNG ์„ ํƒ์˜ ์ผ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‹ค์ œ๋กœ ๋‚˜์˜ค๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค (์˜ˆ : ๋” ์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋” ์ด์ƒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜์ง€ ์•Š์Œ).

์˜ˆ๋ฅผ ๋“ค์–ด ๋จผ์ € PCG64 ์„ ํƒํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 128 ๋น„ํŠธ ์ƒํƒœ, 2 ^ 127 ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ jumpahead๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•˜๊ณ  ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ๋žŒ๋“ค์€ default_generator(seed, stream=whatever) ์“ฐ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ฏธ๋ž˜์˜ ์ž‘์—…์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ํ†ต๊ณ„์  ๊ฒฐํ•จ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์Šน๊ฒฉํ•˜๋Š” ๋‹ค์Œ PRNG๋Š”> = 128 ๋น„ํŠธ ์ƒํƒœ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค (์‰ฌ์›€; ๋ฒ”์šฉ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋” ์ž‘์€ ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ), jumpahead (ํ•˜๋“œ!),> = 2 ^ 127 ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ (whoo, boy!), ์ด๋ฏธ ์ฝ”๋“œ์— ์กด์žฌํ•˜๋Š” default_generator() ์˜ ์‚ฌ์šฉ์„ ๊นจ์ง€ ์•Š๊ธฐ ์œ„ํ•ด. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ž˜์นซ์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@shoyer ๋Š” ๊ธฐ๋ณธ BitGenerator ํ•ญ์ƒ ์ตœ์†Œ ๊ณต๋ถ„๋ชจ ๊ธฐ๋Šฅ์œผ๋กœ ๊ณ ์˜์ ์œผ๋กœ ์™œ๊ณก ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ @charris ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ์„ ํ™๋ณด ํ•  ๊ธฐํšŒ๋„ ๋†“์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋” ๋‚˜์€ ์‹œ์Šคํ…œ์„ ์†Œ๊ฐœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋ณด๊ฒŒ๋˜๋Š” ๊ฒƒ์€ np.random.xoshiro256_gen() ? ๊ทธ๊ฒƒ์€ ์œ ์šฉ์„ฑ ์ธก๋ฉด์—์„œ ์ฃผ์š” ํšŒ๊ท€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ ๋“ค๋ฆฌ๋Š” ์ด๋ฆ„์ด ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ์ •์ฑ…์ด ๋™์ผํ•˜๋‹ค๋ฉด ๋” ์นœ์ˆ™ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค (์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด์ „ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ทธ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ผ์„ ๋„ˆ๋ฌด ์ž์ฃผํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ž˜์นซ๊ณผ ํ•จ๊ป˜ ์‚ด๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  version ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ”ผํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ๊ฐ’"์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ๋‚จ๊ฒจ ๋‘์–ด Generator() ๊ฐ€ ํ•ญ์ƒ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ• (Generator์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊นŒ์ง€)์€ Generator(BitGenerator(kwarg1=1,kwargs2=b,...)) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒํƒœ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋Š” ํ”ผํด ๋ง์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์‹ค์ œ๋กœ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

# 13650์—์„œ @bashtage ๋‚˜๋Š” ์•ก์„ธ์Šค ํ—ˆ์šฉ Generator().bit_generator ์—ฌ์ „ํžˆ์— ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ์‚ฐ์„ธ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ state . ์•ฝ๊ฐ„ ์žฌ ์ž‘์„ฑ๋œ test_pickle ๋ฅผ ํŒŒ์ด์ฌ Thread ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ์€-๋ฌด์—‡์ด ์•ˆ์ „ํ•œ๊ฐ€์š”? ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ๊ฐ€์ง„ ์ค€ ๋ฌด์ž‘์œ„์„ฑ์˜ ์ •๋„๋Š” ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ, PR ๋˜๋Š” ์Šค๋ ˆ๋“œ์—์„œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ์‹œํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ _N_ (512, 1024)์— ๋Œ€ํ•œ " _N_GiB ์—์„œ

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„œ์ˆ˜ ์ˆœ์œ„๋ฅผ ํ—ˆ์šฉํ•˜๋Š”๋ณด๋‹ค ์ •๊ตํ•œ ํ†ต๊ณ„ ํ’ˆ์งˆ๋ณด๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ถ•์†Œ ์ƒํƒœ ๋ณ€ํ˜• ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป๋Š” @imneme ์˜ PCG ๋…ผ๋ฌธ์˜ ์„น์…˜ 3 ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ „์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋งŽ์€ "ํ—ค๋“œ ๋ฃธ". ์ด๊ฒƒ์€ ์•”ํ˜ธํ•™์ž๊ฐ€ ๋‹ค๋ฅธ ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€ํ† ๋˜๋Š” ๋ชจ๋“  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์€ "๊นจ์ง€์ง€ ์•Š์Œ"์ด๋ผ๋Š” ๊ธฐ์ค€ ๊ธฐ์ค€์„ ํ†ต๊ณผํ•ด์•ผํ•˜์ง€๋งŒ ์ด๋Š” ๊ฒฝ์Ÿ์ž ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ๊ทธ๋“ค์€ ๊ฒฝ์Ÿ์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ์†Œ ๋œ ๋ฒ„์ „์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊นจ๊ธฐ ์ „์— ์–ผ๋งˆ๋‚˜ ๊ฐ์†Œํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. N- ๋ผ์šด๋“œ ์ „์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด N-1์—์„œ ๊นจ์ง€๋ฉด ํ—ค๋“œ ๋ฃธ์ด ๋งค์šฐ ์ ๊ณ  ์•”ํ˜ธํ•™์ž๋Š” ์•„๋งˆ์ด๋ฅผ ํ”ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 128 ๋น„ํŠธ BitGenerator ๊ฐ€ PractRand๋ฅผ ํ†ต๊ณผํ•˜์ง€๋งŒ 120 ๋น„ํŠธ ๋ฒ„์ „์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ๊ฝค ์œ„ํ—˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mattip ํ•ฉ๋ฆฌ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์–ด๋”˜๊ฐ€์—์„œ

import gc
state = [o for o in gc.get_objects() if 'Xoshiro256' in str(o)][0].state

๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊นŠ์ด ํƒ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋ฅผ ๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ Thread ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ฝ๊ฐ„ ์žฌ ์ž‘์„ฑ๋œ test_pickle ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ˆˆ์— ๋„๋Š” ๋ฌธ์ œ (# 9650)๋ผ๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ Generator() ๋Š” ์ž์‹ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์‹œ ์‹œ๋“œ๋ฉ๋‹ˆ๋‹ค. IIRC ์ด๊ฒƒ์€ Python> = 3.7์—์„œ๋งŒ ์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ๊ฐ’"์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ๋‚จ๊ฒจ ๋‘์–ด Generator() ๊ฐ€ ํ•ญ์ƒ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ• (Generator์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊นŒ์ง€)์€ Generator(BitGenerator(kwarg1=1,kwargs2=b,...)) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์žฌํ˜„์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋™์ผํ•œ ์‹œ๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ง€์›ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ ์–ด๋„ ์—„๊ฒฉํ•œ ์˜๋ฏธ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ถ€์ธ ํ•œ numpy ๋ฒ„์ „ ๊ฐ„์˜ ์žฌํ˜„์„ฑ์ž…๋‹ˆ๋‹ค.

Argument-less Generator() , ์ฆ‰ "numpy๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ์ž„์˜๋กœ ์‹œ๋“œ ๋œ PRNG๋ฅผ์ฃผ์„ธ์š”"๋Š” ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "Numpy๊ฐ€ _this_ seed์™€ ํ•จ๊ป˜ ๊ถŒ์žฅํ•˜๋Š” PRNG๋ฅผ ์ค˜"๋Š” ์˜ต์…˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. numpy๊ฐ€ ์‹œ๋“œ ๋œ PRNG๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋ฉฐ, ๊ทธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‚˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„์„ _like_ํ•˜์ง€๋งŒ (๋” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด)ํ•˜์ง€๋งŒ @rgommers๋Š” ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋จผ ๋‹จ๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๊ฒƒ์— ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค.

Argument-less Generator (), ์ฆ‰ "numpy๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ์ž„์˜๋กœ ์‹œ๋“œ ๋œ PRNG๋ฅผ์ฃผ์„ธ์š”"๋Š” ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "Numpy๊ฐ€์ด ์‹œ๋“œ์™€ ํ•จ๊ป˜ ๊ถŒ์žฅํ•˜๋Š” PRNG๋ฅผ ์ค˜"๋Š” ์˜ต์…˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. numpy๊ฐ€ ์‹œ๋“œ ๋œ PRNG๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋ฉฐ, ๊ทธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‚˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ (๋” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด) @rgommers๋Š” ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋จผ ๋‹จ๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๊ฒƒ์— ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ๋กœ ์ข‹์€ ์”จ์•—์„ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ์žฅ๋น„๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ Mersenne Twister๋ฅผ ์‹œ๋“œํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒ๊ฐ๋งŒํผ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 624 ๊ฐœ์˜ ์ž„์˜์˜ 32 ๋น„ํŠธ ์ •์ˆ˜ (19937 ๋น„ํŠธ์˜ ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด)๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ PRNG๋ฅผ ๋งŒ๋“  ๋‹ค์Œ (์‹œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ์ž˜ ์‹œ๋“œ๋˜๋„๋ก ํ•จ) ํ”ผํดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ† ๋ก ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ๋‚˜๋Š”
Generator(BitGenerator(**kwargs)) ๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ
์žฌํ˜„์— ๊ด€์‹ฌ์ด์žˆ๋Š” ๋ฐ˜ ์ธ์‹ ์‚ฌ์šฉ์ž.

Generator() ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ณ ๋ ค ๋œ ์„ ํƒ์œผ๋กœ ํ•ด์„๋˜๋ฏ€๋กœ
์‹œ๋“œ ์–‘์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ถŒ์žฅ ์‚ฌํ•ญ.

ํ•˜๋‚˜ ๋” ๋ฒ„๋ฆฌ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ Generator.seeded(seed[, bit_generator]) where bit generator is a string. This would allow the pattern of switching from one value to None to warn if the default was going to change, like lstsq. I would also only support a limited pallatte of but generators initially (i.e. 1). Doesn't make it easy to expose advanced features I suppose. In a perfect world it would use kwarg only to allow any keyword argument to be used which avoids most depreciation problems. Of course, this doesn't really need to be a class function, just seeded`.

2019 ๋…„ 5 ์›” 28 ์ผ ํ™”์š”์ผ 16:38 Robert Kern [email protected] ์ž‘์„ฑ :

"๊ธฐ๋ณธ๊ฐ’"์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ์€ ๊ตฌํ˜„์œผ๋กœ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Generator ()๊ฐ€ ํ•ญ์ƒ ์ž‘๋™ํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„
ํ•ญ์ƒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€
(Generator์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊นŒ์ง€) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ƒ์„ฑ๊ธฐ (BitGenerator (kwarg1 = 1, kwargs2 = b, ...))

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

Argument-less Generator (), ์ฆ‰ "์ž„์˜๋กœ ์‹œ๋“œ ๋œ PRNG๋ฅผ
numpy recommendeds "๋Š” ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ง€์›ํ•˜๋‹ค. "๋„˜ํ”ผ ๊ฐ€์ด ์‹œ๋“œ์™€ ํ•จ๊ป˜ ์ถ”์ฒœํ•˜๋Š” PRNG๋ฅผ ์ค˜"๋Š”
๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์˜ต์…˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. numpy๋ฅผ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์‹œ๋“œ ๋œ PRNG๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ํ‘œ๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‚˜๋Š” ์ข‹์•„ํ•œ๋‹ค
์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„ ์ง€์ • (๋” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด), ๊ทธ๋Ÿฌ๋‚˜
@rgommers https://github.com/rgommers๋Š” ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋จผ ๋‹จ๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์ •ํ•œ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKA4SSNW6XZEVFUMCDPXVGW5A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSEXG43VMVORP,TDN5W965ZLOBW63LNMVWXHJK
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABKTSROCMLHG6E6BLWI6TWDPXVGW5ANCNFSM4HPX3CHA
.

2019 ๋…„ 5 ์›” 28 ์ผ ํ™”์š”์ผ 16:38 Robert Kern [email protected] ์ž‘์„ฑ :

"๊ธฐ๋ณธ๊ฐ’"์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ์€ ๊ตฌํ˜„์œผ๋กœ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Generator ()๊ฐ€ ํ•ญ์ƒ ์ž‘๋™ํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„
ํ•ญ์ƒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€
(Generator์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊นŒ์ง€) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ƒ์„ฑ๊ธฐ (BitGenerator (kwarg1 = 1, kwargs2 = b, ...))

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

Argument-less Generator (), ์ฆ‰ "์ž„์˜๋กœ ์‹œ๋“œ ๋œ PRNG๋ฅผ
numpy recommendeds "๋Š” ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ง€์›ํ•˜๋‹ค. "๋„˜ํ”ผ ๊ฐ€์ด ์‹œ๋“œ์™€ ํ•จ๊ป˜ ์ถ”์ฒœํ•˜๋Š” PRNG๋ฅผ ์ค˜"๋Š”
๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์˜ต์…˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. numpy๋ฅผ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์‹œ๋“œ ๋œ PRNG๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ํ‘œ๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋‚˜๋Š” ์ข‹์•„ํ•œ๋‹ค
์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„ ์ง€์ • (๋” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด), ๊ทธ๋Ÿฌ๋‚˜
@rgommers https://github.com/rgommers๋Š” ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋จผ ๋‹จ๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์ •ํ•œ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKA4SSNW6XZEVFUMCDPXVGW5A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSEXG43VMVORP,TDN5W965ZLOBW63LNMVWXHJK
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABKTSROCMLHG6E6BLWI6TWDPXVGW5ANCNFSM4HPX3CHA
.

์‚ฌ์šฉ์„ฑ ๊ด€์ ์—์„œ Generator(seed) ๋ฅผ ์ง€์›ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ค€๋น„๋˜์ง€ ์•Š์€ ์„ ํƒ์„ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” RandomState ์„ ๊ณ ์ˆ˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ ๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ Generator , ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” bit_version=1 ๋Œ€์‹  version=1 ๋‚˜๋Š” ๋˜ํ•œ ํ•˜๋ฝ์œผ๋กœ ํ™•์ธ ํ•ด์š”ํ•˜์ง€๋งŒ, version ์ƒ๊ฐ. ์‚ฌ์šฉ์ž๊ฐ€ ๋น„ํŠธ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋งค์šฐ ์ž์ฃผ ๋ช…์‹œ ์ ์œผ๋กœ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์ƒ์„ฑ๊ธฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋Š” ์ƒˆ๋กญ๊ณ  ์ผ๋ฐ˜์ ์ธ BitGenerator API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ DefaultBitGenerator ๋˜๊ฑฐ๋‚˜, ParallelBitGenerator ์™€ ๊ฐ™์ด ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด RNG ์ŠคํŠธ๋ฆผ์˜ ํ–ฅํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๋Š” ๊ทธ๋Ÿฌํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•˜์ง€ ์•Š์ง€๋งŒ ์ž„์˜์˜ ์ˆซ์ž๊ฐ€ ์ž๋ฐœ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด Generator์—์„œ seed ๋ฅผ ์„ค์ • ํ•œ ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์†Œ์Œ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” RandomState๋ฅผ ๊ณ ์ˆ˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์–ผ๋ฆฌ ์–ด๋‹ตํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ ๊ฐ€๋Šฅํ•œ API๋ฅผ ์œ„ํ•ด ์—ด์‹ฌํžˆ ์ถ”์ง„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ๋„ˆ๋ฌด ์–ด๋ ต์Šต๋‹ˆ๊นŒ?). ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ API๋ฅผ ๋„“ํž ์ˆ˜ ์žˆ์ง€๋งŒ ์ถ•์†Œํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Generator(Philox()) , Generator(seed(3)) ๋ฐ Generator(bit_version=1) ์‚ฌ์ด์˜ ๋‰˜์•™์Šค๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ง€๊ธฐ ์ „๊นŒ์ง€๋Š” ํ™•์ธํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Generator(seed) ์—†์ด ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Generator(seed) ์—†์ด ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”, ์—ฌ๊ธฐ์—๋Š” ์‹ฌ๊ฐํ•œ ์ด์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹น๋ถ„๊ฐ„ ์ „์ฒด BitGenerator๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ PRNG๋ฅผ ๋งŒ๋“  ๋‹ค์Œ (์‹œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ์ž˜ ์‹œ๋“œ๋˜๋„๋ก ํ•จ) ํ”ผํดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ง์„ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฌ์ธ๋ ฅ์ด ๊ฑฐ์˜ ์—†๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด "๊ธ€์Ž„์š”, ๋ญ”๊ฐ€ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ ํ•ด์„œ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค!"

๋ฌธ์ œ์˜ ์ผ๋ถ€๋Š” MT์˜ ๊ฑฐ๋Œ€ํ•œ ์ƒํƒœ๋กœ ์ธํ•ด ์•…ํ™”๋˜๋ฉฐ, ์‹ค์ œ๋กœ ํŒŒ์ผ๋กœ์˜ ์ง๋ ฌํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋Œ„์Šค๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด API๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ํ›จ์”ฌ ์ž‘์€ ๊ธฐ๋ณธ PRNG๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํ™ฉ์ด ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 128 ๋น„ํŠธ๋Š” UUID์˜ ํฌ๊ธฐ๋กœ, 16 ์ง„์ˆ˜๋กœ ์ธ์‡„ํ•˜๊ณ  ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜์žˆ์„ ์ •๋„๋กœ ์ž‘์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ข‹์€ ํŒจํ„ด์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ข‹์€ ์—”ํŠธ๋กœํ”ผ ์‹œ๋“œ๊ฐ€๋˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๋‹ค์Œ์— ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ์ธ์‡„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โฏ python secret_prng.py
Seed: 0x977918d0c7da45e5168f72005586500c
...
Result = 0.7223650399276123

โฏ python secret_prng.py
Seed: 0xe8962534e5fb585483b86119fcb852ce
...
Result = 0.10640984721018876

โฏ python secret_prng.py --seed 0xe8962534e5fb585483b86119fcb852ce
Seed: 0xe8962534e5fb585483b86119fcb852ce
...
Result = 0.10640984721018876

์ด์™€ ๊ฐ™์€ ํŒจํ„ด์ด ๋‹จ์ˆœ์„ฑ๊ณผ ๋ฏธ๋ž˜ ๋ณด์žฅ์„ฑ์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

NumPy 1. ๋‹ค์Œ

class Generator:
    def __init__(bitgen_or_seed=None, *, bit_generator='pcg64', inc=0):

NumPy 1.20.x

```ํŒŒ์ด์ฌ
ํด๋ž˜์Šค ์ƒ์„ฑ๊ธฐ :
def __init __ (bitgen_or_seed = None, *, bit_generator = None, inc = None) :
bit_generator๊ฐ€ None์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ inc๊ฐ€ None์ด ์•„๋‹Œ ๊ฒฝ์šฐ :
warn ( '๊ธฐ๋ณธ๊ฐ’์€ PCG64์—์„œ AESCtr๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. inc ํ‚ค์›Œ๋“œ'
'์ธ์ˆ˜๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ํ–ฅํ›„ ๋ฐœ์ƒํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค', FutureWarning)
````

NumPy 1.22

```ํŒŒ์ด์ฌ
ํด๋ž˜์Šค ์ƒ์„ฑ๊ธฐ :
def __init __ (bitgen_or_seed = None, *, bit_generator = 'aesctr', inc = None, counter = 0) :
bit_generator == 'pcg64'๋˜๋Š” inc๊ฐ€ None์ด ์•„๋‹Œ ๊ฒฝ์šฐ :
์˜ˆ์™ธ ๋ฐœ์ƒ ( 'PCG๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ inc๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
````

์ด์™€ ๊ฐ™์€ ํŒจํ„ด์ด ๋‹จ์ˆœ์„ฑ๊ณผ ๋ฏธ๋ž˜ ๋ณด์žฅ์„ฑ์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ https://github.com/numpy/numpy/issues/13635#issuecomment -496589421์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๋†€๋ž๊ณ  ์‹ค๋ง์Šค๋Ÿฌ์šด ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ ํ•  ๊ณ„ํš๋ณด๋‹ค ๋ช…์‹œ์ ์ธ BitGenerator ๊ฐœ์ฒด๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. API๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฉ์‹์œผ๋กœ ์†์ƒ๋˜์—ˆ์Œ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋Š” ์‹ค์ œ๋กœ ์ตœํ›„์˜ ์ˆ˜๋‹จ์ด๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ณผ๋„๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์ „ํ™˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ „ํ™˜ ํ•  ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—†๋Š” ๊ฐ‘์ž๊ธฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ตœ์†Œํ•œ Generator(seed) "์ €์—๋„ˆ์ง€ ์ƒํƒœ"์—์„œ Generator(seed, bit_generator='aesctr') ์˜ ๋œ ํŽธ๋ฆฌํ•œ "๊ณ  ์—๋„ˆ์ง€ ์ƒํƒœ"๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด API์˜ ๋ชฉํ‘œ๋Š” ํŽธ๋ฆฌํ•œ "์ €์—๋„ˆ์ง€ ์ƒํƒœ"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ์ „ํ™˜ ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์€ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ํžˆ์Šคํ† ๊ทธ๋žจ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜ ์ธ IIRC๋กœ์ด ์ž‘์—…์„ ํ•œ ๋ฒˆ ์ˆ˜ํ–‰ํ–ˆ๋Š”๋ฐ ์•…๋ชฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ธ์ˆ˜์˜ ์˜๋ฏธ๋ฅผ ์ œ์ž๋ฆฌ์—์„œ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๋ชจ๋“  ์ง€์› ์ค‘๋‹จ์— ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ธฐ๋Šฅ์—์„œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ _ ์ด๋™ _ํ•˜๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ์€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์˜นํ˜ธํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Generator(seed) ์—†์ด ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

"์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „"์ด๋ž€ ์ „์ฒด numpy ๋ฆด๋ฆฌ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด PR์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ (์ดํ›„ ๋ฐœ์ƒ)?

์ „์ฒด numpy ๋ฆด๋ฆฌ์Šค ์ธ ๊ฒฝ์šฐ ๋ช‡ ๊ฐœ์˜ BitGenerator ๋ฅผ ํฌํ•จํ•˜๋Š”์ง€์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ „์ฒด ๋ณด์™„์„ ํฌํ•จํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ธฐ๋Šฅ์—์„œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ _ ์ด๋™ _ํ•˜๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ์€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์˜นํ˜ธํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1 ๋™์˜ ํ•จ

์•„๋‹ˆ์š”, ์‚ฌ๋žŒ๋“ค์ด ์ž‘์—…ํ•˜๋˜ default_generator (seed)์™€ ๊ฐ™์€ "์ง€์ •๋œ ์ด๋™ ๋Œ€์ƒ"API (์˜ˆ : @shoyer ์˜ ๋ฒ„์ „ ์ธ์ˆ˜) ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NEP 19์—์„œ ๋ถ€์ธํ•˜๋Š” ์ŠคํŠธ๋ฆผ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ API ์†์ƒ์— ์ด์ฐจ์ ์ž…๋‹ˆ๋‹ค. BitGenerator๋งˆ๋‹ค ํšจ๊ณผ์ ์ธ API๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์•„, ์ด์ œ ๋” ์ดํ•ด๊ฐ€ ๋˜๋„ค์š”.

์ด์ƒํ•˜๊ฒŒ ๋“ค๋ฆฌ๋Š” ์ด๋ฆ„์ด ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ์ •์ฑ…์ด ๋™์ผํ•˜๋‹ค๋ฉด ๋” ์นœ์ˆ™ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค (์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด์ „ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ทธ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ผ์„ ๋„ˆ๋ฌด ์ž์ฃผํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ •์ƒ์ ์ธ ์ด๋ฆ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ฝ” ํ•„์š”๋กœํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฑด์ „ํ•œ ์ด๋ฆ„์˜ ๋„“์€ ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

np.random.generator ๋˜๋Š” np.random.default_generator .

์šฐ๋ฆฌ๊ฐ€ ํฌํ•จํ•˜๋Š” BitGenerator์˜ ์ˆ˜

ํ˜„์žฌ ํฌํ•จ ๋œ ํ•ญ๋ชฉ (MT19937, DSFMT, PCG32, PCG64, Philox, ThreeFry, Xoshiro256, Xoshiro512)์—์„œ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๋Š” ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์„œ ๋‹น๋ฉดํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค : ์–ด๋–ค BitGenerator๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด์–ด์•ผํ•˜๋Š”์ง€ (ํ˜„์žฌ Xoshiro256 )

๊ธ€์Ž„,์ด ๋ฌธ์ œ๋Š” "์–ด๋–ค ๊ฒƒ์ด ๊ณ ์œ  ํ•œ BitGenerator ๋กœ ํ™๋ณดํ•ด์•ผํ•˜๋Š”์ง€"์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ๊ฐ’ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ด์•ผํ•˜๋Š” ํ•ญ๋ชฉ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ (๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ)์€ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ๋ชจ๋‘ ํ•จ๊ป˜ ๊ฒฐ์ •๋˜์–ด์•ผํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํฐ ํ„ธ์ด ์—‰๋ง์ด๊ณ , ๋‹น์‹ ์ด์ด PR์„ ์ˆ˜ํ–‰ ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ๋งˆ์นœ ํ›„์—๋Š” ์•„๋ฌด๋„ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฉ”๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์— ์ง€์ณค์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. :-)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด์— ๊ด€ํ•œ ํ•œ ์ด๋ฏธ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. RandomState ๋ฐ ๋น„๊ต ๋ชฉ์ ์œผ๋กœ MT19937 ์„ ์œ ์ง€ํ•ด์•ผํ•˜๋ฉฐ ์ถ”์ฒœ ๋ชฉ์ ์œผ๋กœ PCG64 ๋ฅผ) ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ ํƒ์ƒ‰๊ธฐ์—์„œ ์•ฝ๊ฐ„ ์—‰๋ง์ด๋˜์—ˆ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ clang์˜ uint128_t ์ˆ˜ํ•™์— ๊ฐ€๊นŒ์šด ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋„๋กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 64 ๋น„ํŠธ MSVC ์šฉ PCG64๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : https : // godbolt .org / z / ZnPd7Z

์ง€๊ธˆ์€ Windows ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ _ ์ •ํ™•ํ•œ ๊ฒƒ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ...

ํŒจ์น˜ ์—†์Œ :

Uniforms per second
************************************************************
PCG64            62.77 million

ํŒจ์น˜ ํฌํ•จ :

Uniforms per second
************************************************************
PCG64           154.50 million

ํŒจ์น˜๋Š” 2 ๊ฐœ์˜ ๋‹ค๋ฅธ ์‹œ๋“œ์— ๋Œ€ํ•ด ๋™์ผํ•œ 1000 ๊ฐœ์˜ uint64 ๊ฐ’ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

GCC ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ ๋น„๊ต ๋ชจ๋“œ์— ๋Œ€ํ•œ ๋น„๊ต :

Time to produce 1,000,000 Uniforms
************************************************************
Linux-64, GCC 7.4                      PCG64            4.18 ms
Linux-64, GCC 7.4, Forced Emulation    PCG64            5.19 ms
Win64                                  PCG64            6.63 ms
Win32                                  PCG64           45.55 ms

์™€, ์ •๋ง ์•ˆ ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”. ์•„๋งˆ๋„ ๋น„๊ต ํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋™์ผํ•œ ์‹œ์Šคํ…œ์—์„œ msvc2017-on-win {64, 32} ๋Œ€ gcc7.4-on-linux {64, 32}์˜ ์„ฑ๋Šฅ์„ ์ž…์ฆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋‹จ์ง€ msvc2017์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •๋ณด๋ฅผ ์–ด๋”˜๊ฐ€์— ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).

Win32๋Š” ์—ฌ๊ธฐ์„œ ํฌ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค. Linux 32 ๋น„ํŠธ๋„ ์ƒ๋‹นํžˆ ๋”์ฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ•  32 ๋น„ํŠธ Linux ์‹œ์Šคํ…œ์ด ์—†์Šต๋‹ˆ๋‹ค.

32 ๋น„ํŠธ ์ปดํ“จํ„ฐ์— ์ง‘์ฐฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„์œ„ํ•œ ์ถ”์ฒœ ์‚ฌ๋ก€๋ฅผ ํ™•์‹คํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ธฐ์—… IT ์ •์ฑ…์œผ๋กœ ์ธํ•ด Windows ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์Œ). ์ด recco๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. 32 ๋น„ํŠธ ์šฉ DSFMT (๋˜๋Š” MT19937๋„ ์ข‹์Šต๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ๋ฒค์น˜ ๋งˆํฌ๋Š” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ €๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์  ์ธ ๋žœ๋ค ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ž์ฃผ ๋ฐ˜๋ณต๋˜๋Š” PCG ์ฃผ์žฅ์— ๋‹ค์†Œ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ๋…๋ฆฝ์„ฑ ์ฃผ์žฅ์„ ๋’ท๋ฐ›์นจํ•˜๊ธฐ ์œ„ํ•ด ์‹ฌ๊ฐํ•œ ํ†ต๊ณ„ ๋ถ„์„์„ ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (์‚ฌ์‹ค, O'Neill์˜ ๋…ผ๋ฌธ์€ ๋…๋ฆฝ์„ฑ์„ ์ฃผ์žฅํ•˜์ง€ ์•Š๊ณ  "๊ณ ์œ  ํ•œ"ํ๋ฆ„๋งŒ์„ ์–ธ๊ธ‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

ํšŒ์˜์ ์ธ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ LCG ์Šน์ˆ˜์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ณ ์œ  ํ•œ ์ŠคํŠธ๋ฆผ์€ ๋‹จ์ˆœํžˆ ์Šค์ผ€์ผ๋ง [*]์„ ํ†ตํ•ด ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ์Šน์ˆ˜๋ฅผ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ LCG ์ŠคํŠธ๋ฆผ์ด ์ฃผ์–ด์ง€๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์‹œ์ž‘์ ์ด ๋‹ค๋ฅด์ง€๋งŒ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ์ƒ์ˆ˜ ๋ฐฐ์ˆ˜ (๋ชจ๋“ˆ๋กœ 2**64 ๋˜๋Š” 2**32 )๊ฐ€๋ฉ๋‹ˆ๋‹ค. PCG์˜ ์ˆœ์—ด ๋ถ€๋ถ„์€ ์ด๊ฒƒ์„ ์•ฝ๊ฐ„ ์ˆจ๊ธฐ๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด์ง€๋งŒ ํ†ต๊ณ„์ ์œผ๋กœ ๊ฐ์ง€ ๊ฐ€๋Šฅํ•œ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด ์‹ค์ œ๋กœ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋ณ„๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด์ง€๋งŒ, ์‹ฌ๊ฐํ•œ ํ…Œ์ŠคํŠธ ์—†์ด๋Š” ์•ก๋ฉด ๊ทธ๋Œ€๋กœ ๋…๋ฆฝ ์ŠคํŠธ๋ฆผ์˜ ์ฃผ์žฅ์„ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[*] ์˜ˆ : x[0], x[1], x[2], ... ๊ฐ€ x[i+1] := (m*x[i] + a) % 2**64 ํ‘œ์ค€ 64 ๋น„ํŠธ LCG ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • y[i] := 3*x[i] % 2**64 ๋ชจ๋“  i . ๊ทธ๋Ÿฐ ๋‹ค์Œ y[i] ํฌํ•จ ๋œ LCG ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค y[i+1] := (m*y[i] + 3*a) % 2**64 ๋‹จ์ˆœํžˆ ๋‹น์‹ ์ด ๋ณ„๊ฐœ์˜ LCG ์ค‘ ํ•˜๋‚˜ ๊ฐ™์€ ์Šน์ˆ˜ํ•˜์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ์ฒจ๊ฐ€์ œ ์ƒ์ˆ˜ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑ ํ•œ ์›๋ž˜์˜ ์ŠคํŠธ๋ฆผ์„ ํ™•์žฅํ•˜์—ฌ ์ด๋ ‡๊ฒŒ. 3 ๋Œ€์‹  ๋‹ค๋ฅธ ํ™€์ˆ˜ ์Šน์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ „์ฒด ๊ธฐ๊ฐ„ LCG์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด (๋”ฐ๋ผ์„œ a ๋Š” ํ™€์ˆ˜ ์ž„) ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ทธ ์Šน์ˆ˜๋กœ ๊ธฐ๊ฐ„ LCG.


ํŽธ์ง‘ : ํ™œ์šฉ ํด๋ž˜์Šค ์ˆ˜์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ง„์ˆ ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

PCG ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ฒ ์ €ํ•œ ๊ณต๊ฐœ ๋ถ„์„์ด ์—ฌ๊ธฐ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. http://www.pcg-random.org/posts/critiquing-pcg-streams.html

@imneme ์ตœ์ข… ์กฐ์–ธ์„ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? "David Blackman๊ณผ์˜ ๋Œ€์‘์€ ์ƒ์ˆ˜ ์‹œ๋“œ ๋ฐ 1,2,3,4์˜ ์ŠคํŠธ๋ฆผ๊ณผ ๊ฐ™์€ ์ƒ๊ด€ ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ"๊ทผ์ฒ˜ "์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ์‰ฌ์šธ ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋™์‹œ์— ์ง€๊ธˆ์€ ์ŠคํŠธ๋ฆผ ID์™€ ์‹œ๋“œ๊ฐ€ ๊ตฌ๋ณ„๋˜์–ด์•ผํ•˜๊ณ  ์„œ๋กœ ๋ช…๋ฐฑํ•œ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‘˜ ๋‹ค 1,2,3,4๋กœ ๋งŒ๋“ค์ง€ ๋ง์•„์•ผํ•ฉ๋‹ˆ๋‹ค. "

์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ์ข‹์€ ์‹œ๋“œ (์˜ˆ : ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค์—์„œ ํŒŒ์ƒ ๋จ)์™€ ์ŠคํŠธ๋ฆผ ID 1,2,3,4๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ข‹์€ ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค์—์„œ ์‹œ๋“œ์™€ ์ŠคํŠธ๋ฆผ ID๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ผ๋ถ€ Linux-32 (Ubuntu 18.04 / GCC 7.4) ๋ฒˆํ˜ธ

Time to produce 1,000,000 Uniforms
***************************************************************
Linux-64, GCC 7.4                      PCG64            4.18 ms
Linux-64, GCC 7.4, Forced Emulation    PCG64            5.19 ms
Win64                                  PCG64            6.63 ms
Win32                                  PCG64           45.55 ms
Linux-32, GCC 7.4                      PCG64           25.45 ms

๋”ฐ๋ผ์„œ Win-32๋ณด๋‹ค ๋‘ ๋ฐฐ ๋น ๋ฅด์ง€ ๋งŒ ๋Š๋ฆฝ๋‹ˆ๋‹ค. 4 ๊ฐœ์˜ ํƒ€์ด๋ฐ์ด ๋ชจ๋‘ ๋™์ผํ•œ ๊ธฐ๊ณ„์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

Other Linux-32/GCC 7.4 Timing Results
-----------------------------------------------------------------
DSFMT            6.99 ms
MT19937         13.09 ms
Xoshiro256      17.28 ms
numpy           15.89 ms

NumPy๋Š” NumPy 1.16.4์ž…๋‹ˆ๋‹ค. DSFMT๋Š” 32 ๋น„ํŠธ (x86)์—์„œ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  32 ๋น„ํŠธ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. MT19937์€ 32 ๋น„ํŠธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋„ ๋น„๊ต์  ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ ˆ๊ฑฐ์‹œ ์šฉ๋„๋กœ MT19937 ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋Š” PRNG (์˜ˆ : MT19937 ๋ฐ ๋‹จ์ผ ๋ฒ”์šฉ ๊ถŒ์žฅ ์‚ฌํ•ญ)์— ๋Œ€ํ•ด ์ตœ์†Œํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ 32 ๋น„ํŠธ ์„ฑ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๋ฒ”์šฉ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ œํ•œ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ "32 ๋น„ํŠธ ์šฉ ๊ถŒ์žฅ"PRNG๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. MT19937 ์€ (๋Š”) ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ๋ณด์œ ํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ๋งŽ์€ ํ‹ˆ์ƒˆ ์šฉ๋„๋กœ ํƒ€์‚ฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋” ์™„์ „ํ•œ PRNG ์„ธํŠธ๋ฅผ ํฌํ•จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฌธ์„œ์— ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํŠน์ • ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PCG์˜ "P"๋ถ€๋ถ„์ด ์ƒ๊ด€ ๊ด€๊ณ„ ์ŠคํŠธ๋ฆผ์˜ ์ž ์žฌ์  ์ธ ๋ฌธ์ œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์™„ํ™”ํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ (์•„๋งˆ๋„) LCG์— ๋Œ€ํ•œ ์ตœ์•…์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•œ LCG ์ŠคํŠธ๋ฆผ์˜ ๊ฐ€์‚ฐ ์ƒ์ˆ˜๋Š” ๋‹ค๋ฅธ LCG ์ŠคํŠธ๋ฆผ์˜ ๊ฐ€์‚ฐ ์ƒ์ˆ˜์˜ ์ •ํ™•ํ•œ ๋ถ€์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ์ ˆํ•˜๊ฒŒ ๋”์ฐํ•œ ์ข…์ž๋ฅผ ์„ ํƒํ•˜๋ฉด LCG ์ŠคํŠธ๋ฆผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ์ •ํ™•ํ•œ ๋ถ€์ •์ด๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋‘ ์ŠคํŠธ๋ฆผ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ จ์˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ PCG์˜ ์ˆœ์—ด ๋ถ€๋ถ„๊ณผ float64 ๋กœ์˜ ๋ณ€ํ™˜์ด ๋ชจ๋‘ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ˆœ์—ด์ด ์–ผ๋งˆ๋‚˜ ๋„์›€์ด๋˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๋„ํ‘œ์ž…๋‹ˆ๋‹ค.

streams

๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ๊ทธ๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ์—์„œ 10000 ๊ฐœ์˜ ํ”Œ๋กœํŠธ์˜ ์‚ฐ์ ๋„์ด๊ณ , ๋ถ€์ • ๋œ ์Œ๋‘ฅ์ด์˜ 10000์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”์ฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ›Œ๋ฅญํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ์ธ๊ณต๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์—์„œ ๋ฌด์—‡์„ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ธ์œ„์ ์ธ ์˜ˆ์ด๋ฉฐ, ๋‹น์‹ ์ด ์šฐ์—ฐํžˆ ๋งˆ์ฃผ ์น  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ƒ๊ด€๋˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜ ์ƒ๊ฐ๊ณผ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด ๋‹ค์Œ์€ ์ถœ์ฒ˜์ž…๋‹ˆ๋‹ค.

import matplotlib.pyplot as plt
import numpy as np

from pcgrandom import PCG64

gen1, gen2 = PCG64(), PCG64()
multiplier, increment, state = gen1._get_core_state()
new_increment, new_state = -increment % 2**128, -state % 2**128
gen2._set_core_state((multiplier, new_increment, new_state))

xs = np.array([gen1.random() for _ in range(10**4)])
ys = np.array([gen2.random() for _ in range(10**4)])
plt.scatter(xs, ys, s=0.1)
plt.show()

PCG64๋Š” O'Neill์ด PCG-XSL-RR์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค (PCG ๋ฌธ์„œ์˜ ์„น์…˜ 6.3.3). pcgrandom ํŒจํ‚ค์ง€๋Š” ์—ฌ๊ธฐ์—์„œ

๋…๋ฆฝ ์ŠคํŠธ๋ฆผ์„ ์–ป๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์€ jumpahead ()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
"๋…๋ฆฝ์  ์ธ"์ŠคํŠธ๋ฆผ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์‹œ๋“œํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

์นด์šดํ„ฐ / ํ•ด์‹œ ์ƒ์„ฑ๊ธฐ์—๋Š” ๊ฐ„๋‹จํ•œ jumpahead ()๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. PCG๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์‚ฌ์šฉ์ž์˜ ๋ถ€ํƒ : ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ๋น„ํŠธ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.
๋ฌด์ œํ•œ ์ƒํƒœ ๊ณต๊ฐ„์ด์žˆ๋Š” ์•”ํ˜ธํ™” ํ’ˆ์งˆ.

๊ฑด๋ฐฐ,
ํ•„๋ฆฝ

(seberg ํŽธ์ง‘ : ์ด๋ฉ”์ผ ๊ฒฌ์  ์ œ๊ฑฐ)

@pbstark : ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๋‹ค์‹œ ์‹œ๋“œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๊ธฐ๋ณธ LCG ์ƒ์„ฑ๊ธฐ๋Š” ์‹ค์ œ๋กœ ๊ตฌ๋ณ„๋ฉ๋‹ˆ๋‹ค : x โ†ฆ mx + a (mod 2 ^ 128) ๋ฐ x โ†ฆ mx + b (mod 2 ^ 128) for different increments a and b. O'Neill์˜ PCG ๋…ผ๋ฌธ์€ LCG ์ฆ๋ถ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ํŒ๋งคํ•ฉ๋‹ˆ๋‹ค (๋…ผ๋ฌธ์˜ ์„น์…˜ 4.3.2 ์ฐธ์กฐ).

๊ทธ๋Ÿฌ๋‚˜ LCG์˜ ๋‹จ์ˆœ์„ฑ์€ ๋‹จ์ˆœ ์„ ํ˜• ๋ณ€ํ™˜ (์ƒ์ˆ˜์— ์˜ํ•œ ๊ณฑ์…ˆ ๋˜๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ƒ์ˆ˜ ์ถ”๊ฐ€)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ถ”๊ฐ€ ์ƒ์ˆ˜ _does_๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ž˜ ์ƒ์„ฑ๊ธฐ์—์„œ ์•Œ ์ˆ˜์—†๋Š” ์–‘๋งŒํผ ์•ž๋‹น๊ฒจ์ง„๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

PCG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋ฉฐ NumPy์˜ ์ƒˆ๋กœ์šด ๋ฉ”์ธ PRNG์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ž ์‹œ ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด "๋…๋ฆฝ์  ์ธ"๋žœ๋ค ์ŠคํŠธ๋ฆผ์˜ ์•ฝ์†์— ํœฉ์‹ธ์ด๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ PCG์— ๋Œ€ํ•œ ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ ์•„์ด๋””์–ด๋Š” ๋น ๋ฅธ ์ ํ”„์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋ณด๋„ˆ์Šค ์ถ”๊ฐ€ ๊ณฑ์…ˆ ๋˜๋Š” ๊ฐ€์‚ฐ ๋ณ€ํ™˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์„ ํฌํ•จํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฉ”๋ชจ : ํ•ฉ์˜๋Š” ์ฃผ๋ณ€์— ๋ช‡ ๊ฐœ์˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋” ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ๊ฒฝํ–ฅ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ์ž‘์€ ๋ฌธ์„œ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ๋„ˆ๋ฌด ํฌ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ผ€๋นˆ๊ณผ ๋กœ๋ฒ„ํŠธ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ์šฐ๋ฆฌ๊ฐ€ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ ์ฐธ๊ณ  : ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ RNG ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋‹จ์ ์€ ์ฝ”๋”ฉํ•˜๋Š” ๋™์•ˆ ์ด๋ฆ„์„ ์ฐพ์•„์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ๊ฒŒ ํ‘œ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋“œ์—†์ด ๊ธฐ๋ณธ RNG์— ๋Œ€ํ•œ ์ตœ์†Œ ๋…ธ์ถœ API๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

@mdickinson , ๊ทธ๋ž˜ํ”„๋ฅผ ์ง์ ‘ ์žฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ํ‘œ์ค€ C ++ ๋ฒ„์ „ ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

#include "pcg_random.hpp"
#include <iostream>
#include <random>

int main() {
    std::random_device rdev;
    pcg_detail::pcg128_t seed = 0;
    pcg_detail::pcg128_t stream = 0;
    for (int i = 0; i < 4; ++i) {
        seed   <<= 32;           
        seed   |= rdev();
        stream <<= 32;           
        stream |= rdev();
    }
    pcg64 rng1(seed,stream);
    pcg64 rng2(-seed,-stream);
    std::cerr << "RNG1: " << rng1 << "\n";
    std::cerr << "RNG2: " << rng2 << "\n";
    std::cout.precision(17);
    for (int i = 0; i < 10000; ++i) {
        std::cout << rng1()/18446744073709551616.0 << "\t";
        std::cout << rng2()/18446744073709551616.0 << "\n";
    }
}

์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ฉด (์žฌํ˜„์„ฑ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

RNG1: 47026247687942121848144207491837523525 203756742601991611962280963671468648533 41579532896305845786243518008404876432
RNG2: 47026247687942121848144207491837523525 136525624318946851501093643760299562925 52472962479578397910044896975270170620

๋‹ค์Œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด ์ˆ˜์žˆ๋Š” ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ :

corr1

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋‹ค๋ฅด๊ฒŒํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ฐ˜๋ฐ•ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ฐ˜๋ฐ•ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์จ์„œ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ํ‰์†Œ ๋„๊ตฌ.)

@mdickinson ์€ ๊ณ„์‚ฐ ๋œ ์ƒํƒœ์—์„œ ๊ตฌ๋ฉ์„ ํ•˜์—ฌ ๋‘ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋˜๋Š”

์ €๋Š” PractRand์— ๊ณต๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ ์—ฌ๋Ÿฌ PCG32 ์ŠคํŠธ๋ฆผ์„ ์ธํ„ฐ๋ฆฌ๋ธŒํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋“œ๋ผ์ด๋ฒ„ ์Šคํฌ๋ฆฝํŠธ ๋ฅผ master ์˜ numpy๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ๋Œ€์ ์ธ ๋‚ด๋ถ€ ์ƒํƒœ / ์ฆ๊ฐ€๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜๋ฉด PractRand๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ ๋Œ€์  ์ƒํƒœ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ ๋Œ€์  _seeds_ (์‹ค์ œ๋กœ ์ด๋‹ˆ์…œ ๋ผ์ด์ € ๋ฃจํ‹ด์„ ํ†ต๊ณผํ•˜๋Š”)๋ฅผ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋‚ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด PCG์˜ ์ŠคํŠธ๋ฆผ์€ SplitMix์™€ ๋งŽ์€ ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@mdickinson ์˜ ๊ทธ๋ž˜ํ”„์™€ ๊ด€๋ จํ•˜์—ฌ ์นด์šดํ„ฐ ๊ธฐ๋ฐ˜ ์•”ํ˜ธํ™”๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์ฒด ์ƒํƒœ๋ฅผ ์‹œ๋“œ ํ•  ์ˆ˜์žˆ๋Š” _every_ PRNG์˜ ๊ฒฝ์šฐ ์ถœ๋ ฅ์ด ์–ด๋–ค ๋ฐฉ์‹ ์œผ๋กœ๋“  ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€์žˆ๋Š” PRNG๊ฐ€์žˆ๋Š” ์‹œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•). ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์—์žˆ๋Š” PRNG ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข…์ข… ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ƒํƒœ ์‹œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” PRNG๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์˜ ๊ทนํžˆ ์ผ๋ถ€์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ์•ก์„ธ์Šค ๋งŒ ์ œ๊ณตํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋„์ž…๋ฉ๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ์„ ์ƒ๊ฐํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์‹œ๋“œํ•ด์•ผํ•˜๋Š” ๋” ์ž„์˜์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. 1,2,3๊ณผ ๊ฐ™์€ ์ž‘์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ _any_ PRNG์— ๋Œ€ํ•œ ์‹œ๋“œ ๋ชฉ์ ์— ๋Œ€ํ•ด ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค (๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋Ÿฌํ•œ ์‹œ๋“œ๋ฅผ ์„ ํ˜ธํ•˜๋ฉด ํ•ด๋‹น ์ดˆ๊ธฐ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹๊ณผ๋„ํ•˜๊ฒŒ ํ‘œํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๋‹จ์ง€ ์ƒํƒœ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Marsaglia๊ฐ€ XorWow ์—์„œ ํ•œ counter ๋Š” ๋‚˜๋จธ์ง€ ์ƒํƒœ์™€ ์ „ํ˜€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ LCG์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ดˆ๊ธฐ ๊ฐ’์˜ ๋ณ€ํ˜•์€ ์‹ค์ œ๋กœ ์ถ”๊ฐ€ ๋œ ์ƒ์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

SplitMix, PCG ๋ฐ XorWow์˜ ์ŠคํŠธ๋ฆผ์€ "๋ฉ์ฒญํ•œ"์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ƒ์„ฑ๊ธฐ์˜ ์‚ฌ์†Œํ•œ ์žฌ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์ด ์—†์œผ๋ฉด PRNG๊ฐ€ 42์˜ ํฅ๋ฏธ๋กœ์šด ๊ทผ์ ‘ ๋ฐ˜๋ณต์„ ๊ฐ–๋Š”๋‹ค ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 42๋Š” ๋น ๋ฅด๊ฒŒ ์—ฐ์†์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ž๋ฅด๊ณ  42์— ๋Œ€ํ•ด์„œ๋งŒ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋ฆฌ์„์€ "๋‹จ์ง€ ์ฆ๋ถ„"๋˜๋Š” "๋‹จ์ง€ xor"์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ์ด์ƒํ•œ ๋ฐ˜๋ณต์„ 42๋กœ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆซ์ž๋Š” ๊ทธ๋“ค์ด ์ด์ƒํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ŠคํŠธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Xoshiro 256์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ ๋ฅผ ๋ณต๊ตฌ

์ €๋Š” ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์•”ํ˜ธํ™” ์ธก๋ฉด์—์„œ ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://cryptography.io/en/latest/ from the Python Cryptographic Authority ?

๋‚œ์ˆ˜ ์ƒ์„ฑ ์— ๊ด€ํ•œ ํŽ˜์ด์ง€์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Python 3.6๋ถ€ํ„ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ˜•์‹์— ๋Œ€ํ•œ ํŠน์ • ๋„์šฐ๋ฏธ์™€ ํ•จ๊ป˜ ์•”ํ˜ธ ํ•™์ ์œผ๋กœ ์•ˆ์ „ํ•œ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” secrets ๋ชจ๋“ˆ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ๋Œ€์— ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” crypotgraphic ๊ฒฌ๊ณ ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์ž ์žฌ์  ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด NumPy ๋Œ€ pyca์™€ ํ†ต์‹ ํ•˜๊ณ  ์•„๋งˆ๋„ ํƒ€์‚ฌ ์ƒ์„ฑ๊ธฐ / ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ณ  ์ ์ ˆํ•œ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Nathaniel์ด ์ด์ „์— ๋น„์Šทํ•œ ์šฐ๋ ค๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์ž ์žฌ์  ์ธ dtype ๋ฆฌํŒฉํ„ฐ๋ง / ํ–ฅ์ƒ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์€ ๋งค์šฐ ๋‹ค์–‘ํ•œ ์ „๋ฌธํ™” ๋œ ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€ํ•˜๋Š” ๋ถ€๋‹ด์„ ๋ฐ˜๋“œ์‹œ ์งŠ์–ด์ง€์ง€ ์•Š๊ณ  API ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BTW, Vigna์˜ PCG ๋น„ํ‰ [ ์„น์…˜ ]์— ๋Œ€ํ•œ ์ €์˜ ์‘๋‹ต ์—์„œ ์ƒ๊ด€ ๋œ PRNG ์ƒํƒœ๋ฅผ ๊ณ ์•ˆํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ชฉ๊ฒฉ ํ•œ ๊ฒƒ์€ PCG๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋ฆฌ ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ฑฐ๋ฆฌ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์ธํ•˜์—ฌ ์ธ์œ„์ ์ธ ์”จ์•—์„ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ ๊ธฐ๋Šฅ์ด์—†๋Š” PRNG์—์„œ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž˜๋ชป๋œ ์„ ํƒ (ํŠนํžˆ ์‹œ๋“œ๋ฅผ์œ„ํ•œ ๊ณต์šฉ API๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ) ์ธ ์‹œ๋“œ ์Œ์„ ์ปจํŠธ๋ฆฌ ์…˜ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๋…ธ๊ณจ์ ์ธ ์ธ์œ„๋„ ๊ฐ์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œํŽธ์œผ๋กœ๋Š” ์ข‹์•„ํ•˜๋Š” (๋˜๋Š” ๊ฐ€์žฅ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”) PRNG๋ฅผ ๊ฐ€์ ธ ์™€์„œ ์žฌ๋ฏธ ์žˆ๊ฑฐ๋‚˜ ๋”์ฐํ•œ ์ผ (์˜ˆ : ์ด ๋ณ‘๋ฆฌ )์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์”จ์•—์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํฐ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง๋ฉด ํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” _ ๋ชจ๋“  PRNG (๊ณผ๊ฑฐ ๋ฐ ๋ฏธ๋ž˜)์— ๋Œ€ํ•ด _ 32 ๋น„ํŠธ ์‹œ๋“œ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋”์ฐํ•œ ์•„์ด๋””์–ด์ด๋ฉฐ ์–ด๋–ค PRNG๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ์‚ฌ์†Œํ•œ ํŽธ๊ฒฌ์„ ์œ ๋ฐœํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•˜๊ณ  ๋Œ€์‹  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Mersenne Twister๋ฅผ ๊ฑฐ์˜ 0 ์ƒํƒœ (๋˜๋Š” LFSR์ด ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋‘ 0 ์ƒํƒœ!)๋กœ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ๋˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์•  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Xoshiro๋ฅผ 11 ๊ฐœ์˜ ์ถœ๋ ฅ ๊ณต๊ฐ„์—์„œ 7 ๋ฒˆ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ๋‘ ๊ฐœ์˜ ์œ ์‚ฌํ•œ PCG ์ŠคํŠธ๋ฆผ ๋“ฑ์„ ๋ณ€ํ™˜ํ•˜๋Š” ์ง€์  ๊ทผ์ฒ˜๋กœ Xoshiro๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„ ๋ฐ์ดํ„ฐ๋กœ ์‹œ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ „ํ™˜๋งŒํผ ์ง€์ ์œผ๋กœ ํฅ๋ฏธ๋กญ๊ณ  ํ•™๋ฌธ์ ์œผ๋กœ ํฅ๋ฏธ๋กญ์ง€ ๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์”จ ๋ฟŒ๋ฆฌ๊ธฐ์— ๋Œ€ํ•ด ๊ทธ๋“ค์ด ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฑฐ์˜ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋กœ๋งˆ๊ฐ€ ๋ถˆํƒ€ ์˜ค๋ฅด๋Š” ๋™์•ˆ ์–ด์Šฌ๋  ๊ฑฐ๋ฆฌ๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋Œ€๋ถ€๋ถ„ ๋ฌด์‹œํ•˜๋ฉด์„œ ๊ทธ๋“ค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

inc=1,2,3,4 ์ด (๊ฐ€) ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๋ฉด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๋œป์ด ์•„๋‹Œ๊ฐ€, ์•„๋‹ˆ๋ฉด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ API๋ฅผ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๋Š” ๋œป์ด ์•„๋‹๊นŒ์š”? new_generator = (Bit)Generator().independent() ์กฐ์ฐจ๋„ (๊ธฐ๋ณธ) ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๊ฐ€์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ 32 ๋น„ํŠธ ์‹œ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚˜์œ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋™๊ฒฐ์„์œ„ํ•œ ์‹œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ์œ„ํ•œ ๋ฉ‹์ง„ API๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋„ ๋ชฐ๋ผ. "์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ณ ์ • ๋œ ์‹œ๋“œ ์บ์‹œ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ"์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

PCG์˜ ๊ฒฝ์šฐ ์‹œ๋“œ-> uint64_t [2]-> splitmix64 (seed_by_array)-> uint128์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ฎ๊ณ  ์—ฐ์†์ ์ธ ์‹œ๋“œ๊ฐ€ ํฉ์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PCG์˜ ๊ฒฝ์šฐ ์‹œ๋“œ-> uint64_t [2]-> splitmix64 (seed_by_array)-> uint128์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ฎ๊ณ  ์—ฐ์†์ ์ธ ์‹œ๋“œ๊ฐ€ ํฉ์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ข‹์€ ์ •์ˆ˜ ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. (๊ทธ๊ฒƒ์€ bijection์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.). ์‹ธ๊ณ  ์งง์€ ๊ฒƒ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Multiplyโ€“XorShift ๋ช‡ ๋ผ์šด๋“œ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@mdickinson ์˜ ๊ด€์ ์—์„œ, ๋‚˜๋Š” ๊ทธ๊ฐ€ ์—ฌ์ „ํžˆ ์ŠคํŠธ๋ฆผ ์˜์กด์„ฑ์ด ์ž‘์€ ์ธ์œ„์  / ์ ๋Œ€์  ์„ค์ •์œผ๋กœ ์ œํ•œ๋œ๋‹ค๋Š” ์•ฝ๊ฐ„์˜ ์„ค๋“๋ ฅ์„ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ ์ ์ ˆํ•œ ๊ด€ํ–‰์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํ˜„์žฌ ์ฝ”๋“œ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ API์— ์‰ฝ๊ฒŒ ๋น ์ ธ๋“ค ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‚˜์œ ์ƒํƒœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. seed=1 ์™€ inc=0,1,2,... ํ•˜๋ฉด ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋Š” David Blackman์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋ฆฌ๋ธŒ ๋œ PCG32 ์ŠคํŠธ๋ฆผ ์šฉ ์ตœ์‹  PractRand ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ์ž…์ฆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โฏ ./pcg_streams.py --seed 1 --inc 0 |time ./RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 12728272447693586011,
            "inc": 1
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 7009800821677620407,
            "inc": 3
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0x470537d5
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0x470537d5
length= 128 megabytes (2^27 bytes), time= 4.0 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+0,13-3,T)                  R=  +9.6  p =  2.3e-4   mildly suspicious
  ...and 116 test result(s) without anomalies

rng=RNG_stdin32, seed=0x470537d5
length= 256 megabytes (2^28 bytes), time= 8.7 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+0,13-2,T)                  R= +26.1  p =  6.3e-13    FAIL           
  ...and 123 test result(s) without anomalies

./RNG_test stdin32  8.86s user 0.11s system 93% cpu 9.621 total

๋‚˜๋Š” ์•„์ง ์ž„์˜์˜ ์‹œ๋“œ๋กœ ์‹คํŒจํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋™์ผํ•œ ๊ทผ์ ‘ ์ฆ๋ถ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์ผ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž์— ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ถŒ์žฅ๋˜๋Š” ๊ธฐ๋ณธ ์ฆ๋ถ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„๋งˆ ๊ทธ๊ฒƒ์„ ๊ณ ์ณ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ 2*inc + 1 ๋Œ€์‹  ์ฃผ์–ด์ง„ ์ŠคํŠธ๋ฆผ ID์—์„œ ์‹ค์ œ ์ฆ๋ถ„์„ ๋„์ถœํ•˜๋Š” ์ข‹์€ ๊ธฐ๋ณธ ์ˆซ์ž ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋ณธ ์—”ํŠธ๋กœํ”ผ ์‹œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ฆ๋ถ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋˜๋Š” ์—”ํŠธ๋กœํ”ผ ์ƒ˜ํ”Œ๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ €์žฅํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ "์ดˆ๊ธฐ ์ƒํƒœ"๋ฅผ ๋ถˆํˆฌ๋ช… ํ•œ ํŒŒ์ผ์ด ์•„๋‹Œ ๋™๋ฃŒ์˜ ์ด๋ฉ”์ผ์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ๋‹จ์ผ ์ˆซ์ž๋กœ ์ธ์ฝ”๋”ฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ 128 ๋˜๋Š” 256 ๋น„ํŠธ์— ๋ถˆ๊ณผํ•œ์ด ์ž‘์€ PRNG๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 16 ์ง„์ˆ˜๋กœ ๋กœ๊ทธ ํŒŒ์ผ์— ์‰ฝ๊ฒŒ ์ธ์‡„ ํ•œ ๋‹ค์Œ ์žฌํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋ช…๋ น ์ค„์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 32 ๋น„ํŠธ ์ •์ˆ˜๋ณด๋‹ค ํฌ์ง€ ๋งŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ŠคํŠธ๋ฆผ ID๋ฅผ ์—”ํŠธ๋กœํ”ผ ์ƒ˜ํ”Œ๋งํ•ด์•ผํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ์žŠ์–ด ๋ฒ„๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์ƒํƒœ ํŒŒ์ผ ์–ด๋”˜๊ฐ€์— ๊ธฐ๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋ ค๋Š” ๊ณณ์—์„œ ๋…ผ์˜ํ•œ ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ฐฐ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ŠคํŠธ๋ฆผ ID๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด (์นด์šดํ„ฐ์˜ ํ•ด์‹œ ๋“ฑ์„ ํ†ตํ•ด ํŒŒ์ƒ ๋  ์ˆ˜ ์žˆ์Œ) ์ŠคํŠธ๋ฆผ ID๊ฐ€ ์•„๋‹Œ ์ดˆ๊ธฐ ์‹œ๋“œ ๋งŒ ๊ธฐ๋กํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

IIRC, secrets ๋ชจ๋“ˆ์€ OS์˜ ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ถ€ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‚˜์˜๊ณ  ๋ณต์ œ / ์žฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 29 ์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 3:19 Tyler Reddy [email protected]
์ผ๋‹ค :

๋‚˜๋Š” ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์•”ํ˜ธํ™” ์ธก๋ฉด์—์„œ ์ œ์•ˆ ๋œ ๊ฒƒ์€
์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ :
Python Cryptographic Authority์˜ https://cryptography.io/en/latest/
https://github.com/pyca ?

๋‚œ์ˆ˜ ์ƒ์„ฑ์— ๊ด€ํ•œ ํŽ˜์ด์ง€
https://cryptography.io/en/latest/random-numbers/ ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

Python 3.6๋ถ€ํ„ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋น„๋ฐ€์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
https://docs.python.org/3/library/secrets.html ๋ชจ๋“ˆ.
์•”ํ˜ธ๋กœ ์•ˆ์ „ํ•œ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ˜•์‹์— ๋Œ€ํ•œ ๋„์šฐ๋ฏธ.

์„ธ๋Œ€์— ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”
crypotgraphic๊ณผ ๊ด€๋ จ๋œ ์ž ์žฌ์  ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด
๊ฒฌ๊ณ ์„ฑ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ NumPy ๋Œ€ say์—์„œ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
pyca์™€ ํ†ต์‹ ํ•˜๊ณ  ํƒ€์‚ฌ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒ์„ฑ๊ธฐ / ํ”Œ๋Ÿฌ๊ทธ์ธ. ๋‚˜๋‹ค๋‹ˆ์—˜์ด ๋น„์Šทํ•œ ์šฐ๋ ค๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
์ด์ „์—.

์‹ค์ œ๋กœ ์ž ์žฌ์  ์ธ dtype ๋ฆฌํŒฉํ„ฐ๋ง /
๊ฐœ์„  ์‚ฌํ•ญ์€ ๋˜ํ•œ API ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•„์—ฐ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ์˜ ๋ถ€๋‹ด์„
์ „๋ฌธํ™” ๋œ ์ƒˆ๋กœ์šด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWKXSSTX6QI7HJ65GYTPX36O3A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSVREXG43Z712LOP6A#issue5WWQZLOBW63LNMVWXHJK94
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWKGZMUB67VPCMFZYGTPX36O3ANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

@tylerjereddy ๊ณต๊ฒฉ์ž (๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„!)๊ฐ€ ์˜ˆ์ธกํ•  ์ˆ˜์—†๋Š” ๋ฌผ๋ฆฌ์  ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค์—์„œ ์†Œ๋Ÿ‰์˜ ์ž„์˜ ๋น„ํŠธ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์งง์€ ์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ, ๋…ผ์Šค, ํ‚ค์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์— ๋Œ€ํ•œ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์˜ ์š”์ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์žฌํ˜„ ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ np.random ์˜ ์ˆ˜์น˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ชฉ์ ๊ณผ ์ƒ์ถฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” cryptography ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋ณธ ์š”์†Œ๋กœ ์กด์žฌํ•˜๊ณ  _ ๋นŒ๋“œ ํ•  ์ˆ˜์žˆ๋Š” _ ์žฌ์ƒ์‚ฐ ๊ฐ€๋Šฅ _ ์•”ํ˜ธํ™” ๋ณด์•ˆ PRNG์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _practice_์—์„œ๋Š” ํšจ์œจ์ ์ธ C ์ฝ”๋“œ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ ์–ด๋„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ชฉ์ ์œผ๋กœ ๊ณต์‹ํ™”๋˜๊ณ  ํ…Œ์ŠคํŠธ ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋” ์ž˜ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. @bashtage ๋Š”์ด ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฅผ

๋‚˜๋Š” ๋˜ํ•œ @pbstark ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•”ํ˜ธํ™” ๊ธฐ๋ฐ˜ PRNG๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ numpy ํŒ€์—๊ฒŒ ๋ถ„๋ช…ํžˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ทธ๋Š” ๊ทธ๊ฐ€ ์ฐพ๊ณ ์žˆ๋Š” ์ˆ˜ํ•™์  ์†์„ฑ์„ ์ œ๊ณต ํ•  _unbounded state_๋ฅผ ๊ฐ€์ง„ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ๋ ค๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์•”ํ˜ธํ™” ๊ธฐ๋ฐ˜ PRNG๋Š” @pbstark ๊ฐ€ ์›ํ•˜๋Š” ๋ฌด์ œํ•œ ์ƒํƒœ๋ฅผ cryptorandom ๋Š” ๋˜ํ•œ ๊ณ ์ • ํฌ๊ธฐ 256 ๋น„ํŠธ ๋‹ค์ด์ œ์ŠคํŠธ ์ƒํƒœ ๋ฐ ๊ณ ์ • ํฌ๊ธฐ 64 ๋น„ํŠธ ๊ธธ์ด ์นด์šดํ„ฐ๋กœ ์ธํ•ด 2**(256+64) ๊ณ ์œ  ํ•œ ์ดˆ๊ธฐ ์กฐ๊ฑด์— ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด ์นด์šดํ„ฐ๋ฅผ ์ž„์˜์˜ ํฌ๊ธฐ๋กœ ๋งŒ๋“ค์–ด ์ง„์ •์œผ๋กœ ์ œํ•œ๋˜์ง€ ์•Š์€ PRNG๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฒŒ์‹œ๋˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ๋œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์—, ์ž„์˜์˜ ํฌ๊ธฐ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ PRNG ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์›ํ•˜๋ฉด ์ฒ˜์Œ์— ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋†’์€ ๊ฒƒ์œผ๋กœ ๊ณ ์ • ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋งŒ ์žˆ์œผ๋ฉด PCG์˜ ํ™•์žฅ ์ƒ์„ฑ๊ธฐ ๊ฐ€ ํ•ด๋‹น ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋ถ„๋ช…ํžˆ CS-PRNG๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ๊ฑฐ๋Œ€ํ•œ ์ƒํƒœ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋ ค๋Š” @pbstark ์˜ ์š•๊ตฌ๋ฅผ ์ถฉ์กฑ

ํ‘œ์ค€, ๊ฒฝ๊ณ„, CS-PRNG๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•  ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ์†์„ฑ์ด ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์€ ์‰ฌ์šด ๊ธฐ๋ณธ๊ฐ’ ์ธ IMO๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

Cryptorandom์˜ ์ƒํƒœ ๊ณต๊ฐ„์€ 256 ๋น„ํŠธ ํ•ด์‹œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ
์‹œ๋“œ ์ƒํƒœ๋Š” ์ž„์˜ ๊ธธ์ด์˜ ๋ฌธ์ž์—ด์ด๋ฉฐ ๊ฐ ์—…๋ฐ์ดํŠธ๋Š” 0์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ƒํƒœ๋กœ. ๋ฌด์ œํ•œ ์ •์ˆ˜ ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€ ์‹œํ‚ค๋ฉด
๊ฐ™์€ ์ผ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ฒ˜์Œ์—๋Š” ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ
๋” ํšจ์œจ์ ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฆ๋ถ„๋ณด๋‹ค๋Š” ์ถ”๊ฐ€
๊ฐ ์ƒํƒœ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•ด์‹ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‹ค์ด์ œ์ŠคํŠธ (๋ˆˆ์— ๋„๋Š” ์†๋„ ํ–ฅ์ƒ).

2019 ๋…„ 5 ์›” 29 ์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 7:26 Robert Kern [email protected]
์ผ๋‹ค :

@tylerjereddy https://github.com/tylerjereddy ๊ทธ๊ฒƒ๋“ค์€
๋ฌผ๋ฆฌ์  ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค์˜ ์†Œ๋Ÿ‰์˜ ์ž„์˜ ๋น„ํŠธ
๊ณต๊ฒฉ์ž (๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ !)์—๊ฒŒ๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค
์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ, nonce, ํ‚ค์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์งง์Šต๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ
์ด๊ฒƒ๋“ค์˜ ์š”์ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์žฌํ˜„ ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
np.random์˜ ์ˆ˜์น˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ชฉ์ ๊ณผ์˜ ํ™•๋ฅ . ๊ทธ ํŽ˜์ด์ง€๋Š”
์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ๋ณด์•ˆ PRNG์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์กด์žฌํ•˜๊ณ  ์›์‹œ๋กœ๋ถ€ํ„ฐ ๊ตฌ์ถ• ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
์•”ํ˜ธํ™” ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š”
์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋” ๋‚˜์€ ๊ตฌํ˜„
ํšจ์œจ์ ์ธ C ์ฝ”๋“œ, ์ ์–ด๋„ ๊ณต์‹ํ™”๋˜๊ณ  ํ…Œ์ŠคํŠธ ๋œ ์ฝ”๋“œ
์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ชฉ์ ์œผ๋กœ. @bashtage https://github.com/bashtage ๊ตฌํ˜„
๋ช‡ ๊ฐ€์ง€ https://github.com/numpy/numpy/issues/13635#issuecomment-496287650
์ด ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์œ„ํ•ด.

๋‚˜๋Š” ๋˜ํ•œ @pbstark๊ฐ€ ๋ฌด์—‡์ธ์ง€ numpy ํŒ€์—๊ฒŒ ๋ถ„๋ช…ํžˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
https://github.com/pbstark ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์•”ํ˜ธํ™” ๊ธฐ๋ฐ˜์ด ์•„๋‹™๋‹ˆ๋‹ค.
PRNG. ์˜คํžˆ๋ ค ๊ทธ๋Š” ๋ฌดํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ํ•˜๋‚˜๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฐ€ ์ฐพ๊ณ ์žˆ๋Š” ์ˆ˜ํ•™์  ์†์„ฑ.

์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ๋ ค๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์•”ํ˜ธํ™” ๊ธฐ๋ฐ˜ PRNG
์–ต์ œ ํ•  ์ˆ˜์—†๋Š” ์ƒํƒœ @pbstark์ด์—†๋Š”
https://github.com/pbstark ๊ฐ€ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ
์œ ํ•œ ์นด์šดํ„ฐ ์•”ํ˜ธํ™”. ๊ทธ ์นด์šดํ„ฐ๊ฐ€ ๋Œ์•„ ๊ฐ€๋ฉด, ๋‹น์‹ ์€
์œ ํ•œ ๊ธฐ๊ฐ„. ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ทธ์˜ cryptorandom
https://statlab.github.io/cryptorandom/ ๋„ 2 ** (256 + 64)๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
๊ณ ์ • ํฌ๊ธฐ 256 ๋น„ํŠธ ๋‹ค์ด์ œ์ŠคํŠธ ์ƒํƒœ๋กœ ์ธํ•œ ๊ณ ์œ  ํ•œ ์ดˆ๊ธฐ ์กฐ๊ฑด ๋ฐ
๊ณ ์ • ํฌ๊ธฐ 64 ๋น„ํŠธ ๊ธธ์ด ์นด์šดํ„ฐ. ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„
๊ธธ์ด ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ์ง„์ •ํ•œ ์ œํ•œ์—†๋Š” PRNG ๊ตฌํ˜„
์ž„์˜์˜ ํฌ๊ธฐ์ด์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฒŒ์‹œ๋˜๊ฑฐ๋‚˜
ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— PRNG ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์›ํ•˜๋ฉด
์ž„์˜์˜ ํฌ๊ธฐ ์ƒํƒœ, ์ฒ˜์Œ์— ๊ณ ์ • ๋œ ์ƒํƒœ
ํ•„์š”ํ•œ ๊ฒƒ ์ด์ƒ์œผ๋กœ PCG์˜ ํ™•์žฅ ๋ฐœ์ „๊ธฐ
http://www.pcg-random.org/party-tricks.html ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ง๋ฌด. ์ด๋“ค์€ ๋ถ„๋ช…ํžˆ CS-PRNG๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
@pbstark https://github.com/pbstark ์˜ ๊ฑฐ๋Œ€ํ•œ ์ƒํƒœ ๊ณต๊ฐ„์„ ์›ํ•˜๋Š” ์š•๋ง
์ฃผ๋ฌธํ˜•. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  numpy์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€, ๊ฒฝ๊ณ„, CS-PRNG๊ฐ€ ๊ฐ–๋Š” ๋‹ค๋ฅธ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์›ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, IMO๋Š” ๋‹น์—ฐํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWLGAF6YVIWXYZ2LTT3PX43ONA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSVREXG43VMVORB4QTDN5W2ZLOG458P#Zissuement-4W2177VORBW63LNMVXHJ4K
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWLIJD3UCVY3NXCLPKDPX43ONANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

SHA-256์˜ ์˜จ๋ผ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ ์ง€ํ•˜๋Š” ์ƒํƒœ๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์ถ”๊ฐ€ํ•˜๋Š” 256 ๋น„ํŠธ ๋‹ค์ด์ œ์ŠคํŠธ์™€ ๊ณ ์ • ํฌ๊ธฐ 64 ๋น„ํŠธ ๊ธธ์ด ์นด์šดํ„ฐ๋ฟ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด์‹œ๊ฐ€ ์••์ถ•๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ ๋ฐ”์ดํŠธ์—์„œ ํšจ์œจ์ ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ•œ ํ•œ ๋™์ผํ•œ ๋‚ด๋ถ€ SHA-256 ์ƒํƒœ์— ๋งคํ•‘๋˜๋Š” ์ดˆ๊ธฐํ™” / ๊ณผ๊ฑฐ ์ด๋ ฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ๋Š” ํ™•์‹คํžˆ ๊ธธ์ง€๋งŒ 2**(256+64) ๋ณด๋‹ค ๊ธธ์ง€๋งŒ ํ™•์‹คํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐ ์กฐ๊ฑด์€ 2**(256+64) ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค (๊ฐ ํ…์ŠคํŠธ ๊ธธ์ด 0 ~ 2**64-1 ์— ๋Œ€ํ•ด ์ตœ๋Œ€ 2**256 ๋‚ด๋ถ€ ํ•ด์‹œ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ๊ธธ์ด๊ฐ€ 32 ๋ฐ”์ดํŠธ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋” ์ด์ƒ ๋น„ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค; ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค : ์ƒํƒœ
๊ณต๊ฐ„์€ ๋ฌดํ•œํ•˜์ง€๋งŒ (๋น„๋‘˜๊ธฐ ๊ตฌ๋ฉ์— ์˜ํ•ด) ๋งŽ์€ ๋ณ„๊ฐœ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€
๊ตฌ๋ณ„ ํ•  ์ˆ˜์—†๋Š” ์ถœ๋ ฅ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 29 ์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 8:21 Robert Kern [email protected]
์ผ๋‹ค :

SHA-256์˜ ์˜จ๋ผ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒํƒœ
์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ 256 ๋น„ํŠธ ๋‹ค์ด์ œ์ŠคํŠธ์™€ ๊ณ ์ • ํฌ๊ธฐ 64 ๋น„ํŠธ๋ฟ์ž…๋‹ˆ๋‹ค.
์—…๋ฐ์ดํŠธ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธธ์ด ์นด์šดํ„ฐ์ž…๋‹ˆ๋‹ค. ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
์ „์ฒด ํ…์ŠคํŠธ. ํ•ด์‹œ๊ฐ€ ์••์ถ•๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๊ฐ ๋ฐ”์ดํŠธ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŽ์€ ์ดˆ๊ธฐํ™” / ๊ณผ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์œ ํ•œ ํ•œ ๋™์ผํ•œ ๋‚ด๋ถ€ SHA-256 ์ƒํƒœ์— ๋งคํ•‘๋˜๋Š” ์ด๋ ฅ.
์ฃผ๊ธฐ๋Š” ํ™•์‹คํžˆ ๊ธธ์ง€๋งŒ 2 (256 + 64) ๋ณด๋‹ค ๊ธธ ์ˆ˜๋„
๊ทธ๋ฆฌ๊ณ  ์–ด์จŒ๋“  2 ๊ฐœ ๋ฏธ๋งŒ (256 + 64)
๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐ ์กฐ๊ฑด (๊ฐ ํ…์ŠคํŠธ ๊ธธ์ด 0 ~ 2 64-1์— ๋Œ€ํ•ด์ตœ๋Œ€ 2256 ๊ฐœ์˜ ๋‚ด๋ถ€ ํ•ด์‹œ ์ƒํƒœ๋ฅผ
๋ฐ”์ดํŠธ, ์ถฉ๋Œ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋” ๋งŽ์€ ๋น„ํŠธ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWO6HRJZHTVBF2TLK3LPX5B3TA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFWSVREXG43VMVSY#KTDNMVW718ZLOBW63comGOD49HTVMVSY#Kissuement-NMVHTXHJW63com
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AANFDWM56HCQRZXDO3BAQHDPX5B3TANCNFSM4HPX3CHA
.

-
ํ•„๋ฆฝ ๋น„ ์Šคํƒ€ํฌ | ๋ถ€ํ•™์žฅ, ์ˆ˜๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ๊ณผํ•™ |
ํ†ต๊ณ„ํ•™๊ณผ ๊ต์ˆ˜ |
์บ˜๋ฆฌํฌ๋‹ˆ์•„ ๋Œ€ํ•™๊ต
๋ฒ„ํด๋ฆฌ, CA 94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
๋ฟก ๋นต๋€จ

๋˜ํ•œ ํ†ต๊ณผ ํ•  ์ˆ˜์žˆ๋Š” ์ƒํƒœ๊ฐ€ 2**(256+64) ๋ฟ์ธ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋Š” ๋งค๋ฒˆ ๋™์ผํ•œ ํ˜•ํƒœ๋ฅผ ์ทจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ด์ „์— ๋ณธ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๊ณ  ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ์œ ํ•œ ๊ธฐ๊ฐ„์˜ ๋ฃจํ”„์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์œ ํ•œ ํ•œ ์ˆ˜์˜ ์ดˆ๊ธฐ ์ƒํƒœ์ด๋“  ์œ ํ•œ ๊ธฐ๊ฐ„์ด๋“ , cryptorandom ์—๋Š” ๋‘˜ ๋‹ค ์žˆ์œผ๋ฉฐ MT19937 ๋ณด๋‹ค ๋” ์ž‘๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์ž์ฒด๋กœ cryptorandom ์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌดํ•œํ•œ ์ดˆ๊ธฐ ์ƒํƒœ ์„ธํŠธ ๋˜๋Š” ๋ฌดํ•œํ•œ ๊ธฐ๊ฐ„์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์‹ค์งˆ์ ์ธ ์˜๋ฏธ์—์„œ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง ์ž„์˜์˜ ์‹œ๋“œ๋กœ ์‹คํŒจํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋™์ผํ•œ ๊ทผ์ ‘ ์ฆ๋ถ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์ผ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

512GiB์—์„œ ์—ฌ์ „ํžˆ ๊ฐ•์„ธ :

โฏ ./pcg_streams.py -i 0 |time ./RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 10843219355420032665,
            "inc": 1
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 5124747729404067061,
            "inc": 3
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0xb83f7253
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0xb83f7253
length= 128 megabytes (2^27 bytes), time= 4.0 seconds
  no anomalies in 117 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 256 megabytes (2^28 bytes), time= 8.6 seconds
  no anomalies in 124 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 512 megabytes (2^29 bytes), time= 16.9 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+2,13-2,T)                  R=  -8.0  p =1-2.1e-4   mildly suspicious
  ...and 131 test result(s) without anomalies

rng=RNG_stdin32, seed=0xb83f7253
length= 1 gigabyte (2^30 bytes), time= 33.8 seconds
  no anomalies in 141 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 2 gigabytes (2^31 bytes), time= 65.7 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+2,13-1,T)                  R=  -7.8  p =1-3.8e-4   unusual          
  ...and 147 test result(s) without anomalies

rng=RNG_stdin32, seed=0xb83f7253
length= 4 gigabytes (2^32 bytes), time= 136 seconds
  no anomalies in 156 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 8 gigabytes (2^33 bytes), time= 270 seconds
  no anomalies in 165 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 16 gigabytes (2^34 bytes), time= 516 seconds
  no anomalies in 172 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 32 gigabytes (2^35 bytes), time= 1000 seconds
  no anomalies in 180 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 64 gigabytes (2^36 bytes), time= 2036 seconds
  no anomalies in 189 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 128 gigabytes (2^37 bytes), time= 4064 seconds
  no anomalies in 196 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 256 gigabytes (2^38 bytes), time= 8561 seconds
  no anomalies in 204 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 512 gigabytes (2^39 bytes), time= 19249 seconds
  no anomalies in 213 test result(s)

์•„, ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ 2 ๊ฐœ ์ด์ƒ ์ˆ˜ํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐ„ ์ฃผ์œ„์— ํผ ๋œจ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ bijection์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์—์„œ ์‹ค์ œ ์ฆ๋ถ„์„ ๋„์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

โฏ ./pcg_streams.py -n 3  | time ./build/RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 18394490676042343370,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 12676019050026377766,
            "inc": 2891336455
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 6957547424010412162,
            "inc": 2891336457
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0x4a9d21d1
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0x4a9d21d1
length= 128 megabytes (2^27 bytes), time= 3.2 seconds
  Test Name                         Raw       Processed     Evaluation
  DC6-9x1Bytes-1                    R= +19.4  p =  1.6e-11    FAIL           
  [Low8/32]DC6-9x1Bytes-1           R= +13.2  p =  4.6e-8    VERY SUSPICIOUS 
  ...and 115 test result(s) without anomalies

ํ—‰

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋‹ค๋ฅด๊ฒŒํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚œ ๋‹น์‹ ์ด ๋ผ์ธ์„ ๊ต์ฒด ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ pcg64 rng2(-seed,-stream); ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์—์„œ pcg64 rng2(-seed,-1-stream); ์ˆ˜ ์žˆ๋„๋ก, increment = 2 * stream + 1 ๋ณ€ํ™˜. ์ฆ๋ถ„์˜ ๋ถ€์ •์€ ์ŠคํŠธ๋ฆผ ์ธ๋ฑ์Šค์˜ ๋น„ํŠธ ๋ถ€์ •์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด์ „ ํ”Œ๋กฏ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์‹œ๊ฐ์ ์œผ๋กœ ์ข‹์•„ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.)

ํ—‰

์ŠคํŠธ๋ฆผ์„ ์ƒ๊ฐํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์‹œ๋“œํ•ด์•ผํ•˜๋Š” ๋” ์ž„์˜์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ˆ˜ ์ž˜ ์„ ํƒ ๊ณ ์ •์œผ๋กœ 64 ๋น„ํŠธ LCG์— ๋Œ€ํ•œ : ๋‚œ ๊ทธ LCGs์— ๋Œ€ํ•œ ๋งค์šฐ ๊นจ๋—ํ•œ ์‚ฌ์ง„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค ์ƒ๊ฐ a , ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ํฌ๊ธฐ์˜ ์ƒํƒœ ๊ณต๊ฐ„์ด 2^127 ๋ชจ๋‘ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ (x, c) ์ •์ˆ˜ mod 2 ^ 64, ์—ฌ๊ธฐ์„œ c ๋Š” ํ™€์ˆ˜ ์ฆ๋ถ„์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋Š” next : (x, c) โ†ฆ (ax+c, c) ์ด๋ฉฐ ์ƒํƒœ ๊ณต๊ฐ„์„ ๊ฐ๊ฐ 2^64 ๊ธธ์ด์˜ 2^63 ๋ถ„๋ฆฌ ์ฃผ๊ธฐ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์‹œ๋”ฉ์€์ด ์ƒํƒœ ๊ณต๊ฐ„์—์„œ ์‹œ์ž‘์ ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ถ„์„์„ ์‰ฝ๊ฒŒํ•˜๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๋Š” ๋ช…๋ฐฑํ•œ ๊ทธ๋ฃน ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. Z / 2^64Z ์˜ ๋ฐ˜์ „ ๊ฐ€๋Šฅํ•œ 1-d ์•„ํ•€ ๋ณ€ํ™˜ ๊ทธ๋ฃน์€ ์ •ํ™•ํžˆ 2^127 ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ „ ์ด์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (๋˜ํ•œ ์ถฉ์‹คํ•˜๊ฒŒ) ์ƒํƒœ ๊ณต๊ฐ„์—์„œ : ์•„ํ•€ ๋ณ€ํ™˜ y โ†ฆ ey + f ๋Š” (x, c) ์Œ์„ (ex + f, ec + (1-a)f) ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์™€ ๊ทธ ๊ทธ๋ฃน ์•ก์…˜ ํ†ต๊ทผ next ๋ณ€ํ˜• ํ•œ ์ ์ด๋ผ๋Š” ๊ณ ์œ  ์กฑ ์›์†Œ์ด๋ฏ€๋กœ ํ•จ์ˆ˜ (x, c) ๋‹ค๋ฅธ์œผ๋กœ ์ƒํƒœ ๊ณต๊ฐ„์—์„œ (x2, c2) , ๋˜ํ•œ ์„œ์—ด์„์ง€๋„์— ์˜ํ•ด ์ƒ์„ฑ (x, c) ๋ฅผ (x2, c2) ์˜ํ•ด ์ƒ์„ฑ ๋œ ์‹œํ€€์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

TL; DR์€ : ๊ณ ์ • ๋œ ๋ฐฐ์œจ์„ ์œ„ํ•ด ๋™์ผํ•œ ๋ฐฐ์œจ๋กœ ๋‘ LCG ์„œ์—ด (๋ฃฉ์–ด ์ผ€์ด์Šค, ๋˜๋Š” ๋‹ค๋ฅธ ๋‹จ์œ„๋กœ ๋™์ผํ•œ ์ฆ๋ถ„ ์‚ฌ์šฉ ์—ฌ๋ถ€)๋ฅผ ์•„ํ•€ ๋ณ€ํ™˜์— ์˜ํ•ด ๊ด€๋ จ๋œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”ผํ•˜๋ ค๊ณ ํ•˜๋Š” ๋ถˆํ–‰ํ•œ ๊ฒฝ์šฐ์—, ๊ทธ ์•„ํ•€ ๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ๋ฌด์„ญ๊ฒŒ ๊ฐ„๋‹จํ•œ ์ผ์ด๋‹ค 2 ํ•˜๊ฑฐ๋‚˜ ๊ณฑํ•˜์—ฌ -1 . ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ํ‘œ์ค€ ํ†ต๊ณ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋‘ ์ŠคํŠธ๋ฆผ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ์ง€ ํ•  ์ˆ˜ ์—†์„๋งŒํผ ์•„ํ•€ ๋ณ€ํ™˜์ด ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@mdickinson ์€ ์ƒํ™ฉ์„ ๋ฉ‹์ง€๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. PCG์˜ ์ˆœ์—ด์€ LCG ์‚ฌ๋ก€์—์„œ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ๋งŽ์ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค. PCG ์ˆœ์—ด์˜ ์š”์ ์€ ์Šคํฌ๋žจ๋ธ”๋ง์˜ ์–‘์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜๋ฆฐ 128 ๋น„ํŠธ LCG๋Š” ์ด๋ฏธ BigCrush๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— pcg64 ๋Œ€ํ•œ ์ˆœ์—ด์„ ์„ ํƒํ•  ๋•Œ ํ•ด๋‹น ํฌ๊ธฐ LCG (XSL RR)์— ๋Œ€ํ•ด ์ ๋‹นํ•œ ์–‘์˜ ์Šคํฌ๋žจ๋ธ”๋ง์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ 64 ๋น„ํŠธ LCG๋Š” ์—ฌ๋Ÿฌ ํ†ต๊ณ„ ํ…Œ์ŠคํŠธ์— ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋ฏ€๋กœ pcg32 ์€ (๋Š”) ์•ฝ๊ฐ„ ๋” ์Šคํฌ๋žจ๋ธ”๋ง์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ PCG ๋…ผ๋ฌธ์—์„œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ˆœ์—ด์€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€ ์š”์ฒญ ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด pcg32 ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋” ๊ฐ•๋ ฅํ•œ PCG ์ˆœ์—ด (RXS M)์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ•ด๋‹น ๋ฒ„์ „์„ ๋ช…์‹œ ์ ์œผ๋กœ ์š”์ฒญํ•ด์•ผํ•˜์ง€๋งŒ PCG์— ๋Œ€ํ•œ ์ฃผ์š” ๋ฒ„์ „ ๋ฒ”ํ”„๋ฅผ ์ˆ˜ํ–‰ ํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์ „ํ™˜ ํ•  ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (RXS M์€ Vigna๊ฐ€์ด ํฌ๊ธฐ์™€ David Blackman์ด ์ข‹์•„ํ•˜๋Š” ์ˆœ์—ด์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ํ•œ RXS M XS์˜ ๋†’์€ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค).

๋‹ˆ์–ด ์ŠคํŠธ๋ฆผ ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ์—…๋ฐ์ดํŠธ ๋œ ๋ฒ„์ „์ด pcg32 (XSH RR ๋ฐ RCS M [๋ฐ ์›์‹œ ๊ธฐ๋ณธ LCG๋„])์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ฐจ์ด๋ฅผ ์‹œ๊ฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include "pcg_random.hpp"
#include <iostream>
#include <random>

// Create a "PCG" variant with a trivial output function, just truncation

template <typename xtype, typename itype>
struct truncate_only_mixin {
    static xtype output(itype internal)
    {
        constexpr size_t bits = sizeof(itype) * 8;
        return internal >> (bits/32);
    }
};

using lcg32 = pcg_detail::setseq_base<uint32_t, uint64_t, truncate_only_mixin>;

int main() {
    std::random_device rdev;
    uint64_t seed = 0;
    uint64_t stream = 0;
    for (int i = 0; i < 2; ++i) {
        seed   <<= 32;           
        seed   |= rdev();
        stream <<= 32;           
        stream |= rdev();
    }
    lcg32 rng1(seed,stream);
    lcg32 rng2(-seed,-1-stream);
    // pcg32 rng1(seed,stream);
    // pcg32 rng2(-seed,-1-stream);
    // pcg_engines::setseq_rxs_m_64_32 rng1(seed,stream);
    // pcg_engines::setseq_rxs_m_64_32 rng2(-seed,-1-stream);
    std::cerr << "RNG1: " << rng1 << "\n";
    std::cerr << "RNG2: " << rng2 << "\n";
    std::cout.precision(17);
    for (int i = 0; i < 10000; ++i) {
        std::cout << rng1()/4294967296.0 << "\t";
        std::cout << rng2()/4294967296.0 << "\n";
    }
}

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— @mdickinson์ด ๊ทธ๋ฆฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ˆœ์—ด์ด์—†๋Š” LCG์˜ ๊ฒฝ์šฐ ์ž˜๋ฆผ ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

corr-truncated-lcg

์ด๊ฒƒ์€ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€์žˆ๋Š” ์ƒํƒœ์™€ ๋ณ‘๋ฆฌํ•™ ์  LCG๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋œ ์ถ”๊ฐ€ ์ƒ์ˆ˜ (ํ•˜์ง€๋งŒ ์‹œ์ž‘ ๊ฐ’์€ ๋™์ผ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ LCG๋ฅผ ์„ ํƒํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

corr-truncated-lcg-good

PCG์˜ ์ถœ๋ ฅ ํ•จ์ˆ˜๋กœ ์ด๋™ํ•˜๋ฉด ๋ณ‘๋ฆฌํ•™์ ์ธ ๊ฒฝ์šฐ์— XSH RR์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๊ทธ๋ž˜ํ”„์—์„œ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋”์ฐํ•จ์„ ์™„์ „ํžˆ ๋ชจํ˜ธํ•˜๊ฒŒํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

corr-pcg32-current

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋™์ผํ•œ ๊ธฐ๋ณธ (๋‚˜์œ ์ƒ๊ด€ ๊ด€๊ณ„) LCG ์Œ์„ ๊ฐ€์ง„ RXS M์ž…๋‹ˆ๋‹ค.

corr-pcg32-future

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ pcg32 ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํŒจ๋„ํ‹ฐ๋Š” ์ ๊ณ  pcg32 ์€ (๋Š”) ์ผ๋ถ€ ๋ฌด๊ฑฐ์šด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ์‹œ๋“œ ๋œ pcg32 ์ƒ์„ฑ๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๋กœ๋ถ€ํ„ฐ ์ˆ˜๋งŽ์€ ์ˆซ์ž๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ž‘์Šต๋‹ˆ๋‹ค. ์ƒ๊ด€ ๊ด€๊ณ„์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋ฌดํ•œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ์ด ์‹ ํ™”์ ์ธ ํŒŒ์›Œ ์œ ์ €๊ฐ€ ์ฒ˜์Œ์— pcg32 ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์†”์งํžˆ ๋‘ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

pcg64 ์˜ ์ŠคํŠธ๋ฆผ์„ ๋” ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์ŠคํŠธ๋ฆผ์„ ๋‹ค์Œ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ (์˜ˆ : ๊ทผ์ฒ˜์—์žˆ๋Š” ๊ฒƒ์€ ๊ณ ์‚ฌํ•˜๊ณ  ์ž„์˜์˜ ๊ฐ’์œผ๋กœ). ๊ฑฐ์˜ ๋ชจ๋“  PRNG์˜ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ PRNG๋ฅผ ๋งŒ๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์—”ํŠธ๋กœํ”ผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, NumPy์˜ ๊ฒฝ์šฐ, PCG64๊ฐ€ 256 ๋น„ํŠธ 2 ๊ฐœ์˜ ์ƒํƒœ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  (๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์ŠคํŠธ๋ฆผ์˜ ์ƒ์œ„ ๋น„ํŠธ๊ฐ€ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— 255์ž…๋‹ˆ๋‹ค) ์™„๋ฃŒ๋ผ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ BitGenerator๊ฐ€ ์•„๋‹Œ ํ•˜๋‚˜์˜ BitGenerator์—์„œ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ค„์–ด๋“ค ๊ธฐ ๋•Œ๋ฌธ์— API์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(ํ•˜์ง€๋งŒ 32 ๋น„ํŠธ PCG ๋ณ€ํ˜•์„ RXS M์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C ์†Œ์Šค์˜ ๊ฒฝ์šฐ C ์ฝ”๋“œ์—์„œ RXS M์„ ๋ช…์‹œ ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  C ++์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ ํ–ˆ์œผ๋ฏ€๋กœ ์ตœ์‹  ๋ฒ„์ „์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ƒ.)

[๋‹น์‹ ์ด ์•Œ๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ ์ด์ƒ์ด๋ผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ๊ธ€์Ž„์š”, ๋ฏธ์•ˆ ํ•ด์š”. ;-)]

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

์•ž์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์งง์€ "์‹œ๋“œ"์ž…๋ ฅ (์ฆ‰, ์ด๋ฉ”์ผ์—์„œ ๋ช…๋ น ์ค„์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ํฌ๊ธฐ์— ๋Œ€ํ•œ ๊ฒƒ)์„ ํ—ˆ์šฉํ•˜๋Š” ํ™•๋ฅ  ์  ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ์„ ๊ฒฐ์ •์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฐ•๋ ฅํ•œ UX ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @stevenjkern ์€ ์˜คํ”„๋ผ์ธ ๋Œ€ํ™”์—์„œ ์ž์‹ ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฒ€์ฆ ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณต์ œํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์˜ _output_ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋ฉด ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์•ฝ๊ฐ„ ์˜์‹ฌ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทœ์ œ ๊ธฐ๊ด€์€ ํŒŒ์ผ์˜ ์ •๋ณด๊ฐ€ ์ •๋ง ์ •๊ฒฐํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ (์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Œ)์— ๋Œ€ํ•ด ์‹ฌ์ธต์ ์œผ๋กœ ์กฐ์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Python ์— N ๊ฐœ์˜ ๋ณ‘๋ ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์ ์œผ๋กœ ํšŒ์ „์‹œ์ผœ ์ž‘์—…์˜ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฃผ ํ”„๋กœ์„ธ์Šค๋กœ ์ด๋™ํ•˜๋Š”

N ์ŠคํŠธ๋ฆผ์„ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ๋„ํ•ด์•ผํ•˜๋Š” ํ•„์š”์„ฑ์€ ์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ์˜ MT ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ทธ๊ฒƒ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ด์ƒํ•œ ์ผ์„ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์œ„ํ—˜ํ•œ ๊ณ„ํš์„ ๊ฒฉ์ถ”ํ•ด์•ผํ–ˆ๊ณ  PCG์˜ ์ŠคํŠธ๋ฆผ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๊ธฐ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค.

2**63 / 2**127 ๋ณด๋‹ค ์ข‹์€ bijective ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ์นด์šดํ„ฐ ์‹œํ€€์Šค 0,1,2,3, ...์—์„œ ์ฆ๋ถ„์„ ์œ ๋„ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ ๋ฌธ์ œ๋ฅผ ์˜ˆ๊ฒฌํ•˜์‹ญ๋‹ˆ๊นŒ? ์ƒํƒœ๋ฅผ ์ƒˆ๋กœ์šด์ฃผ๊ธฐ์˜ ๋จผ ๋ถ€๋ถ„์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•ด ํ•ด์‹œ ๋œ ์ฆ๋ถ„๊ณผ ํฐ ๋„์•ฝ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด ํ•˜์œ„ ํ† ๋ก ์„ ์ด๋ฉ”์ผ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋‹ค์‹œ๋ณด๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rkern , PRNG์— ๋งค์šฐ ์งง์€ ์‹œ๋“œ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ธฐ๋ถ„์ด ์ข‹์€ ๊ฒƒ์ด์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ (PRNG์— ๊ด€๊ณ„์—†์ด) ๋”์ฐํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. _k_ ๋น„ํŠธ์˜ ์‹œ๋“œ ์ž…๋ ฅ์„ ์ œ๊ณต ํ•œ ๋‹ค์Œ _k_ ๋น„ํŠธ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ (์ฆ‰์‹œ ๋˜๋Š” _j_ ๋น„ํŠธ๋ฅผ ๋จผ์ € ๊ฑด๋„ˆ ๋›ฐ๊ณ  [์ผ๋ถ€ ์ž„์˜์˜ _j_์— ๋Œ€ํ•ด] ๋‹ค์Œ _k_ ๋น„ํŠธ๋ฅผ ์ฝ์Œ), ๋ชจ๋“  2 ^ _k_ ์ •์ˆ˜๊ฐ€ ๋ชจ๋‘ 2๊ฐ€ ์•„๋‹Œ ์œ ํšจํ•œ ์ž…๋ ฅ ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ^ _k_ ์ถœ๋ ฅ์ด ๊ด€์ฐฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋น„ํŠธ ์ธ์—์„œ ๋น„ํŠธ ์•„์›ƒ์œผ๋กœ์˜ ํ•จ์ˆ˜๊ฐ€ ์ด๋ถ„๋ฒ• (bijection) ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ์˜ˆ์ƒ ๋ถ„ํฌ๋Š” ์ดํ•ญ (2 ^ k, 2 ^ -k)์ด๋ฉฐ, ํ‘ธ ์•„์†ก ๋ถ„ํฌ๋กœ ๊ทผ์‚ฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 2 ^ k / e ๊ฐ’์ด ๊ด€์ฐฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ PRNG๊ฐ€ ๋ฌด์—‡์ด๋“  ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ _k_๊ฐ€ ๋น ์ง„ ๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๋น„ํ˜„์‹ค์  ์ผ ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ์ปค์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ PRNG (์˜ˆ : Mersenne Twister)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ ์ž‘์€ ์ง‘ํ•ฉ (์˜ˆ : 10000 ๋ฏธ๋งŒ์˜ ์ˆซ์ž)์—์„œ ์‹œ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. _์ด ์ผ์„ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด _ ํŽธ๊ฒฌ. ์˜ˆ๋ฅผ ๋“ค์–ด, 4 ์ž๋ฆฌ ์‹œ๋“œ๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ Mersenne Twister์—์„œ ํ•ฉ๋ฆฌ์ ์ธ ์ˆ˜์˜ ์ˆซ์ž (์˜ˆ : ๋ฐฑ๋งŒ ๋ฏธ๋งŒ)๋ฅผ ๊ฐ€์ ธ ์™”๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ๋ถˆ์šด ํ•œ ์ˆซ์ž 13์€ 100 ์–ต ๊ฐœ์˜ ์ถœ๋ ฅ ์ค‘ ํ•˜๋‚˜๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉฐ (์‹ค์ œ๋กœ 32 ๋น„ํŠธ ์ •์ˆ˜์˜ ์•ฝ 10 %๊ฐ€ ์—†์Œ) ์ˆซ์ž 123580738์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋กœ ๊ณผ๋Œ€ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. 16. ์ด๊ฒƒ์€ 100 ์–ต ๊ฐœ์˜ 32 ๋น„ํŠธ ์ •์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ๋ฌด์ž‘์œ„ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‹ค์ œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด 9 ์ž๋ฆฌ ์‹œ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  10000 ๊ฐœ์˜ ์ˆซ์ž ๋งŒ ๊ทธ๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ •ํ™•ํžˆ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฌด์–ธ๊ฐ€๋ฅผํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. (๋‹จ์ˆœํžˆ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ทธ๋“ค์ด ์ž˜๋ชปํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๊ฒƒ์„ ์›ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ์งง์€ ๋ช…๋ น ์ค„ ์ธ์ˆ˜์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ โ€” ๊ฐ€๋Šฅํ•˜๋ฉด ์˜ณ์€ ์ผ์€ UUID ์™€ ์ž‘์€ ์ •์ˆ˜์—์„œ ์‹œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ๋ฉ‹์ง€๊ฒŒ ์Šคํฌ๋žจ๋ธ”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋Š” ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ randutils ๋กœ

(์ƒ๋‹นํžˆ ์งง๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋ ˆ์ด ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ...)

// mtbias.cpp -- warning, uses 4GB of RAM, runs for a few minutes
// note: this is *not* showing a problem with the Mersenne Twister per se, it is
// showing a problem with simplistic seeding

#include <vector>
#include <iostream>
#include <random>
#include <cstdint>

int main() {
    std::vector<uint8_t> counts(size_t(std::mt19937::max()) + 1);
    for (size_t seed=0; seed < 10000; ++seed) {
        std::mt19937 rng(seed);
        for (uint i = 0; i < 1000000; ++i) {
            ++counts[rng()];
        }
    }
    size_t shown = 0;
    std::cout << "Never occurring: ";
    for (size_t i = 0; i <= std::mt19937::max(); ++i) {
        if (counts[i] == 0) {
            std::cout << i << ", ";
            if (++shown >= 20) {
                std::cout << "...";
                break;
            }
        }
    }
    std::cout << "\nMost overrepresented: ";
    size_t highrep_count = 0;
    size_t highrep_n = 0;
    for (size_t i = 0; i <= std::mt19937::max(); ++i) {
        if (counts[i] > highrep_count) {
            highrep_n = i;
            highrep_count = counts[i];
        }
    }
    std::cout << highrep_n << " -- repeated " << highrep_count << " times\n";
}

์ด์ „์— ๋งํ–ˆ๋“ฏ์ด 128 ๋น„ํŠธ ์‹œ๋“œ๋Š” ๊ทธ ๋ชฉ์ ์„ ์œ„ํ•ด ์ถฉ๋ถ„ํžˆ ์งง๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋ณธ์ ์œผ๋กœ ์—”ํŠธ๋กœํ”ผ ์ƒ˜ํ”Œ๋งํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋กœ๊น… ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ UUID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ ๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณต ํ•œ ๋” ์ž‘์€ ์‹œ๋“œ๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด PCG64 ์˜ ์ƒํƒœ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ข‹์€ 128 ๋น„ํŠธ ์‹œ๋“œ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹ ์œผ๋กœ๋“  ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ƒํƒœ์—์„œ ์ŠคํŠธ๋ฆผ์„ ํŒŒ์ƒํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ๋‹จ์ผ PCG64 ์ŠคํŠธ๋ฆผ์—์„œ๋ณด๋‹ค ์ „์ฒด์ ์œผ๋กœ ๋” ๋งŽ์€ ์ˆซ์ž๋ฅผ ๊ทธ๋ฆฌ๋ ค๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ์ถ”์ฒจ์— ๋Œ€ํ•œ ์กฐ์ •์—†์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ์ด ์ˆซ์ž๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ad hoc 63 ๋น„ํŠธ multiply-xorshift ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธํ„ฐ๋ฆฌ๋ธŒ ๋œ 8192 ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์ง€๊ธˆ์€

ํ—‰

์งง๊ฒŒ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” @rkern ์ด "์ด๋ฉ”์ผ์—์„œ ๋ช…๋ น ์ค„์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ํฌ๊ธฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ"์„

๊ฐ ์ถ”์ฒจ์— ๋Œ€ํ•œ ์กฐ์ •์—†์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ์ด ์ˆซ์ž๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ad hoc 63 ๋น„ํŠธ multiply-xorshift ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธํ„ฐ๋ฆฌ๋ธŒ ๋œ 8192 ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์ง€๊ธˆ์€

์ถฉ๋ถ„ํžˆ ํฐ ์ˆ˜ ( PCG64.jumped ์‚ฌ์šฉ๋˜๋Š” 2 ** 64)๋งŒํผ ์ฃผ๋ฅผ ๋ฐœ์ „์‹œ์ผœ ๋‹จ์ผ ํ’ˆ์งˆ ์‹œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ n ์ŠคํŠธ๋ฆผ์„ ์ธํ„ฐ๋ฆฌ๋น™ ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ PCG64(seed).jumped(node_id) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋Œ€๊ทœ๋ชจ n ์ŠคํŠธ๋ฆผ์„ ๋Š์Šจํ•˜๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ node_id ๋Š” 0,1,2, ...

์ธ๋ฑ์Šค์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋…๋ฆฝ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ •๋ง ์ข‹์€ PRNG๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” MLFG๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์ง€๋งŒ 63 ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜๋‹ค.

@bashtage , ์ •๋ง ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์‹œ๋“œ๋ฅผ ์ทจํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ์ •์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์‹œํ•˜์‹ญ์‹œ์˜ค. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด์ „์— PCG์™€ ๋ฌด๊ด€ ํ•˜๊ฒŒ ์‹ฌ๊ฐํ•œ ํ˜ผํ•ฉ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ

์ด์ƒ์ ์œผ๋กœ๋Š” PCG์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค. PCG๊ฐ€ ๊ธฐ๋ณธ ์„ ํƒ์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡๋”๋ผ๋„ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋“  ์ƒ์„ฑ๊ธฐ๋กœ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์ด๋‚˜ ์ ํ”„์— ์˜์กดํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์  ์ธ PRNG๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ ๊ณ„ํš์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ์ง‘ํ–ˆ์ง€๋งŒ ์ด๋ฉ”์ผ๋กœ ์ฝ๋Š” ๊ฒฝ์šฐ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.)

@imneme ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋ชจ๋“  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์ ํ”„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค (๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์‹ค์ œ๋กœ ์‚ฌ์ „ ์œ ํ˜• ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค). ์‹ ์ค‘ํ•˜๊ฒŒ ์‹œ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๋Š” ๊ฒƒ์€ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ PRNG.jumped() ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์„ค๋“๋˜์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์‹œ๋”ฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ MT ์ƒ์„ฑ๊ธฐ๋Š” ๋ชจ๋‘ ์ž‘์„ฑ์ž์˜ init ๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๊ณ  PCG๋Š” ์‚ฌ์šฉ์ž์˜ ๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

seed = np.array(required_size, dtype=np.uint64)
last = 0
for i in range(len(user_seed))
    if i < len(user_seed)
        last = seed[i] = splitmix64(last ^ user_seed[i])
    else:
        last = seed[i] = splitmix64(last)

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ด๊ฒƒ์ด ์„ค๋“๋˜์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” jumped ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ LCG์—๊ฒŒ๋Š” ๋งค์šฐ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.

0x96704a6bb5d2c4fb3aa645df0540268d ์˜ ์Šน์ˆ˜ M์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. M ^ (2 ^ 64)๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ๋”์ฐํ•œ LCG ์Šน์ˆ˜ ์ธ 0x6147671fb92252440000000000000001 ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 128 ๋น„ํŠธ LCG์—์„œ 2 ^ 64 ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋ชจ๋‘ ๊ฐ€์ ธ ์˜ค๋ฉด ๋”์ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (ํ•˜์œ„ ๋น„ํŠธ๋Š” ์นด์šดํ„ฐ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค). PCG์˜ ํ‘œ์ค€ ์ˆœ์—ด ํ•จ์ˆ˜๋Š” ์นด์šดํ„ฐ๋ฅผ ์Šคํฌ๋žจ๋ธ”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ LCG์˜ ์ผ๋ฐ˜ ์ถœ๋ ฅ์„ ์Šคํฌ๋žจ๋ธ”ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PCG64๋Š” ํ˜„์žฌ Practrand๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ 0.5 ํŽ˜ํƒ€ ๋ฐ”์ดํŠธ๊นŒ์ง€ ํ…Œ์ŠคํŠธ๋˜์—ˆ์œผ๋ฉฐ ์ถ”๊ฐ€ ๋ถ„์„์— ๋”ฐ๋ฅด๋ฉด 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์—†์ด ๋งŽ์€ ํŽ˜ํƒ€ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์•„, ๋งŒ์•ฝ ๋‹น์‹ ์ด 2์˜ ๊ฑฐ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๊ฑฐ๋“ญ ์ œ๊ณฑ์„ ์•ž์œผ๋กœ ๊ฑด๋„ˆ ๋›ฐ๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ ๋›ฐ์–ด ์˜ค๋ฅด๋ฉด, PCG์˜ ์ผ๋ฐ˜์ ์ธ (๋‹ค์†Œ ๊ฒธ์†ํ•œ) ์ˆœ์—ด์€ ์ด์™€ ๊ฐ™์€ ๊ทผ๋ณธ์ ์ธ LCG ๊ฑฐ๋Œ€ํ•œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๋ณ‘๋ฆฌ ์  ์ˆœ์„œ๋ฅผ ์ถฉ๋ถ„ํžˆ ๋ณด์ƒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ์—ด ๊ฐ•๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ค์ œ๋กœ I์™€ Vigna๋Š” PCG์˜ ํ‘œ์ค€ ์ˆœ์—ด์„ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ธฐ์„ฑ ์ •์ˆ˜ ํ•ด์‹œ ํ•จ์ˆ˜์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค (๊ฒฐ๊ตญ, ๊ทธ๋“ค์€ SplitMix์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๋‹ค. ์นด์šดํ„ฐ). 2014 ๋…„์— Fast Hash๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์„ ๋•Œ ์†๋„๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ข‹์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•˜์ง€๋งŒ Vigna๊ฐ€ ์ตœ๊ทผ murmurhash๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ํ‘œ์ค€ PCG (!)๋ฅผ ๋Šฅ๊ฐ€ํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง๋กœ 2 ^ 64 ์ ํ”„๋ฅผ ์›ํ•˜๋ฉด ๋” ๊ฐ•๋ ฅํ•œ ์ถœ๋ ฅ ํ•จ์ˆ˜ ์ˆœ์—ด๋กœ ์ „ํ™˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์šฐ๋ฆฌ๊ฐ€ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋” ์ด์ƒ "ํ‘œ์ค€"PCG๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์ถœ๋ ฅ ์ˆœ์—ด์„ ์œ ์ง€ํ•˜๋ ค๋ฉด jumped() ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(BTW, ๋ณ‘๋ฆฌํ•™ ์  ์ ํ”„ ์–ด ํ—ค๋“œ๋Š” ๋‹ค๋ฅธ PRNG์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. SplitMix๋Š” ์•ฝ๊ฐ„์˜ ์ž˜๋ชป๋œ ์ฆ๊ฐ€๊ฐ€์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ 0xbd24b73a95fb84d9์˜ ์ผ๋ฐ˜์ ์ธ ์ฆ๊ฐ€ (์ผ๋ช… "๊ฐ๋งˆ")๋Š” ๊ดœ์ฐฎ์ง€ ๋งŒ 2 ^ ์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. 32๋Š” 0x95fb84d900000000์˜ ์ฆ๋ถ„์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค .LFSR์˜ ๊ฒฝ์šฐ ๋‚˜์œ ์ ํ”„ ์–ด ํ—ค๋“œ๋Š” ์•„๋งˆ๋„ 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์ด ์•„๋‹ˆ์ง€๋งŒ ๊ธฐ๋ณธ ๋งคํŠธ๋ฆญ์Šค๊ฐ€ ๋ณ‘๋ฆฌ ์ ์œผ๋กœ ๋๋‚˜๋Š” ์ ํ”„๊ฐ€์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€์กฑํ•œ.)

์ ์–ด๋„ PCG32 ์‚ฌ์šฉํ•˜๋ฉด .jumped() ์‚ฌ์šฉํ•˜๋Š” 4 ๊ฐœ์˜ ์ธํ„ฐ๋ฆฌ๋ธŒ ์ŠคํŠธ๋ฆผ ์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โฏ ./pcg_streams.py --jumped -n 4 | time ./RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 10149010587776656704,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 1158608670957446464,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 10614950827847787840,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 1624548911028577600,
            "inc": 2891336453
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0xeedd49a8
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0xeedd49a8
length= 128 megabytes (2^27 bytes), time= 2.1 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+0,13-3,T)                  R= +58.7  p =  1.3e-27    FAIL !!!       
  BCFN(2+1,13-3,T)                  R= +48.0  p =  1.5e-22    FAIL !!        
  BCFN(2+2,13-3,T)                  R= +16.0  p =  2.3e-7   very suspicious  
  DC6-9x1Bytes-1                    R= +53.5  p =  1.8e-32    FAIL !!!       
  [Low8/32]DC6-9x1Bytes-1           R= +27.4  p =  1.1e-17    FAIL !         
  ...and 112 test result(s) without anomalies

์ด์ƒ์ ์œผ๋กœ๋Š” PCG์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค. PCG๊ฐ€ ๊ธฐ๋ณธ ์„ ํƒ์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡๋”๋ผ๋„ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋“  ์ƒ์„ฑ๊ธฐ๋กœ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •ํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. :-) ์šฐ๋ฆฌ๋Š” ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋…ธ์ถœ ๋œ ์†์„ฑ์ด ์ž˜ ์—ฐ๊ตฌ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ๊ฐ PRNG๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํžˆ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์— ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋งŒ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ "์—ฌ๊ธฐ์— ์šฐ๋ฆฌ๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ๊ธฐ๋ณธ PRNG๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์—๋Š” ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."๋ผ๋Š” ๋ง์— ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

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

๋ฐ˜๋ฉด์—, PractRand์˜ N GiB์— ๋Œ€ํ•ด BitGenerator ์ธํ„ฐ๋ฆฌ๋ธŒ ์ŠคํŠธ๋ฆผ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ CPU ์‚ฌ์ดํด์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋ฆฌ ๋ถ€๋‹ด์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ •ํ™•ํžˆ "์—ฐ๊ตฌ ๋ฌธ์ œ"๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ (๋”ฐ๋ผ์„œ "์ž˜ ์—ฐ๊ตฌ ๋œ") C ++ 11 (๋Œ€๋ถ€๋ถ„ ๊ฒ€์ฆ ๋œ ์ง„์ •ํ•œ ์˜ค๋žœ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค)์€ _SeedSequence_ ๊ฐœ๋…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ์™„์ „ํžˆ ์ž„์˜์˜ PRNG์— ์‹œ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŠน์ • std::seed_seq ๊ตฌํ˜„).

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ์˜ ๋ชจ๋“  PRNG๋Š” ์ž„์˜ ๋น„ํŠธ๋กœ ์ดˆ๊ธฐํ™” / ์‹œ๋“œ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. random.org ๋‚˜์˜ค๋Š” ์ž„์˜์˜ ๋น„ํŠธ์™€ ๋” ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (CS PRNG, ํ•ด์‹œ ํ•จ์ˆ˜ ๋“ฑ)์—์„œ ๋‚˜์˜ค๋Š” ์ž„์˜์˜ ๋น„ํŠธ์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ๋งˆ๋ฒ• ๊ฐ™์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘ ์ž์ฒด ์ž„์˜ ๋น„ํŠธ๋กœ ์‹œ๋“œ ๋œ ๋™์ผํ•œ ์ฒด๊ณ„์˜ PRNG ๋ชจ์Œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ํ•˜๋Š” ์ผ์„ ํ•œ ์ค„ (์˜ˆ : a)์—์„œ ์„ ํƒ ์ง€์  (๋˜๋Š” ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” ์ž„์˜์˜ ์ˆซ์ž์˜ ์–‘์— ํ•ด๋‹นํ•˜๋Š” ํŠน์ • ์ตœ๋Œ€ ๊ธธ์ด๊นŒ์ง€์˜ ๊ฐ„๊ฒฉ) (์˜ˆ : 2 ^ 56)์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2 ^ 255 ์ ์ด์žˆ๋Š” ์„ ). _n_ ๊ฐ„๊ฒฉ์„ ์š”์ฒญํ•˜๋ฉด ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐ„๊ฒฉ๊ณผ ๊ฒน์น  ํ™•๋ฅ ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊ธฐ๋ณธ์ ์ธ ํ™•๋ฅ ์ž…๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด) ์•„๋ฌด๋„ ์ดˆ๋“ฑ ์ˆ˜ํ•™์„ ํฌํ•จํ•˜๋Š” ๋…ผ๋ฌธ์— ๋Œ€ํ•ด ํฅ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์— ๊ด€ํ•œ ๋…ผ๋ฌธ์„ ์ถœํŒ ํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ( @lemire ๋Š” ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!)

[๋‚˜๋Š” ๋‹น์‹ ์ด ์ผ๋ฐ˜์ ์œผ๋กœ _ํ•˜์ง€ _ ๋ง์•„์•ผํ•˜๋Š” ๊ฒƒ์€ ์Šค์Šค๋กœ ๋‚˜์˜ค๋Š” ์ž„์˜์˜ ๋น„ํŠธ๋กœ PRNG๋ฅผ ์‹œ๋“œํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•œ๋‹ค. ๋„ˆ๋ฌด ๊ทผ์นœ์ƒ๊ฐ„ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.]

๋งž์Šต๋‹ˆ๋‹ค. ์ž˜ ์„ค๊ณ„๋œ _SeedSequence_์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž„์˜์˜ ์ดˆ๊ธฐ ์‹œ๋“œ๋ฅผ ์ทจํ•˜๊ณ  ๊ฒน์น˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ฃผ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ์‹œ์ž‘์ ์„ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋…๋ฆฝ์  ์ธ ์ŠคํŠธ๋ฆผ์„ ์–ป๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋ฉด ๊ทธ๋ ‡๊ฒŒํ•˜์„ธ์š”. ์ด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ API ์„ค๊ณ„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋œ ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ ์ดˆ๊ธฐํ™” ๋œ PRNG์˜ ํ˜„์žฌ ์ƒํƒœ, ์ŠคํŠธ๋ฆผ ID์˜ ํ•ด์‹œ ๋ฏน์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ฃผ๊ธฐ์˜ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ ํ”„ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์•ˆ์ „ํ•œ์ง€์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค). jumped() ์˜ ์‹คํŒจ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์ฃผ๊ธฐ์—์„œ ์ž˜ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์š”์ธ์€ ์•„๋‹™๋‹ˆ๋‹ค. jumped() ๋Š” ๋˜ํ•œ ๊ฒน์น˜์ง€ ์•Š๋Š” ์‹œํ€€์Šค์˜ ๋จผ ๋ถ€๋ถ„์œผ๋กœ ๋ณด๋‚ด์ง€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ ํ”„๊ฐ€ ์ž˜ ์„ ํƒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ดˆ๊ธฐ ๋ถ€๋ถ„๊ณผ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€ ๋  ์ˆ˜์žˆ๋Š” ๋ถ€๋ถ„ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์ข‹์€ ์ ํ”„์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ถ„๋ช…ํžˆ PCG์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ PRNG๋ฅผ ์ „ํ™˜ ํ•จ์ˆ˜ ๋ฐ ์ถœ๋ ฅ ํ•จ์ˆ˜๋กœ ์ƒ๊ฐํ•˜๋ฉด์ด new_state = seed_seq(old_state||streamID) ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•œ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ „ํ™˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” seed_seq ๊ด€๋ จ๋œ ์—ฐ์‚ฐ์ด ๊ฐ PRNG ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๋˜๋Š” ๊ทธ ์—ญ)์˜ ์ „ํ™˜ ํ•จ์ˆ˜์™€ ์ถฉ๋ถ„ํžˆ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•ด์•ผํ•˜๋ฉฐ ๋‹ค๋ฅธ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ง์—์„œ ๋‚ด์žฅ ๋ญ”๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ๊ฒƒ์ด๋‹ค wyhash ์ดˆ๊ธฐํ™”ํ•˜๋Š” wyrand . ๋งํ–ˆ๋“ฏ์ด PRNG ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด ๋น„ํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ์˜ ๋ชจ๋“  PRNG (๋‚ด๊ฐ€ ์Šค์Šค๋กœ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ ์œผ๋ฉดํ•˜๋Š” ์—ฐ๊ตฌ)๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— new_state = seed_seq(old_state||streamID) ๋Š” ๋‹ค์ค‘ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด _SeedSequence_๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค์ด ์ ์—์„œ off๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ์ƒํƒœ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋Œ์–ด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด C ++์˜ ๊ฒฝํ—˜, ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ๊ตฌํ˜„์— ์‰ฌ๊ณ , ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹จ์ผ ์ŠคํŠธ๋ฆผ ๋Œ€์‘ ๋ฌผ๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด PractRand๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝํ—˜์  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์กฐ์ •์ด ํ•„์š”์—†๋Š” ๋ฐฉ์‹์œผ๋กœ PRNG๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์‹œ ์ ํ”„๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ ID๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ผ๋ถ€ ํ†ต์‹  ๋˜๋Š” ์‚ฌ์ „ ํ• ๋‹น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. dask ์€ (๋Š”) ๊ณผ๊ฑฐ์— ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ณ์€ ์ผ์„ํ•˜๊ธฐ ์œ„ํ•ด ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ์ข‹์€ ์‹œ๋”ฉ์—๋งŒ ์˜์กดํ•˜๋Š” ์ข‹์€ ๋Œ€์•ˆ์ด ์žˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ธฐ๋ณธ๊ฐ’ ์„ ํƒ์„์œ„ํ•œ ๊ธฐ์ค€์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ถฉ๋ถ„ํžˆ ํฐ ์ƒํƒœ ๊ณต๊ฐ„์„ ๊ฐ€์ง„ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, 63 ๋น„ํŠธ ํ•ด์‹œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ฐจ ์ŠคํŠธ๋ฆผ ID ( range(N) )์—์„œ PCG32 ์ฆ๋ถ„์„ ์œ ๋„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. 8192 ๊ฐœ์˜ ์ธํ„ฐ๋ฆฌ๋ธŒ ์ŠคํŠธ๋ฆผ์€ PractRand๋ฅผ 2TiB๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. PCG ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ ID๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…๋ฆฝ์  ์ธ ์ŠคํŠธ๋ฆผ์„ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์–ป์„ ๊ฒƒ์„ ์ œ์•ˆํ•˜๋”๋ผ๋„์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ๋ถ„์„ ์œ ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋œ ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ ์ดˆ๊ธฐํ™” ๋œ PRNG์˜ ํ˜„์žฌ ์ƒํƒœ, ์ŠคํŠธ๋ฆผ ID์˜ ํ•ด์‹œ ๋ฏน์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ฃผ๊ธฐ์˜ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ ํ”„ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์•ˆ์ „ํ•œ์ง€์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ์•„๋งˆ๋„ ๋ชจํ˜ธํ•˜๊ฒŒ ์ž์‹ ์„ ํ‘œํ˜„ํ–ˆ์ง€๋งŒ ์•„๋‹ˆ์š” , PRNG์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ์ž๊ฐ€ ์žฌ ํŒŒ์ข…์— ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋ ค๋Š” ์˜๋„๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ FWIW, SplitMix๋Š”์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ split() ์ž‘์—…์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๊ฒƒ์„ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์€ ์ •๋ณด ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, SplitMix์˜ split() ํ•จ์ˆ˜์— ์˜ํ•ด ๋‚ด๊ฐ€ ์™œ ๊ฒ์— ์งˆ ๋ ธ๋Š”์ง€ (์•„๋งˆ๋„ ๊ฒ์— ์งˆ ๋ ธ์„ ๊ฒƒ๋ณด๋‹ค ๋” ๋”์ฐ ํ–ˆ์Œ)์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ, SplitMix์™€ PCG๋Š” ๊ฑฐ์˜ ๊ฐ™์€์‹œ๊ธฐ์— ๋…๋ฆฝ์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค (SplitMix๋Š” 2014 ๋…„ 10 ์›” 20 ์ผ์— ๊ฒŒ์‹œ ๋œ ๋ฐ˜๋ฉด pcg-random.org ๋Š” 2014 ๋…„ 8 ์›”์— ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ 2014 ๋…„ 9 ์›” 5 ์ผ์— PCG ๋…ผ๋ฌธ์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ). PCG์™€ SplitMix (๋ฐ Vigna์˜ xor shift * ๋ฐ xorshift +๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ๊ธฐํƒ€ PRNG โ€” 2014 ๋…„์— ์ถœ์‹œ๋จ) ์‚ฌ์ด์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ์‚ฌ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์Šคํฌ๋žจ๋ธ”๋ง ์ถœ๋ ฅ ํ•จ์ˆ˜์— ์˜ํ•ด ์ˆ˜์ • ๋œ ์ƒ๋‹นํžˆ ๋‹จ์ˆœํ•˜์ง€ ์•Š์€ ์ƒํƒœ ์ „ํ™˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ PCG ๋…ผ๋ฌธ์„ ์“ธ ๋•Œ, ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ๊ฒƒ์€ split() ํ•จ์ˆ˜ ์˜€์ง€๋งŒ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ฐ ๋‹จ๊ณ„์—์„œ ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜์žˆ๋Š” _k_ ๋น„ํŠธ PRNG๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ _k_ ๋‹จ๊ณ„ ๋‚ด์—์„œ ์ด์ „์— ์žˆ์—ˆ๋˜ ์ƒํƒœ์— ๋„๋‹ฌ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๋น ๋ฅธ ์ฆ๊ฑฐ๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ์ „์ฒด ๊ฐœ๋…์„ ์ฆ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ด€์ฐฐ์€ ๋…ผ๋ฌธ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ฆ๊ฑฐ ์ด์ „์— ๋‚ด ์ƒ๊ฐ์„ ์ˆ™๊ณ  ํ•œ ๊ฒฐ๊ณผ, ๋…ผ๋ฌธ์˜ ๊ฑฐ์˜ ์ตœ์ข… ์ดˆ์•ˆ์˜ ๊ฐ์ฃผ์—์„œ PCG์˜ ์ถœ๋ ฅ์ด ํ•ด์‹œ / ์Šคํฌ๋žจ๋ธ” / ์ˆœ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ๊ธฐ๋ฐœํ•˜๊ฒŒ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์žฅ๋‚œ ์Šค๋Ÿฌ์›€์„ ๋Š๋ผ๋ฉด ์ž์ฒด ์ถœ๋ ฅ์œผ๋กœ ๋ฐœ์ „๊ธฐ๋ฅผ ๋‹ค์‹œ ์‹œ๋“œํ•˜๊ณ  ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ์ƒํƒœ๋กœ PRNG๋ฅผ ๋‹ค์‹œ ์‹œ๋“œํ•˜๋Š” ๊ฒƒ์ด PRNG์˜ ์˜ค์šฉ์œผ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๊ธฐ๋ฐœํ•จ์ด ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋„ˆ๋ฌด ํฐ ์œ„ํ—˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข… ๋ฒ„์ „์—์„œ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฒฝํ—˜์ด์—†๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SplitMix ๋…ผ๋ฌธ์„ ์ฝ์œผ๋ฉด์„œ ๋งˆ์Œ์— ๋“œ๋Š” ๊ฒƒ์„ ๋งŽ์ด ์ฐพ์•˜์ง€๋งŒ split() ๋ณด๊ณ  ๋งค์šฐ ๋‹นํ™ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋†๋‹ด์œผ๋กœ ๋งŒ ์ƒ๊ฐํ•˜๊ณ  ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋…„์ด ์ง€๋‚˜์•ผ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š” ์ง€์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค .

์ „์ฒด์ ์ธ ์š”์ ์€ ์ถฉ๋ถ„ํ•œ ์ƒํƒœ ๊ณต๊ฐ„์ด ์žˆ๊ณ  SplitMix๋Š” ๊ฑฐ์˜ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž์ฒด ๋‹ค์‹œ ์‹œ๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋žœ๋ค ๋งคํ•‘ (์ด ์ƒํ™ฉ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃจ๊ณ ์žˆ๋Š” ๊ฒƒ)์€ "์ ๊ทผ ํ™•๋ฅ ์ด 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€์žฅ ๋†’์€ ํŠธ๋ฆฌ๋Š” ๊ฐ€์žฅ ๊ธด์ฃผ๊ธฐ์— ๋ฟŒ๋ฆฌ๋ฅผ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํ•œ ํ™•์‹ ์„ ๊ฐ–๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ด๋„ˆ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๋ณ‘๋ฆฌ๊ฐ€ ๋””์ž์ธ์— ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ํ•œ.

์žฌ๋ฏธ๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— next() ์™€ split() ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ (๊ทธ๋ฆฌ๊ณ  ์—„๊ฒฉํ•˜๊ฒŒ ๊ณ ์ • ๋œ) ๋ฐฉ๋ฒ•์„ ํƒ๊ตฌํ•˜๋Š” SplitMix์˜ ์ž‘์€ ๋ฒ„์ „์˜ ์ƒํƒœ ๊ณต๊ฐ„ ๋คํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Testing: SplitMix16: void advance() { rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 4, at 000043b0 after 516 steps
- state 00000050 -> new cycle 2, size 41, at 00002103 after 2 steps
- state 000000cd -> new cycle 3, size 4, at 0000681a after 6 steps
- state 00000141 -> new cycle 4, size 23, at 00004001 after 11 steps
- state 00000dee -> new cycle 5, size 7, at 00007436 after 4 steps
- state 00008000 -> new cycle 6, size 90278, at 5e5ce38c after 46472 steps
- state 00030000 -> new cycle 7, size 6572, at 12c65374 after 10187 steps
- state 00030016 -> new cycle 8, size 3286, at 65d0fc0c after 402 steps
- state 00058000 -> new cycle 9, size 17097, at 2a2951fb after 31983 steps
- state 08040000 -> new cycle 10, size 36, at 08040000 after 0 steps
- state 08040001 -> new cycle 11, size 218, at 08040740 after 360 steps
- state 08040004 -> new cycle 12, size 10, at 38c01b3d after 107 steps
- state 08040006 -> new cycle 13, size 62, at 38c013a0 after 39 steps
- state 08040009 -> new cycle 14, size 124, at 08045259 after 24 steps
- state 08040019 -> new cycle 15, size 32, at 38c06c63 after 151 steps
- state 08040059 -> new cycle 16, size 34, at 38c00217 after 17 steps
- state 08040243 -> new cycle 17, size 16, at 38c06e36 after 13 steps
- state 123c8000 -> new cycle 18, size 684, at 77d9595f after 194 steps
- state 123c8002 -> new cycle 19, size 336, at 5de8164d after 141 steps
- state 123c9535 -> new cycle 20, size 12, at 123c9535 after 0 steps
- state 139f0000 -> new cycle 21, size 545, at 743e3a31 after 474 steps
- state 139f0b35 -> new cycle 22, size 5, at 139f0b35 after 0 steps
- state 139f1b35 -> new cycle 23, size 5, at 68d3c943 after 8 steps

Cycle Summary:
- Cycle 1, Period 4, Feeders 32095
- Cycle 2, Period 41, Feeders 188
- Cycle 3, Period 4, Feeders 214
- Cycle 4, Period 23, Feeders 180
- Cycle 5, Period 7, Feeders 12
- Cycle 6, Period 90278, Feeders 1479024474
- Cycle 7, Period 6572, Feeders 102385385
- Cycle 8, Period 3286, Feeders 5280405
- Cycle 9, Period 17097, Feeders 560217399
- Cycle 10, Period 36, Feeders 413
- Cycle 11, Period 218, Feeders 51390
- Cycle 12, Period 10, Feeders 1080
- Cycle 13, Period 62, Feeders 4113
- Cycle 14, Period 124, Feeders 4809
- Cycle 15, Period 32, Feeders 2567
- Cycle 16, Period 34, Feeders 545
- Cycle 17, Period 16, Feeders 87
- Cycle 18, Period 684, Feeders 95306
- Cycle 19, Period 336, Feeders 100263
- Cycle 20, Period 12, Feeders 7
- Cycle 21, Period 545, Feeders 163239
- Cycle 22, Period 5, Feeders 12
- Cycle 23, Period 5, Feeders 34

- Histogram of indegrees of all 2147483648 nodes:
      0  529334272
      1 1089077248
      2  528875520
      3     131072
      4      65536
Testing: SplitMix16: void advance() { rng.next(); rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 36174, at 6b34fe8b after 21045 steps
- state 00000002 -> new cycle 2, size 4300, at 042a7c6b after 51287 steps
- state 0000000f -> new cycle 3, size 11050, at 0b471eb5 after 4832 steps
- state 0000001d -> new cycle 4, size 38804, at 2879c05c after 16280 steps
- state 00000020 -> new cycle 5, size 4606, at 46e0bdf6 after 7379 steps
- state 00046307 -> new cycle 6, size 137, at 0a180f87 after 89 steps
- state 00081c25 -> new cycle 7, size 16, at 177ed4d8 after 27 steps
- state 0044c604 -> new cycle 8, size 140, at 5e1f125b after 44 steps
- state 006e329f -> new cycle 9, size 18, at 006e329f after 0 steps
- state 13ebcefc -> new cycle 10, size 10, at 13ebcefc after 0 steps

Cycle Summary:
- Cycle 1, Period 36174, Feeders 975695553
- Cycle 2, Period 4300, Feeders 766130785
- Cycle 3, Period 11050, Feeders 110698235
- Cycle 4, Period 38804, Feeders 251133911
- Cycle 5, Period 4606, Feeders 43723200
- Cycle 6, Period 137, Feeders 4101
- Cycle 7, Period 16, Feeders 172
- Cycle 8, Period 140, Feeders 2310
- Cycle 9, Period 18, Feeders 124
- Cycle 10, Period 10, Feeders 2

- Histogram of indegrees of all 2147483648 nodes:
      0  529334272
      1 1089077248
      2  528875520
      3     131072
      4      65536
Testing: SplitMix16: void advance() { rng.next(); rng = rng.split(); rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 40959, at 0069b555 after 49520 steps
- state 00000031 -> new cycle 2, size 1436, at 5f619520 after 2229 steps
- state 000003a4 -> new cycle 3, size 878, at 18d1cb99 after 1620 steps
- state 0000046c -> new cycle 4, size 2596, at 46ba79c0 after 1591 steps
- state 0000c6e2 -> new cycle 5, size 24, at 0212f11b after 179 steps
- state 000af7c9 -> new cycle 6, size 61, at 40684560 after 14 steps
- state 00154c16 -> new cycle 7, size 110, at 29e067ce after 12 steps
- state 0986e055 -> new cycle 8, size 4, at 2b701c82 after 7 steps
- state 09e73c93 -> new cycle 9, size 3, at 352aab83 after 1 steps
- state 19dda2c0 -> new cycle 10, size 1, at 78825f1b after 2 steps

Cycle Summary:
- Cycle 1, Period 40959, Feeders 2129209855
- Cycle 2, Period 1436, Feeders 5125630
- Cycle 3, Period 878, Feeders 7077139
- Cycle 4, Period 2596, Feeders 5997555
- Cycle 5, Period 24, Feeders 24221
- Cycle 6, Period 61, Feeders 1774
- Cycle 7, Period 110, Feeders 1372
- Cycle 8, Period 4, Feeders 23
- Cycle 9, Period 3, Feeders 4
- Cycle 10, Period 1, Feeders 3

- Histogram of indegrees of all 2147483648 nodes:
      0  829903716
      1  684575196
      2  468475086
      3  132259769
      4   32192209
      5      58402
      6      17026
      7       1982
      8        261
      9          1
Testing: SplitMix16: void advance() { rng.next(); rng.next(); rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 55038, at 3e57af06 after 30005 steps
- state 00000005 -> new cycle 2, size 376, at 4979e8b5 after 6135 steps
- state 0000001e -> new cycle 3, size 10261, at 0cd55c94 after 1837 steps
- state 0000002d -> new cycle 4, size 3778, at 7f5f6afe after 3781 steps
- state 00000064 -> new cycle 5, size 2596, at 3bc5404b after 5124 steps
- state 0000012b -> new cycle 6, size 4210, at 525cc9f3 after 397 steps
- state 00000277 -> new cycle 7, size 1580, at 410010c8 after 1113 steps
- state 00001394 -> new cycle 8, size 916, at 7b20dfb0 after 193 steps
- state 00063c2d -> new cycle 9, size 51, at 6e92350b after 121 steps
- state 058426a6 -> new cycle 10, size 8, at 058426a6 after 0 steps
- state 0e5d412d -> new cycle 11, size 1, at 0e5d412d after 0 steps
- state 4c2556c2 -> new cycle 12, size 1, at 4c2556c2 after 0 steps

Cycle Summary:
- Cycle 1, Period 55038, Feeders 2027042770
- Cycle 2, Period 376, Feeders 28715945
- Cycle 3, Period 10261, Feeders 49621538
- Cycle 4, Period 3778, Feeders 13709744
- Cycle 5, Period 2596, Feeders 15367156
- Cycle 6, Period 4210, Feeders 10418779
- Cycle 7, Period 1580, Feeders 1782252
- Cycle 8, Period 916, Feeders 744273
- Cycle 9, Period 51, Feeders 2351
- Cycle 10, Period 8, Feeders 24
- Cycle 11, Period 1, Feeders 0
- Cycle 12, Period 1, Feeders 0

- Histogram of indegrees of all 2147483648 nodes:
      0  529334272
      1 1089077248
      2  528875520
      3     131072
      4      65536

๊ธฐํƒ€

์•„, ์ข‹์•„์š”. ๋‚˜๋Š” ๋ช‡ ๋…„ ์ „์— ์ง์ ‘ ๊ทธ ๋ผ์ธ์— ๋”ฐ๋ผ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ๋‚ด๋†“์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๊ฒƒ์„ ๋†“์นœ ๊ฒƒ์ด ๋‘๋ ค์› ๋‹ค. :-)

PCG ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ฆ๋ถ„์„ ์œ ๋„ํ•˜๊ธฐ์œ„ํ•œ ํ•ด์‹œ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ตœ์ข… ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋…๋ฆฝ์  ์ธ ์ŠคํŠธ๋ฆผ์„ ์–ป๊ธฐ์œ„ํ•œ ์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์ณ๋‘์‹ญ์‹œ์˜ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ํ•œ, ์˜ค์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ˆœ์ฐจ ์ŠคํŠธ๋ฆผ ID๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ์—์„œ PCG64์—์„œ ๋‘ ์ƒํƒœ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜์žˆ๋Š” (์‰ฌ์šด) ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๊ณต๊ฐœํ•˜์ง€๋Š” ์•Š์ง€๋งŒ http://www.pcg-random.org/useful-features.html#distance

ํ˜ธ๊ธฐ์‹ฌ์—์„œ PCG64์—์„œ ๋‘ ์ƒํƒœ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜์žˆ๋Š” (์‰ฌ์šด) ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๊ณต๊ฐœํ•˜์ง€๋Š” ์•Š์ง€๋งŒ http://www.pcg-random.org/useful-features.html#distance

C ++ ์†Œ์Šค ์—์„œ distance ํ•จ์ˆ˜ ๋Š” ์ŠคํŠธ๋ฆผ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ๋ ค ์ฃผ์–ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ‘๊ทผ ์ง€์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์ŠคํŠธ๋ฆผ ๊ฐ„์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ถ”๊ฐ€ ์ƒ์ˆ˜ ์ž„).

๋ง๋ถ™์—ฌ์„œ, ๊ธฐ๋ณธ LCG์˜ ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์น˜์™€์˜ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์งง์€ ๊ฑฐ๋ฆฌ๋Š” ๋ถ„๋ช…ํžˆ ๋‚˜์˜์ง€๋งŒ (๊ทธ๋ฆฌ๊ณ  PRNG์— ์ „ํ˜€ ๋‚˜์˜๋‹ค), 1 ๋น„ํŠธ ์„ธํŠธ ๋งŒ์žˆ๋Š” ๊ฑฐ๋ฆฌ๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2 ^ 64 ( 0x10000000000000000 )๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค. .jumped ์€ (๋Š”) ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‚ด PCG ํ•  ์ผ ๋ชฉ๋ก์—๋Š” ๋‘ ์ƒํƒœ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ๋ณด๊ณ  ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ๋ณด์ด๋Š”์ง€ (ํ•ด๋ฐ ๊ฐ€์ค‘์น˜ ๋“ฑ์„ ํ†ตํ•ด)๋ฅผ ์•Œ๋ ค์ฃผ๋Š” " independence_score "ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋น„ํŠธ๋Š” 0๊ณผ 1์ด๋˜๊ณ  ์ž์œ ๋กญ๊ฒŒ ํฉ์–ด์ง‘๋‹ˆ๋‹ค).

PCG64๋กœ _keep_ jumped ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ n * 0x10000000000000000 ๋งŒํผ ์ ํ”„ํ•˜๋Š” ๋Œ€์‹  n * 0x9e3779b97f4a7c150000000000000000 ๋งŒํผ ์ ํ”„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (128 ๋น„ํŠธ๋กœ ์ž˜๋ฆผ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ธฐ๋ณธ LCG์— ๋Œ€ํ•œ ๋ณ‘๋ฆฌํ•™ ์ ์ด ์ง€ ์•Š๊ณ  ์›ํ•˜๋Š” ๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ ์†์„ฑ ( .jumped(3).jumped(5) == .jumped(8) )์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ €๋Š” ๋˜ํ•œ " 0x10000000000000000 ์ „์ง„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋ผ๋Š” ๋ง์ด " ์ž˜, ๊ทธ๋ ‡๊ฒŒ ์‘๋‹ตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค "๋ผ๋Š” ๊ฒƒ์„ independence_score ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ 

PCG ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ฆ๋ถ„์„ ์œ ๋„ํ•˜๊ธฐ์œ„ํ•œ ํ•ด์‹œ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ตœ์ข… ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋…๋ฆฝ์  ์ธ ์ŠคํŠธ๋ฆผ์„ ์–ป๊ธฐ์œ„ํ•œ ์ฃผ์š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์ณ๋‘์‹ญ์‹œ์˜ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ํ•œ, ์˜ค์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ˆœ์ฐจ ์ŠคํŠธ๋ฆผ ID๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Murmur3 ๋ฏน์„œ ๋ฅผ ์‚ฌ์šฉ 0x9e3779b97f4a7c15f39cc0605cedc835 (ฯ•์˜ ๋ถ„์ˆ˜ ๋ถ€๋ถ„)์„ ์ข‹์•„ํ•˜์ง€๋งŒ 0xb7e151628aed2a6abf7158809cf4f3c7 (e์˜ ๋ถ„์ˆ˜ ๋ถ€๋ถ„)๋„ ๊ดœ์ฐฎ๊ฑฐ๋‚˜ _any_ ์ž„์˜์˜ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.)

BigCrush์™€ PractRand๋ฅผ ํ†ต๊ณผ ํ•œ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ wyhash (https://github.com/wangyi-fudan/wyhash)๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. c ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

inline  uint64_t    wyrand(uint64_t *seed){    
    *seed+=0xa0761d6478bd642full;    
    __uint128_t t=(__uint128_t)(*seed^0xe7037ed1a0b428dbull)*(*seed);    
    return  (t>>64)^t;    
}

@ wangyi-fudan, ๋‚˜๋Š” ์ด๊ฒƒ์ด bijection์ด๋ผ๊ณ  ํ™•์‹  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์ œํ•œ๋œ ์ง€์‹์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์™œ PRNG์— bijection์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์„ ํ˜ธ๋ฉ๋‹ˆ๊นŒ?
๋ช‡ ๊ฐ€์ง€ ์„ค๋ช…์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :-) @imneme

@ wangyi-fudan, 64 ๋น„ํŠธ ์ •์ˆ˜์—์„œ 64 ๋น„ํŠธ ์ •์ˆ˜๋กœ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ์ด๋“ฑ๋ถ„ (์ฆ‰, ์ผ๋Œ€์ผ ํ•จ์ˆ˜)์ด ์•„๋‹ˆ๋ฉด ์ผ๋ถ€ ๊ฒฐ๊ณผ๋Š” ๋‘ ๋ฒˆ ์ด์ƒ ์ƒ์„ฑ๋˜๊ณ  ์ผ๋ถ€๋Š” ์ „ํ˜€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ํŽธ๊ฒฌ์ž…๋‹ˆ๋‹ค.

๋„ค๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ•˜๋ ค๋Š”์ง€ ์•Œ ๊ฒ ์–ด. ๊ทธ๋Ÿฌ๋‚˜ 64 ๋น„ํŠธ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ R์˜ ๊ฒฝ์šฐ 1.2 * 2 ^ 32 ๋‚œ์ˆ˜ (http://mathworld.wolfram.com/BirthdayAttack.html) ์ดํ›„์— ํ•œ ๋ฒˆ์˜ ์ถฉ๋Œ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. 2 ^ 64 ๊ฐœ์˜ ๋‚œ์ˆ˜๋กœ ์ถฉ๋Œ์ด ๋งŽ์€ ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์€ ์ž์—ฐ ์Šค๋Ÿฝ์ง€๋งŒ bijection์€ ์ž์—ฐ์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„๋ฐ• ํ…Œ์ด๋ธ” (์˜ˆ : 3 ๋น„ํŠธ PRNG)์ด 8 ๊ฐœ์˜ ํŠธ๋ ˆ์ผ ๋‚ด์—์„œ 0 ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค ๊ณ  ํŒ๋‹จ๋˜๋ฉด 0์ด ์•„๋‹Œ 5 ๊ฐœ๋ฅผ ๊ด€์ฐฐ ํ•œ ํ›„ ๊ฐํžˆ 0์— ํฐ ๋ฒ ํŒ…์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ wangyi-fudan,์ด ๋งฅ๋ฝ์—์„œ ์šฐ๋ฆฌ๋Š” 1,2,3๊ณผ ๊ฐ™์€ ์ŠคํŠธ๋ฆผ์ด ๋” ๋ฌด์ž‘์œ„๋กœ ๋ณด์ด๋Š” (์ผ๋ช… ๋” ์ •์ƒ์ )์ด๋˜๋„๋ก ์ŠคํŠธ๋ฆผ ID๋ฅผ ํผ ๋ฎคํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ถฉ๋Œ์—๋Š” ๋ฏธ๋•์ด ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ PRNG์˜ ๊ฒฝ์šฐ ์ž„์˜ ๋งคํ•‘์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” PRNG์™€ ์ž„์˜์˜ ๊ฐ€์—ญ ๋งคํ•‘ (์ผ๋Œ€์ผ ํ•จ์ˆ˜)์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” PRNG์˜ ์ฐจ์ด์ ์„ ์ฝ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ผ์ง€ ๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ํฌ๊ธฐ, ์ž„์˜ ๋งคํ•‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ PRNG๋Š” ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฒƒ๋ณด๋‹ค ํŽธํ–ฅ์„ ๋ณด์ด๊ณ  ๋” ๋นจ๋ฆฌ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํฐ ํฌ๊ธฐ์—์„œ๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฒฐํ•จ์„ ๊ฐ์ง€ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

_n_ ๊ฐ„๊ฒฉ์„ ์š”์ฒญํ•˜๋ฉด ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐ„๊ฒฉ๊ณผ ๊ฒน์น  ํ™•๋ฅ ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊ธฐ๋ณธ์ ์ธ ํ™•๋ฅ ์ž…๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด) ์•„๋ฌด๋„ ์ดˆ๋“ฑ ์ˆ˜ํ•™์„ ํฌํ•จํ•˜๋Š” ๋…ผ๋ฌธ์— ๋Œ€ํ•ด ํฅ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์— ๊ด€ํ•œ ๋…ผ๋ฌธ์„ ์ถœํŒ ํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด Pierre L' Ecuyer๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ;-) 15 ํŽ˜์ด์ง€

์˜ˆ, ๊ทธ๊ฐ€ ๊ธฐ๋ณธ์„ ์„ค๋ช…ํ•˜๋ฉด ๊ดœ์ฐฎ์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค!

@rkern @imneme ๋‹จ์ˆœ์„ฑ์€ ์†Œํ”„ํŠธ์›จ์–ด์™€ ์ˆ˜ํ•™ ๋ชจ๋‘์—์„œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์ด ๋‹จ์ˆœํ•œ ์ž‘์—…์— ๊ฐ๋ช…์„๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ์ˆœ ๋œ ์ฆ๊ฑฐ๋กœ ๊ฐ„์ฃผํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

@lemire : ์ปดํ“จํ„ฐ ๊ณผํ•™์ž๋ฅผ ๋น„ํŒํ•˜๋Š” ๋ฐฉ๋ฒ• _์ด๋ผ๋Š” ๋งŽ์€ ์ง„์‹ค์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์œ ๋จธ ์ž‘ํ’ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘ํ’ˆ์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ์ด๋ก ๊ฐ€๋Š” ์ •๊ตํ•จ์„ ์„ ํ˜ธํ•˜๊ณ  ์‹คํ—˜๊ฐ€๋Š” ๋‹จ์ˆœํ•จ์„ ์„ ํ˜ธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒญ์ค‘์ด ์‹คํ—˜ ์ฃผ์˜์ž๋ผ๋ฉด ๋‹จ์ˆœํ•จ์— ๊ธฐ๋ปํ•  ๊ฒƒ์ด์ง€๋งŒ ์ฒญ์ค‘์ด ์ด๋ก ๊ฐ€ ์ค‘ ํ•œ ๋ช…์ด๋ผ๋ฉด ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ BitGenerator ๋Š” PCG64 ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ ค ๊นŠ์€ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒด๋ ฅ!

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ์˜๊ฐ์„ ๋ฐ›์•„๋ณด๊ณ  ํ•  ๋‰ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

์—ฌ๋Ÿฌ ์ฒ™๋„์—์„œ pcg64 ์€ ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ†ต๊ณ„์  ํ’ˆ์งˆ์˜ ์ผ๋ฐ˜์ ์ธ ์ธก์ • ํ•˜์—์„œ ๊นจ๋—ํ•œ ๊ฑด๊ฐ• ์ง„๋‹จ์„œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ตœ๊ทผ์—๋Š” PractRand๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 0.5 ํŽ˜ํƒ€ ๋ฐ”์ดํŠธ๊นŒ์ง€ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜์ด ์‹ค์—์„œ ๋‚˜์˜จ ๋ณ‘๋ฆฌํ•™์€ ์ €์™€ ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , " ๊ธ€์Ž„์š”, ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋งˆ์„ธ์š” "๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฒ”์šฉ PRNG์˜ ์š”์ ์€ ๊ฒฌ๊ณ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ž˜ํ•˜๊ณ  ์‹ถ์—ˆ์–ด์š” ...

๊ทธ๋ž˜์„œ ์•ฝ 25 ์ผ ์ „์— ์ €๋Š” PCG ์ œํ’ˆ๊ตฐ์˜ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์›์„ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณจ

๋‚ด ๋ชฉํ‘œ๋Š” ํ˜„์žฌ pcg64 ๋ณ€ํ˜•์„ ๋Œ€์ฒด ํ•  ์ˆ˜์žˆ๋Š” ์ƒˆ๋กœ์šด PCG ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด :

  • ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” XSL RR๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„ํŠธ๋ฅผ ์Šคํฌ๋žจ๋ธ”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๋ ‡๊ฒŒํ•˜๋ฉด์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
  • ์„ฑ๋Šฅ์€ ํ˜„์žฌ pcg64 ๋ณด๋‹ค ๋น ๋ฅด๊ฑฐ๋‚˜ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ๋””์ž์ธ์€ PCG ๋ฐฉ์‹์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์‚ฌ์†Œํ•˜๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์–ด์•ผํ•˜๋ฏ€๋กœ ์ถœ๋ ฅ ํ•จ์ˆ˜ ์ž‘์—…์˜ _any_๋ฅผ ์‰ฝ๊ฒŒ ์ทจ์†Œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค).

ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ตœ์ƒ์˜ ํ’ˆ์งˆ์„ ์–ป์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๋•Œ ์ ˆ์ถฉ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†๋„์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ถœ๋ ฅ ๊ธฐ๋Šฅ์— ๋” ๋งŽ์€ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋” ์‹ฌํ•˜๊ฒŒ ์Šคํฌ๋žจ๋ธ” ๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ PCG์˜ ์š”์ ์€ ๊ธฐ๋ณธ LCG๊ฐ€ "๊ฑฐ์˜ ์ถฉ๋ถ„"ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์นด์šดํ„ฐ๊ฐ€ 1 ์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ์ผ๋Ÿฌ

์„ฑ๊ณต์„๋ณด๊ณ ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค! ์•ฝ 25 ์ผ ์ „์— ์ฒ˜์Œ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ํœด๊ฐ€ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. 10 ์ผ ์ „์ฏค ๋Œ์•„ ์™”์„ ๋•Œ ์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์•„์ด๋””์–ด๋ฅผ ์‹œ๋„ํ•ด ๋ณด์•˜๊ณ  ์ž˜ ์ž‘๋™ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜์–ด ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์‹œ๊ฐ„์€ ๋Œ€๋ถ€๋ถ„ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ œ๋Š” C ++ ๋ฒ„์ „์˜ PCG์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ๋งŒํผ ๋งŒ์กฑ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ํฌ๊ธฐ์˜ ํ…Œ์ŠคํŠธ๋Š” XSL RR๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๊ณ  RXS M๊ณผ ๊ฒฝ์Ÿํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋” ํฐ ํฌ๊ธฐ์—์„œ ๋น›๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ชฉํ‘œ๋„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

์„ธ๋ถ€

FWIW์—์„œ ์ƒˆ๋กœ์šด ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (64 ๋น„ํŠธ ์ถœ๋ ฅ์˜ ๊ฒฝ์šฐ).

uint64_t output(__uint128_t internal)
{
    uint64_t hi = internal >> 64;
    uint64_t lo = internal;

    lo |= 1;
    hi ^= hi >> 32;
    hi *= 0xda942042e4dd58b5ULL;
    hi ^= hi >> 48;
    hi *= lo;
    return hi;
}

์ด ์ถœ๋ ฅ ํ•จ์ˆ˜๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” xorshift-multiply์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์Šน์ˆ˜์˜ ์„ ํƒ์€ (a) ๋งค์ง ์ƒ์ˆ˜์˜ ์ˆ˜๋ฅผ ๋‚ฎ์ถ”๊ณ  (b) ์ˆœ์—ด์ด ์ทจ์†Œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  (ํ•˜์œ„ ๋น„ํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด์—†๋Š” ๊ฒฝ์šฐ) ์ „์ฒด "๋ฌด์ž‘์œ„ ํ™”"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PCG ์ถœ๋ ฅ ๊ธฐ๋Šฅ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ–๋Š” ์ž์ฒด ํ’ˆ์งˆ.

๊ธฐํƒ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ

๋˜ํ•œ 0xda942042e4dd58b5 ์ด์ด PRNG (๋ฐ ๋ชจ๋“  cm_ ์ ‘๋‘์‚ฌ๊ฐ€์žˆ๋Š” 128 ๋น„ํŠธ ์ƒํƒœ PCG ์ƒ์„ฑ๊ธฐ)์— ๋Œ€ํ•œ LCG ์Šน์ˆ˜ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. 0x2360ed051fc65da44385df649fccf645 ์‚ฌ์šฉํ•˜๋Š” pcg64 ์™€ ๋น„๊ตํ•˜๋ฉด์ด ์ƒ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์ŠคํŽ™ํŠธ๋Ÿผ ํ…Œ์ŠคํŠธ ์†์„ฑ ์ธก๋ฉด์—์„œ ์ƒ๋‹นํžˆ ์ข‹์ง€๋งŒ 128 ๋น„ํŠธ ร— 64 ๋น„ํŠธ๊ฐ€๋ณด๋‹ค ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๊ณฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. 128 ๋น„ํŠธ ร— 128 ๋น„ํŠธ. ์ €๋Š”์ด LCG ์ƒ์ˆ˜๋ฅผ ๋ช‡ ๋…„ ๋™์•ˆ ๋ฌธ์ œ์—†์ด ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ €๋ ดํ•œ ์Šน์ˆ˜ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ช…๋ น ์ˆ˜์ค€์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต ํ›„ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๋ฐ˜๋ณต ์ „ ์ƒํƒœ์—์„œ ์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŒ…

์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธ (PractRand ๋ฐ TestU01)ํ–ˆ์œผ๋ฉฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—๋Š”์ด ์Šค๋ ˆ๋“œ์— ์„ค๋ช… ๋œ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ฐฑ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์  ์ธ ์ŠคํŒ€์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ 2 ^ 64๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ธํ„ฐ๋ฆฌ๋น™ โ€” ๋ฌธ์ œ์—†์ด 4 ๊ฐœ์˜ ๊ฐฑ๊ณผ 8192 ๊ฐœ์˜ ๊ฐฑ์„ 8TB๊นŒ์ง€ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ฒœ๊ณผ ๊ทธ ๋ฐ˜๋Œ€ํŽธ ๋•…์œผ๋กœ).

์†๋„

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

์œ ํšจ์„ฑ

C ++ ํ—ค๋” ์‚ฌ์šฉ์ž๋Š”์ด ์ƒˆ ํŒจ๋ฐ€๋ฆฌ ๊ตฌ์„ฑ์› _now_์— pcg_engines::cm_setseq_dxsm_128_64 ๋กœ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์–ธ์  ๊ฐ€๋Š” pcg64 ์„ pcg_engines::setseq_xsl_rr_128_64 ์—์„œ์ด ์ƒˆ๋กœ์šด ์ฒด๊ณ„๋กœ ์ „ํ™˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์˜ ํ˜„์žฌ ๊ณ„ํš์€ ์ด๋ฒˆ ์—ฌ๋ฆ„์— PCG 2.0 ๋ฒ„์ „ ๋ฒ”ํ”„์˜ ์ผ๋ถ€๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณต์‹ ๋ฐœํ‘œ

์ „๋ฐ˜์ ์œผ๋กœ ์ €๋Š”์ด ์ƒˆ๋กœ์šด ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด ๋งค์šฐ ๋งŒ์กฑํ•˜๋ฉฐ ์—ฌ๋ฆ„ ํ›„๋ฐ˜์—์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜์žˆ๋Š” ๋” ์ž์„ธํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์„ ํƒ ...

๋ฌผ๋ก  ์ด๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋“  ์•ˆํ•˜๋“ ๊ฐ„์—, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์†๋„ ๋ฒค์น˜ ๋งˆํฌ์—์„œ ๋” ๋‚˜์€์ง€ ๋‚˜์œ์ง€ ์‹ค์ œ๋กœ ๋งค์šฐ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@imneme ๋น ๋ฅธ ์ „์ฒด 64 ๋น„ํŠธ ๋ฉ€ํ‹ฐ ํ”Œ๋ผ์ด์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? (x64์—์„œ๋Š” ์ดˆ๊ณ ์†์ด์ง€๋งŒ ์ผ๋ถ€ ์•ฝํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์•ฝ๊ฐ„ ๋Š๋ฆฝ๋‹ˆ๋‹ค.)

@lemire : 128 ๋น„ํŠธ ร— 64 ๋น„ํŠธ ๊ณฑํ•˜๊ธฐ, ๋‚ด๋ถ€์ ์œผ๋กœ x86์—์„œ ๋‘ ๊ฐœ์˜ ๊ณฑํ•˜๊ธฐ ๋ช…๋ น์–ด (ํ•˜์œ„ ๋น„ํŠธ์—์„œ๋Š” 64 ๋น„ํŠธ ร— 64 ๋น„ํŠธ โ†’ 128 ๋น„ํŠธ ๊ฒฐ๊ณผ, 64 ๋น„ํŠธ ร— 64)๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. -๋น„ํŠธ ์ƒ์œ„ ๋น„ํŠธ. ๋‘ ๊ณฑ์…ˆ์ด ๋ณ‘๋ ฌ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘ ๊ฒฐ๊ณผ๋ฅผ ๋”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

์—ฌ์ „ํžˆ 128 ๋น„ํŠธ ร— 128 ๋น„ํŠธ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋” ๋‚˜์€์ง€๋Š” ๊ทธ ์ˆœ๊ฐ„์— ๋ช…๋ น ์Šค์ผ€์ค„๋ง์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ์ง„ํ–‰๋˜๋Š”์ง€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

ARM์—์„œ๋Š” 64 ๋น„ํŠธ ร— 64 ๋น„ํŠธ โ†’ 128 ๋น„ํŠธ ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ๋กœ ๋‘ ๊ฐœ์˜ ๋ช…๋ น์–ด๋ผ๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.

(๋ฌผ๋ก  ๋‘ ๊ฐœ์˜ 64 ๋น„ํŠธ LCG๋ฅผ ํ•จ๊ป˜ ๋ฌถ์–ด ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ  ์ž˜ ์ž‘๋™ ํ•  ๋ชจ๋“  PRNG์˜ ๊ณต๊ฐ„์€ ์ƒ๋‹นํžˆ ํฝ๋‹ˆ๋‹ค.)

ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ๊ตฌํ˜„ ์€ ์ตœ์†Œํ•œ 64 ๋น„ํŠธ Linux์—์„œ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

Time to produce 1,000,000 64-bit unsigned integers
************************************************************
MT19937      5.42 ms
PCG64        2.59 ms
PCG64DXSM    2.41 ms
Philox       4.37 ms
SFC64        2.07 ms
numpy        5.41 ms
dtype: object

64-bit unsigned integers per second
************************************************************
MT19937      184.39 million
PCG64        386.01 million
PCG64DXSM    415.02 million
Philox       228.88 million
SFC64        483.94 million
numpy        184.79 million
dtype: object

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

@imneme ๋ผ๋Š” ์ง„์งœ ์งˆ๋ฌธ์€ 1.0 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” numpy.random.PCG64 ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์–ผ๋งˆ๋‚˜ ์งœ์ฆ๋‚˜๊ฒŒ ๋ ๊นŒ์š”? ์ถœ์‹œ๊ฐ€ ์ž„๋ฐ•ํ•˜๊ณ  ์ด๋ฏธ ์ง€์—ฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. 32 ๋น„ํŠธ ํ”Œ๋žซํผ์˜ ์„ฑ๋Šฅ์ด ํŠนํžˆ ์ข‹์œผ๋ฉด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ PCG64DXSM ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ช‡ ๋ฒˆ์˜ ๋ฆด๋ฆฌ์Šค์—์„œ ๊ธฐ๋ณธ๊ฐ’์„ ๋‹ค์‹œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค!

1.0 ๋ฒ„์ „์˜ PCG64 ๋ฐฐ์†ก์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

DXSM ๋ณ€ํ˜•์€์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๊ฒฐ๊ตญ ์กด์žฌํ•˜๋Š” ์ด์œ ), ๋ฐ˜๋ฉด์— ๋Šฆ์—ˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํŒŒํ‹ฐ. ํ•œ ๋‹ฌ๋„ ์•ˆ ๋œ PRNG๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฌด๋ชจํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (๋” ์˜ค๋žœ ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ PCG ๋ณ€ํ˜•๊ณผ ๋™์ผํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜์ง€๋งŒ).

(์ฆ‰, ๊ทธ๊ฒƒ์ด _my_ ์„ ํƒ ์ด์—ˆ๋‹ค๋ฉด, ๊ฐ€๋Šฅํ•œ ๋ฌด๋ชจํ•จ์˜ ๋น„๋‚œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์•„๋งˆ๋„ ์ƒˆ ์ œํ’ˆ์„ ๋ฐฐ์†ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Numpy์—์„œ ๊ทธ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ง€์—ฐ์€ ๋งค์šฐ ์ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„ํ—˜์€ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ BigCrush๋กœ ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜๊ณ  PractRand๋กœ 16TB (ํฌ๊ธฐ [์ŠคํŠธ๋ฆผ ์—†์Œ, 32 ๋น„ํŠธ ์ถœ๋ ฅ]์˜ 1/4 ์ธ cm_mcg_dxsm_64_32 ํฌํ•จ)๋กœ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ 1 ์ฃผ์ผ ์ด๋‚ด์— 32TB์— ๋„๋‹ฌ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. .)

[๊ณต์—ฐ์ด ์กฐ๊ธˆ ๋‚˜์•„์ง„ ๊ฒƒ์„ ๊ธฐ๋ป. 5 ๋…„ ์ „, ์‚ฌ์ „ ๋ฐ˜๋ณต ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ 128 ๋น„ํŠธ ์Šน์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 128 ๋น„ํŠธ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๋น„๊ด€์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋•Œ๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋ฒค์น˜ ๋งˆํฌ์™€ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ๋˜ ๊ธฐ๊ณ„์—์„œ์˜€์Šต๋‹ˆ๋‹ค.]

2.0 ๋ณ€ํ˜•์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ๋•Œ 1.0 ๋ณ€ํ˜•์— PCG64 ๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

@rkern ์ด๋ฆ„ ์ง€์ • ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ PCG64DXSM๊ณผ PCG64๋Š” ์ด๋“ค์„ ๋ฉ‹์ง€๊ฒŒ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

numpy์—๊ฒŒ๋Š” ํ™•์‹คํžˆ. @imneme ๊ฐ€ C ++ ๋ฒ„์ „์—์„œ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ 2.0 ๋ณ€ํ˜•์„ ํ™๋ณด ํ•  ๋•Œ 1.0 ๊ตฌํ˜„์˜ ์ด๋ฆ„์„ PCG64 ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฆ„์ด ๋Š์Šจํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด numpy์˜ PCG64 ํ…Œ์ŠคํŠธํ•˜๊ณ  2.0 ๋ฒ„์ „์— ๋Œ€ํ•ด pcg-random.org์—์„œ ์ œ๊ธฐ ํ•  ์ฃผ์žฅ๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. Bob Jenkin์˜ PRNG์— ๋Œ€ํ•œ ๋ชจ๋“  ๋Œ€ํ™”๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

PCG ๋…ผ๋ฌธ์˜ ์„น์…˜ 6.3์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ˆœ์—ด์— ๋”ฐ๋ผ ๋‹ˆ๋ชจ๋‹‰ ์ด๋ฆ„์ด ํ‘œ์‹œ๋˜์ง€๋งŒ PCG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋Š” ์ด๋Ÿฌํ•œ ๋‹ˆ๋ชจ๋‹‰์œผ๋กœ ํŒจ๋ฐ€๋ฆฌ ๊ตฌ์„ฑ์›์„ ๊ฑฐ์˜ ์„ ํƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ ๊ตฌํ˜„์ด ์•„๋‹Œ ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช…๋ช… ๋œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ๊ณ ์œ  ์ŠคํŠธ๋ฆผ์ด์žˆ๋Š” ๋ฒ”์šฉ 32 ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ์˜ ๊ฒฝ์šฐ pcg32_unique). ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋” ๋‚˜์€ ์„ฑ๊ณผ๋ฅผ๋‚ด๋Š” ๋ฏธ๋ž˜์˜ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์ด ๋ฐœ๊ฒฌ๋˜๊ณ  ์ถ”๊ฐ€ ๋  ๋•Œ (๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฐœ๊ฒฌ์œผ๋กœ ์ธํ•ด) ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  C ๋ฐ C ++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋„์„œ๊ด€์€

  • ์ˆœ์—ด์˜ ์ด๋ฆ„, ์ž‘๋™ํ•˜๋Š” ๋น„ํŠธ ํฌ๊ธฐ ๋ฐ ๊ธฐ๋ณธ LCG์˜ ํŠน์„ฑ์„ ํ†ตํ•ด ํŠน์ • ์ œํ’ˆ๊ตฐ ๊ตฌ์„ฑ์›์„ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ์ €์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค
  • ๋ฏธ๋ฆฌ ์„ ํƒ๋œ ํ•˜์œ„ ์ˆ˜์ค€ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์— ์—ฐ๊ฒฐํ•˜๋Š” pcg64 ์™€ ๊ฐ™์€ ํŽธ๋ฆฌํ•œ ๋ณ„์นญ์„ ์ œ๊ณตํ•˜๋Š” ์ƒ์œ„ ์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์„ ๊ฐ€๋ฆฌ ํ‚ค๋„๋ก ๋ณ„์นญ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์žฌํ˜„ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ ํ•˜์œ„ ์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „์— ํŽธ๋ฆฌํ•œ ์ตœ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋„๋‹ฌ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ค€ ๋ณ„์นญ.

PCG64 ๋ผ๋Š” PRNG๋ฅผ ๋ฐฐ์†กํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฌธ์„œ์—์„œ ํŠน์ • PCG ๋ณ€ํ˜•์ด ๋ฌด์—‡์ธ์ง€, ์ฆ‰ ์–ด๋–ค ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์ด ๋‚ฎ์€ ์ง€์— ํ•ด๋‹นํ•˜๋Š”์ง€ ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -๋ ˆ๋ฒจ C ๋˜๋Š” C ++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค.

๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ๋Š” https://github.com/numpy/numpy/pull/13840 ์—์„œ np.random.default_gen() ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค . (ํ–ฅํ›„ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด @rkern , PR์„ ๋ช…์‹œ ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์‚ฌ์†Œํ•œ nit : ๋Œ€์‹  np.random.default_generator() ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? gen ์ด ๋„ˆ๋ฌด ์งง๊ฑฐ๋‚˜ ๋ถ„๋ช…ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹ ์ด np.random.default_generator ()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ €๋„ ๊ฐ™์€ ์ƒ๊ฐ์„ํ–ˆ๋Š”๋ฐ, np.random.default_generator() ๊ฐ€ ๊ธด ์ชฝ์˜ ๋จธ๋ฆฌ์นด๋ฝ์ด๋ผ์„œ default_rng ์—ฐ์ฃผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ I๋ฅผ ๐Ÿ‘ default_rng ๋ณด๋‹ค ๋‚˜์€ default_gen ๋„. ๋‚˜๋Š” ์—ฌ์ „ํžˆ default_generator ์ชฝ์œผ๋กœ ๊ธฐ์šธ ๊ฒ ์ง€๋งŒ ์ด๋“ค ์ค‘ ํ•˜๋‚˜์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

: +1 : default_rng() .

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰