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๋ฅผ์ํ ๋ ๋ค๋ฅธ ํ๋์ ์ธ ์ ํ์ ๋๋ค. ๋ช ๊ฐ์ง ์๋ ค์ง ํต๊ณ์ ๋จ์ ์ด ์์ง๋ง ๋๋ถ๋ถ์ ์ฉ๋์์ ์ฃผ์ ์์ธ์ด๋์ง๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ด ํ ์ ๋๋ฌธ์ ๋ถ๋๋ฌ์ํ์ง๋ง ๋ด๊ฐ ์์ฑํ ์ฝ๋์ ๋ํ ๊ฐ์ธ์ ์ ํ์ ๋๋ค.
์ธํ 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 ์์ ๋ถ์ธ ํ ๊ฒ์ ๋๋ค. ๋ฐฐํฌํ์ ๋ฒ์ ๊ด๋ฆฌ์ ๋ํ ์ฃผ์ฅ์ ์ฌ๊ธฐ์๋ ์ ์ฉ๋ฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ :
dSFMT
์ ๋จ์ํ MT19937
๋ณด๋ค ๋น ๋ฅธ ๋ฒ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค (๋ฌธ์์ "SSE2"๋ฅผ ์ผ๋ง๋ ๋นจ๋ฆฌ ์ ๊ฑฐํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์๊น์?). ์ด์จ๋ ๋นํธ ์คํธ๋ฆผ ์ฌํ์ฑ์ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ์ํ ์ฐจ์ด๋ ๊ทธ๋ค์ง ํฅ๋ฏธ๋กญ์ง ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ ์ฐ์น ํ ์ฃผ์ฅ์ด "๊ธฐ์ฌ ๊ฒํ ์ค์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ"๋ผ๊ณ ํ๋๋ผ๋ dSFTM
๋ณด๋ค MT19937
์ ํธํด์ผํฉ๋๋ค. .์ฃ์กํ์ง๋ง 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
์ด์ ๊ฐ์ ํจํด์ด ๋จ์์ฑ๊ณผ ๋ฏธ๋ ๋ณด์ฅ์ฑ์ ๋ชจ๋ ์ ๊ณตํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
class Generator:
def __init__(bitgen_or_seed=None, *, bit_generator='pcg64', inc=0):
```ํ์ด์ฌ
ํด๋์ค ์์ฑ๊ธฐ :
def __init __ (bitgen_or_seed = None, *, bit_generator = None, inc = None) :
bit_generator๊ฐ None์ด ์๋๊ฑฐ๋ inc๊ฐ None์ด ์๋ ๊ฒฝ์ฐ :
warn ( '๊ธฐ๋ณธ๊ฐ์ PCG64์์ AESCtr๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. inc ํค์๋'
'์ธ์๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ํฅํ ๋ฐ์ํ ์์ ์
๋๋ค', FutureWarning)
````
```ํ์ด์ฌ
ํด๋์ค ์์ฑ๊ธฐ :
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 ๋ก์ ๋ณํ์ด ๋ชจ๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ค์์ ์์ด์ด ์ผ๋ง๋ ๋์์ด๋๋์ง ๋ณด์ฌ์ฃผ๋ ๋ํ์ ๋๋ค.
๊ทธ๊ฒ์ ํ๋์ ๊ทธ๋ฌํ ์คํธ๋ฆผ์์ 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
๋ค์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์์๋ ๋ฐ์ดํฐ ํฌ์ธํธ :
๋ด๊ฐ ๋ฌด์์ ๋ค๋ฅด๊ฒํ๊ณ ์๋์ง ์์๋ผ ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
(์๊ด ๊ด๊ณ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์๊ฐ์ ๋ฐ๋ฐํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ํ๋ฉด ์๊ด ๊ด๊ณ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์๊ฐ์ ๋ฐ๋ฐํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฃผ์ ์ ๋ํด ๋ณ๋์ ์ฝ๋ฉํธ๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ฝ๋ฉํธ๋ฅผ ์จ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌํ ํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ด ํ์ ๋๊ตฌ.)
@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์ ๊ฒฝ์ฐ ์๋ฆผ ๋ง ์์ต๋๋ค.
์ด๊ฒ์ ์๊ด ๊ด๊ณ๊ฐ์๋ ์ํ์ ๋ณ๋ฆฌํ ์ LCG๋ฅผ์ํ ๊ฒ์ ๋๋ค. ๋์ ๋ฌด์์๋ก ์ ํ๋ ์ถ๊ฐ ์์ (ํ์ง๋ง ์์ ๊ฐ์ ๋์ผ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ LCG๋ฅผ ์ ํํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
PCG์ ์ถ๋ ฅ ํจ์๋ก ์ด๋ํ๋ฉด ๋ณ๋ฆฌํ์ ์ธ ๊ฒฝ์ฐ์ XSH RR์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค. ์์ ๊ทธ๋ํ์์ ํฌ๊ฒ ๊ฐ์ ๋์์ง๋ง ๋ถ๋ช ํ ๋์ฐํจ์ ์์ ํ ๋ชจํธํ๊ฒํ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋์ผํ ๊ธฐ๋ณธ (๋์ ์๊ด ๊ด๊ณ) LCG ์์ ๊ฐ์ง RXS M์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ด๊ฐ 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 ๊ฐ์กฑ ๊ตฌ์ฑ์์ ์ค๊ณํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ด์ ๊ฐ์ด :
pcg64
๋ณด๋ค ๋น ๋ฅด๊ฑฐ๋ ๋น ๋ฆ
๋๋ค.ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ต์์ ํ์ง์ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ๋ ์ ์ถฉ์์ด ์์ต๋๋ค. ์๋์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์์๋ค๋ฉด ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋ ๋ง์ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ฌ ๋ ์ฌํ๊ฒ ์คํฌ๋จ๋ธ ๋ ์ถ๋ ฅ์ ์์ฑ ํ ์ ์์์ง๋ง 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 ++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋์๊ด์
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()
.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์ค๋ ๋์์ ๋ง์ ์๊ฐ์ ๋ฐ์๋ณด๊ณ ํ ๋ด์ค๊ฐ ์์ต๋๋ค.
๋ฐฐ๊ฒฝ
์ฌ๋ฌ ์ฒ๋์์
pcg64
์ ๊ฝค ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํต๊ณ์ ํ์ง์ ์ผ๋ฐ์ ์ธ ์ธก์ ํ์์ ๊นจ๋ํ ๊ฑด๊ฐ ์ง๋จ์๋ฅผ ์ป์ต๋๋ค. ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ํ ์คํธ๋์์ต๋๋ค. ๊ฐ์ฅ ์ต๊ทผ์๋ PractRand๋ฅผ ์ฌ์ฉํ์ฌ 0.5 ํํ ๋ฐ์ดํธ๊น์ง ์คํํ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์์ ์ ์๋ํฉ๋๋ค.๊ทธ๋ฌ๋์ด ์ค์์ ๋์จ ๋ณ๋ฆฌํ์ ์ ์ ์ ์ด์ธ๋ฆฌ์ง ์์์ต๋๋ค. ๋ฌผ๋ก , " ๊ธ์์, ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ๋ง์ธ์ "๋ผ๊ณ ๋งํ ์ ์์ง๋ง ๋ฒ์ฉ PRNG์ ์์ ์ ๊ฒฌ๊ณ ํด์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ ์ํ๊ณ ์ถ์์ด์ ...
๊ทธ๋์ ์ฝ 25 ์ผ ์ ์ ์ ๋ PCG ์ ํ๊ตฐ์ ์๋ก์ด ๊ตฌ์ฑ์์ ๋์์ธํ๋ ๊ฒ์ ๋ํด ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค.
๊ณจ
๋ด ๋ชฉํ๋ ํ์ฌ
pcg64
๋ณํ์ ๋์ฒด ํ ์์๋ ์๋ก์ด PCG ๊ฐ์กฑ ๊ตฌ์ฑ์์ ์ค๊ณํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ด์ ๊ฐ์ด :pcg64
๋ณด๋ค ๋น ๋ฅด๊ฑฐ๋ ๋น ๋ฆ ๋๋ค.ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ต์์ ํ์ง์ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ๋ ์ ์ถฉ์์ด ์์ต๋๋ค. ์๋์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์์๋ค๋ฉด ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋ ๋ง์ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ฌ ๋ ์ฌํ๊ฒ ์คํฌ๋จ๋ธ ๋ ์ถ๋ ฅ์ ์์ฑ ํ ์ ์์์ง๋ง PCG์ ์์ ์ ๊ธฐ๋ณธ LCG๊ฐ "๊ฑฐ์ ์ถฉ๋ถ"ํ๊ธฐ ๋๋ฌธ์ ํ์ํ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค. ์นด์ดํฐ๊ฐ 1 ์ฉ ์ฆ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผํฉ๋๋ค.
์คํฌ์ผ๋ฌ
์ฑ๊ณต์๋ณด๊ณ ํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค! ์ฝ 25 ์ผ ์ ์ ์ฒ์ ์๊ฐํ์ ๋ ์ค์ ๋ก ํด๊ฐ ์ค์ด์์ต๋๋ค. 10 ์ผ ์ ์ฏค ๋์ ์์ ๋ ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ ์์ด๋์ด๋ฅผ ์๋ํด ๋ณด์๊ณ ์ ์๋ํ๋ค๋ ์ฌ์ค์ ์๊ฒ๋์ด ๊ธฐ๋ปค์ต๋๋ค. ์ดํ ์๊ฐ์ ๋๋ถ๋ถ ๋ค์ํ ์ข ๋ฅ์ ํ ์คํธ์ ์ฌ์ฉ๋์์ต๋๋ค. ์ด์ ๋ C ++ ๋ฒ์ ์ PCG์ ์ฝ๋๋ฅผ ๋ฃ์ ๋งํผ ๋ง์กฑ ์ค๋ฌ์ ์ต๋๋ค. ์์ ํฌ๊ธฐ์ ํ ์คํธ๋ XSL RR๋ณด๋ค ํจ์ฌ ๋ซ๊ณ RXS M๊ณผ ๊ฒฝ์ํ์ง๋ง ์ค์ ๋ก๋ ๋ ํฐ ํฌ๊ธฐ์์ ๋น๋ฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋ชฉํ๋ ์ถฉ์กฑํฉ๋๋ค.
์ธ๋ถ
FWIW์์ ์๋ก์ด ์ถ๋ ฅ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค (64 ๋นํธ ์ถ๋ ฅ์ ๊ฒฝ์ฐ).
์ด ์ถ๋ ฅ ํจ์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ 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 ๋ฒ์ ๋ฒํ์ ์ผ๋ถ๋ก ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๋๋ค.๊ณต์ ๋ฐํ
์ ๋ฐ์ ์ผ๋ก ์ ๋์ด ์๋ก์ด ๊ฐ์กฑ ๊ตฌ์ฑ์์ ๋ํด ๋งค์ฐ ๋ง์กฑํ๋ฉฐ ์ฌ๋ฆ ํ๋ฐ์์ด ์ค๋ ๋๋ฅผ ์ฐธ์กฐ ํ ์์๋ ๋ ์์ธํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด์์ ๊ฒ์ ๋๋ค.
๊ทํ์ ์ ํ ...
๋ฌผ๋ก ์ด๊ฒ์ผ๋ก ๋ฌด์์ํด์ผํ๋์ง ์์ ๋ด์ผํฉ๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ํ๋ ๊ฐ์, ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ ์๋ ๋ฒค์น ๋งํฌ์์ ๋ ๋์์ง ๋์์ง ์ค์ ๋ก ๋งค์ฐ ๊ถ๊ธํฉ๋๋ค.