Numpy์์ ์ฌ์ฉํ๋ PCG ์์ฑ๊ธฐ๋ ์๋นํ ์์ ์๊ธฐ ์๊ด ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฆ, ์๋์์ ์์ฑ ๋ ๊ฐ ์ํ์ค์ ๋ํด ๋ค๋ฅธ ์๋์์ ์์ํ๋ ๋ง์ ์์ ์ํธ ๊ด๋ จ๋๊ณ ๊ฒน์น์ง ์๋ ์ํ์ค๊ฐ โโ์์ต๋๋ค. "์๊ด"์ด๋ ๋ ๊ฐ์ ์ด๋ฌํ ์ํ์ค๋ฅผ ์ธํฐ๋ฆฌ๋นํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ ์คํธํ์ฌ ๊ฐ ์ํ์ค์ ๊ฐ๋ณ์ ์ผ๋ก ๋ํ๋์ง ์๋ ์ค๋ฅ๋ฅผ ์ป๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ํ ํฐ๋ฏธ๋ ์ธํธ ์ค ๋ ๊ฐ์ ์์ฑ๊ธฐ๊ฐ ์ด๋ฌํ ์ํ์ค ์ค ๋ ๊ฐ๋ฅผ ์ป์ ํ๋ฅ ์ ๋ฌด์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ํ์ ๊ด์ ์์ ๋ฐ์ํ๋ ์ด์ ๋ ์ ์๋ ค์ ธ ์์ง๋ง ์ฌ๊ธฐ์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค. http://prng.di.unimi.it/pcg.pgp ( "๋์ผํ ์์ฑ๊ธฐ ๋ด์
์ด ๋ฌธ์ ๋ฅผ ์ง์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด Numpy ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฐ๋จํ C ํ๋ก๊ทธ๋จ์ ์์ฑํ์ต๋๋ค : http://prng.di.unimi.it/intpcgnumpy.c . ํ๋ก๊ทธ๋จ์ ๋์ ๋นํธ์ ๋ฎ์ ๋นํธ์ ํํ๋ก ๋ ์์ฑ๊ธฐ (๋์ผํ LCG ์์ ๋๋ "์คํธ๋ฆผ")์ ๋ 128 ๋นํธ ์ํ๋ฅผ ์ทจํ๊ณ ์ถ๋ ฅ์ ์ธํฐ๋ฆฌ๋นํ๊ณ ์ด์ง ํ์์ผ๋ก ์๋๋ค. PractRand๋ฅผ ํตํด ์ ์กํ๋ฉด ๋ ์คํธ๋ฆผ์ด ๋ ๋ฆฝ์ ์ด์ด์ผํ๋ฏ๋ก ํต๊ณ์ ์คํจ๊ฐ ์์ด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ 64 ๊ฐ์ ํ์ ๋นํธ๋ฅผ ๊ฐ์ง ๋ ์ํ์์ ์์ํ๋ ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
./intpcgnumpy 0x596d84dfefec2fc7 0x6b79f81ab9f3e37b 0x8d7deae980a64ab0 0x6b79f81ab9f3e37b | stdbuf -oL ~ / svn / c / xorshift / practrand / RNG_test stdin -tf 2 -te 1 -tlmaxonly-๋ฉํฐ ์ค๋ ๋
PractRand ๋ฒ์ 0.94๋ฅผ ์ฌ์ฉํ๋ RNG_test
RNG = RNG_stdin, ์๋ = ์ ์ ์์
ํ
์คํธ ์ธํธ = ํ์ฅ, ์ ๊ธฐ = ์ถ๊ฐ
rng=RNG_stdin, seed=unknown
length= 128 megabytes (2^27 bytes), time= 2.2 seconds
Test Name Raw Processed Evaluation
BCFN(0+0,13-2,T) R= +27.6 p = 1.0e-13 FAIL
BCFN(0+1,13-2,T) R= +68.0 p = 2.3e-34 FAIL !!!
BCFN(0+2,13-3,T) R= +90.8 p = 8.8e-43 FAIL !!!
BCFN(0+3,13-3,T) R=+120.6 p = 6.9e-57 FAIL !!!!
DC6-6x2Bytes-1 R= +8.9 p = 4.0e-5 mildly suspicious
DC6-5x4Bytes-1 R= +15.7 p = 4.3e-9 very suspicious
[Low1/8]BCFN(0+0,13-4,T) R= +11.6 p = 4.9e-5 unusual
...and 1074 test result(s) without anomalies
๋ ๋ฎ์์ง ์๋ ์์ต๋๋ค. ๋์ผํ 58 ๊ฐ์ ํ์ ๋นํธ ๋ง ์์ผ๋ฉด๋ฉ๋๋ค.
./intpcgnumpy 0x596d84dfefec2fc7 0x0579f81ab9f3e37b 0x8d7deae980a64ab0 0x6b79f81ab9f3e37b | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
[...]
rng=RNG_stdin, seed=unknown
length= 32 gigabytes (2^35 bytes), time= 453 seconds
Test Name Raw Processed Evaluation
[Low1/16]FPF-14+6/32:cross R= +11.6 p = 4.0e-10 VERY SUSPICIOUS
[Low1/32]FPF-14+6/32:cross R= +16.5 p = 3.2e-14 FAIL
[Low1/32]FPF-14+6/16:cross R= +12.8 p = 3.8e-11 VERY SUSPICIOUS
[Low1/64]FPF-14+6/64:cross R= +6.8 p = 4.8e-6 mildly suspicious
[Low1/64]FPF-14+6/32:cross R= +6.0 p = 1.9e-5 unusual
[Low1/64]FPF-14+6/16:cross R= +5.5 p = 5.8e-5 unusual
[Low4/32]FPF-14+6/64:all R= +5.8 p = 5.9e-5 unusual
[Low4/32]FPF-14+6/32:(0,14-0) R= +7.7 p = 1.0e-6 unusual
[Low4/32]FPF-14+6/32:(1,14-0) R= +7.7 p = 9.1e-7 unusual
[Low4/32]FPF-14+6/32:all R= +6.5 p = 1.3e-5 unusual
[Low4/64]FPF-14+6/64:all R= +5.9 p = 5.1e-5 unusual
[Low4/64]FPF-14+6/64:cross R= +8.2 p = 3.0e-7 suspicious
[Low4/64]FPF-14+6/32:(0,14-0) R= +7.6 p = 1.0e-6 unusual
[Low8/64]FPF-14+6/64:(0,14-0) R= +17.0 p = 2.2e-15 FAIL
[Low8/64]FPF-14+6/64:(1,14-0) R= +9.1 p = 5.1e-8 mildly suspicious
[Low8/64]FPF-14+6/64:all R= +12.7 p = 2.1e-11 VERY SUSPICIOUS
[Low8/64]FPF-14+6/32:(0,14-0) R= +12.8 p = 1.7e-11 VERY SUSPICIOUS
[Low8/64]FPF-14+6/32:all R= +11.0 p = 9.3e-10 VERY SUSPICIOUS
...and 1696 test result(s) without anomalies
๋ ๊ฐ์ ์์ฑ๊ธฐ๊ฐ ๋ ๊ฐ์ ์๊ด ๋ ์๋ (๋ฌด์์๋ก ์ ํ๋จ)์์ ์์๋ ํ๋ฅ ์ 50 % ๋ ์ป์ผ๋ ค๋ฉด ๋ฌด์์๋ก ์์ํ๋ ์ฝ 50 ๋ง ๊ฐ์ ์์ฑ๊ธฐ๊ฐ ํ์ํฉ๋๋ค (์์ผ ํจ๋ฌ๋ ์ค). ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ์ ํํ ๊ฐ์ ์ํ์์ ์์ํ์ง๋ ์์ง๋ง ์๋นํ ์ค์ฒฉ ์๊ด ์ํ์ค๊ฐ์์ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ๋ค๋ฉด ํจ์ฌ ์ ์ ์์ด ํ์ํฉ๋๋ค.
๋ฌธํ์ ํ๋ช ํ ์์ฑ๊ธฐ๋ ๊ทธ๋ ๊ฒ ์๋
์์ฑ๊ธฐ๊ฐ ์ฌ๋ฌ ํฐ๋ฏธ๋ ๋๋ ๊ณ ๋์ ๋ณ๋ ฌ ํ๊ฒฝ์์ ์ฌ์ฉ๋์ด์๋ ์๋๋ค๋ ๊ฒ์ ์ ์ด๋ ์ด๋๊ฐ์ ๋ฌธ์ํํ์ญ์์ค.
๊ฐ์ฐ ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ LCG์ ์ํด ์์ฑ ๋ ์ํ์ค๋ ๋ถํธ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ฐ ์์ ๋ชจ๋๋ก ๋ชจ๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ "์คํธ๋ฆผ"์์๋ ๋์ผํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ช ๊ฐ์ง ํ ๋ก ์ ๋ณผ ์ ์์ต๋๋ค : https://github.com/rust-random/rand/issues/907 ๋ฐ ๋ฌธ์ ์ ๋ํ ์ ์ฒด ์ํ์ ํ ๋ก : https://arxiv.org/abs/2001.05304 .
@imneme, @bashtage, @rkern ์ฌ๊ธฐ ๋น๊ตญ ๋ ๊ฒ์ด๋ค, ๊ทธ๋ฌ๋ ๋๋ ์ฐ๋ฆฌ๊ฐ์ด ์ด์ ๊ฐ ์๊ฐํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ ํธํ๋ ์ด์ ๋ SeedSequence.spawn
์ค๋ฒ ์ธํฐํ์ด์ค jumped
๋ฅผ. ์๋ฅผ ๋ค์ด API์ ๋ํด ๋
ผ์ ํ https://numpy.org/devdocs/reference/random/parallel.html ์ฌ๊ธฐ์์ ์กฐ์ธ์ ํ์ธํ๊ณ ํ์์ ๋ฐ๋ผ ๊ฐ์ ์ฌํญ์ ์ ์ํ์ญ์์ค.
@mattip ์ด๊ฒ์ ์ ํ์ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ฐ์ ๋ ๋ฌธ์ํ๋ ํญ์ ์ข์ ์๊ฐ์ด์ง๋ง ์ค์ ๋ก๋ ์ ์ฒด์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ๊ฐ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค.
AES-NI๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์๊ฒ๋ AESCounter
์, ๊ณ ๋์ ๋ณ๋ ฌ ์ค์ ์ด์๋ ์ฌ๋์๊ฒ๋ SPECK128
๋ฅผ ๊ถ์ฅํฉ๋๋ค.
๊ฐ์ฐ ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ LCG์ ์ํด ์์ฑ ๋ ์ํ์ค๋ ๋ถํธ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ฐ ์์ ๋ชจ๋๋ก ๋ชจ๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ "์คํธ๋ฆผ"์์๋ ๋์ผํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ ๋ํ ํ ์ ์์ต๋๊น? ๋์ผํ ์ฆ๋ถ์ ์ฌ์ฉํ์ฌ ์คํจ๋ฅผ ๋ณต์ ํ ์ ์์ง๋ง ์ฆ๋ถ๊ณผ ์ํ๋ฅผ ์๋ํ๊ณ ๋ ๊ฐ์ ๋ค๋ฅธ ์์ ์ฆ๋ถ์ผ๋ก ์คํจ๋ฅผ ์์ง ๊ด์ฐฐํ์ง ์์์ต๋๋ค. ์ฆ๋ถ๋ ์ ์คํ๊ฒ ๊ตฌ์ฑํด์ผํ๋ ๊ฒฝ์ฐ ์ค์ ์์ผ ์ถฉ๋ ๋น๋์ ์ํฅ์์ค๋๋ค.
https://gist.github.com/rkern/f46552e030e59b5f1ebbd3b3ec045759
โฏ ./pcg64_correlations.py --same-increment | stdbuf -oL ./RNG_test stdin64 -tf 2 -te 1 -tlmaxonly -multithreaded
0x56b35656ede2b560587e4251568a8fed
0x93526034ed105e9e587e4251568a8fed
[
{
"bit_generator": "PCG64",
"state": {
"state": 115244779949650410574112983538102603757,
"inc": 137507567477557873606783385380908979143
},
"has_uint32": 0,
"uinteger": 0
},
{
"bit_generator": "PCG64",
"state": {
"state": 195824235027336627448689568147458133997,
"inc": 137507567477557873606783385380908979143
},
"has_uint32": 0,
"uinteger": 0
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin64, seed = 0x4bf19f7b
test set = expanded, folding = extra
rng=RNG_stdin64, seed=0x4bf19f7b
length= 128 megabytes (2^27 bytes), time= 3.0 seconds
Test Name Raw Processed Evaluation
BCFN_FF(2+0,13-3,T) R= +59.9 p = 3.8e-28 FAIL !!!
BCFN_FF(2+1):freq R= +89.0 p~= 6e-18 FAIL !
BCFN_FF(2+2):freq R= +39.6 p~= 6e-18 FAIL !
BCFN_FF(2+3):freq R= +14.6 p~= 6e-18 FAIL !
BCFN_FF(2+4):freq R= +10.3 p~= 5e-11 very suspicious
DC6-9x1Bytes-1 R= +7.1 p = 5.6e-4 unusual
DC6-6x2Bytes-1 R= +18.9 p = 1.0e-10 VERY SUSPICIOUS
DC6-5x4Bytes-1 R= +11.2 p = 1.4e-6 suspicious
[Low4/16]BCFN_FF(2+0):freq R= +19.5 p~= 6e-18 FAIL !
[Low4/16]FPF-14+6/16:all R= +5.6 p = 1.0e-4 unusual
[Low4/16]FPF-14+6/4:all R= +5.9 p = 4.6e-5 unusual
[Low4/32]BCFN_FF(2+0):freq R= +6.5 p~= 2e-5 unusual
[Low8/32]BCFN_FF(2+0):freq R= +15.1 p~= 6e-18 FAIL !
[Low8/32]FPF-14+6/32:all R= +8.4 p = 2.5e-7 very suspicious
[Low8/32]FPF-14+6/32:all2 R= +9.0 p = 7.8e-5 unusual
[Low8/32]FPF-14+6/16:(0,14-0) R= +12.4 p = 4.5e-11 VERY SUSPICIOUS
[Low8/32]FPF-14+6/16:all R= +15.5 p = 5.2e-14 FAIL
[Low8/32]FPF-14+6/16:all2 R= +41.4 p = 2.6e-16 FAIL !
[Low8/32]FPF-14+6/4:(0,14-0) R= +6.9 p = 5.9e-6 unusual
[Low8/32]FPF-14+6/4:all R= +7.9 p = 6.6e-7 suspicious
...and 871 test result(s) without anomalies
์๊ฒ ์ต๋๋ค. ๋ค์ ์๋ํ๊ฒ ์ต๋๋ค.
2์ ๊ฑฐ๋ญ ์ ๊ณฑ ๋ชจ๋๋ฌ์ค๋ฅผ ๊ฐ์ง LCG์๋ ๋ค์ค ์คํธ๋ฆผ์ด ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด๊ธฐ์ ๊ทธ๊ฒ์ ๋ฏฟ์๊ณ ๊ทธ "ํ๋ฆ"์ผ๋ก ํฅ๋ฏธ๋ก์ด ์ผ์ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ธด ์ค๋๋ ๋ ผ๋ฌธ๋ ์์ง๋ง, ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ป์ ๊ถค๋๋ _ ๋ชจ๋ ๋์ผํ ๋ชจ๋๋ก ์ฒจ๊ฐ์ ๋ผ๋ ๊ฒ์ด ์์ญ ๋ ๋์ ์๋ ค์ ธ ์์ต๋๋ค. ์์ ๋ฐ ์๋ง๋ ๋ถํธ change_. ๋ด๊ฐ ์ถ์ ํ ์์๋ ๊ฐ์ฅ ๋จผ ๊ฒ์
Mark J. Durst, ๋ณ๋ ฌ ๋์ ์์ฑ์ ์ํด ์ ํ ํฉ๋ ์์ฑ๊ธฐ ์ฌ์ฉ,
1989 Winter Simulation Conference Proceedings, IEEE Press, 1989, pp. 462โ466.
๊ทธ๋์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ http://prng.di.unimi.it/corrpcgnumpy.c๋ฅผ ์์ฑ ํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ด๊ฒ์ _ ์ ํํ๊ฒ _ ์ฒซ ๋ฒ์งธ ํ๋ก๊ทธ๋จ์ ์ค์ ์ด์ง๋ง, ์์๋ฅผ ์ ํํ ์๋ ์์ต๋๋ค.
./corrpcgnumpy 0x596d84dfefec2fc7 0x6b79f81ab9f3e37b 0xac9c8abfcb89f65f 0xe42e8dff1c46de8b 0x8d7deae9efec2fc7 0x6b79f81ab9f3e37b 0x06e13e5e8c92c843 0xf92e8346feee7a21 56 | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
rng=RNG_stdin, seed=unknown
length= 4 gigabytes (2^32 bytes), time= 113 seconds
Test Name Raw Processed Evaluation
[Low1/8]BCFN(0+0,13-1,T) R= +27.2 p = 4.0e-14 FAIL
[Low1/8]DC6-6x2Bytes-1 R= +10.9 p = 4.4e-6 suspicious
[Low1/64]DC6-5x4Bytes-1 R= -6.4 p =1-1.4e-4 unusual
[Low8/64]FPF-14+6/64:(0,14-0) R= +8.4 p = 2.2e-7 mildly suspicious
[Low8/64]FPF-14+6/64:all R= +8.7 p = 1.2e-7 suspicious
[Low8/64]FPF-14+6/32:(0,14-0) R= +10.2 p = 5.1e-9 suspicious
[Low8/64]FPF-14+6/32:all R= +9.4 p = 2.7e-8 very suspicious
[Low8/64]FPF-14+6/16:all R= +5.8 p = 6.4e-5 unusual
...and 1439 test result(s) without anomalies
๋ฐ๋ผ์ _ ์ต์ _ 2 ^ 72 ๊ฐ์ ์๊ด ๋ ํ์ ์ํ์ค๊ฐ โโ์์ต๋๋ค. "์คํธ๋ฆผ ์์"๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์๊ด์์ด ๋์ผํ ์์์ ๊ฒฝ์ฐ์ ๋๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ ๋๋ ์ดํฐ์ ์์ฒญ๋๊ฒ ๋์จํด์ก์ต๋๋ค. ์ ํํ ์์์ ๋์ ์ ๋น์ ์ด ์กฐ๊ธ ์ ํ์ ์ํ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ณ์ฐํ๋๋ผ๋ ์๊ด ๊ด๊ณ๋ ์ด์จ๋ ๋ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด ์ถ๊ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค.
๋ค์ ํ ๋ฒ ๋ฐ๋ณตํฉ๋๋ค. ๊ณผํ ๋ฌธํ์ ๋์จ ๊ธฐ์กด์ ํ๋ ๋ฐ์ ๊ธฐ์๋ ์ด๋ฌํ ์๋ชป๋ ๋์์ด ์์ต๋๋ค (๋ฌผ๋ก 2์ ๊ฑฐ๋ญ ์ ๊ณฑ LCG์๋์ด ๋์์ด ์์ง๋ง, ์ ๋ฐ ํ๋์ ๋ฐ์ ๊ธฐ๋ _ ์๋๋๋ค).
PCG์ ๋ํ Sabastiano์ ๋นํ์ 2018 ๋ ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์์ ๋ค๋ฃน๋๋ค.
์งง์ ๋ฒ์ ์ ํน์ ์๋๋ฅผ ๊ตฌ์ฑ ํ ์์๋ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ชจ๋ PRNG์์ "๋์ ๋ชจ์"๋์์ ๋ณด์ฌ์ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. PCG๊ฐ ์ด๋ป๊ฒ ๋ ๋ ํนํ๋ค๋ ๊ทธ์ ์ฃผ์ฅ์๋ ๋ถ๊ตฌํ๊ณ , ์ค์ ๋ก PCG๋ ๊ฝค ์ ํต์ ์ ๋๋ค. PCG์ ์คํธ๋ฆผ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ PRNG ์ธ SplitMix๋ณด๋ค ๋์์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ์์ ํ ๊ฑฐ์ง์ ๋๋ค. ๋ด๊ฐ ํ๋ ธ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด MRG32k3a ๋๋ xoshiro256 ++์์ ๋ ๊ฐ์ ์๊ด ๊ด๊ณ๊ฐ์๋ ์ค์ฒฉ ์ํ์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋๋ ๊ฒน์น์ง ์๋๋ค๊ณ ๋งํ ์ ์ด ์๋ค. xoshiro256 ++์ ๋ํด ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ํ ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ์ธ์. ๋ ์จ์์ด ๊ฒน์น์ง ์๋๋กํฉ๋๋ค.
๋์กฐ์ ์ผ๋ก, ๋๋ ๋น์ ์ด ๋ณด์ฌ์ค "์๊ด ๊ด๊ณ"๊ฐ ๋ณธ์ง์ ์ผ๋ก ๊ฒน์นจ์ ํ ํํ์์ ๋ณด์ฌ์ฃผ๋ PCG์ ๋ํ ํ ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
"๋ณธ์ง์ ์ผ๋ก"๋ฐ "์์"์ฒ๋ผ FUD์ ์ธ์ธ ์๋ ์์ง๋ง ์ฒ์์๋ ๊ฐ PRNG๋ฅผ 100 ์ต ๋ฒ ๋ฐ๋ณตํ๊ณ ์ค๋ฅ์ ํจ๊ป ์ข ๋ฃ๋๋๋ก http://prng.di.unimi.it/intpcgnumpy.c๋ฅผ ์์ ํ์ต๋๋ค. ์์ฑ ๋ ์ํ์ค๊ฐ โโ๋ค๋ฅธ PRNG์ ์ด๊ธฐ ์ํ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ๋ฉ์์ง. ์ด๋ ๊ฒํ๋ฉด Practrand๋ก ๋ค์ด์ค๋ ์ฒ์ 160GB์ ๋ฐ์ดํฐ๊ฐ ๊ฒน์น์ง ์๋ ์ํ์ค์์ ๋์ต๋๋ค.
./intpcgnumpy 0x596d84dfefec2fc7 0x0579f81ab9f3e37b 0x8d7deae980a64ab0 0x6c79f81ab9f3e37b | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
[...]
rng=RNG_stdin, seed=unknown
length= 64 gigabytes (2^36 bytes), time= 926 seconds
Test Name Raw Processed Evaluation
[Low1/8]FPF-14+6/64:(0,14-0) R= +8.8 p = 8.7e-8 mildly suspicious
[Low1/8]FPF-14+6/64:all R= +6.3 p = 2.1e-5 unusual
[Low1/16]FPF-14+6/64:(0,14-0) R= +7.6 p = 1.1e-6 unusual
[Low1/16]FPF-14+6/64:(1,14-0) R= +8.3 p = 2.9e-7 mildly suspicious
[Low1/16]FPF-14+6/64:all R= +8.0 p = 5.8e-7 suspicious
[Low1/16]FPF-14+6/32:all R= +7.1 p = 3.9e-6 mildly suspicious
[Low1/64]FPF-14+6/32:cross R= +7.1 p = 2.6e-6 mildly suspicious
[Low4/32]FPF-14+6/64:(0,14-0) R= +13.5 p = 4.3e-12 VERY SUSPICIOUS
[Low4/32]FPF-14+6/64:all R= +9.0 p = 5.9e-8 very suspicious
[Low4/64]FPF-14+6/64:(0,14-0) R= +11.4 p = 3.8e-10 very suspicious
[Low4/64]FPF-14+6/64:all R= +8.0 p = 5.3e-7 suspicious
[Low4/64]FPF-14+6/32:(0,14-0) R= +10.3 p = 3.6e-9 suspicious
[Low4/64]FPF-14+6/32:all R= +6.1 p = 3.2e-5 unusual
[Low8/64]FPF-14+6/64:(0,14-0) R= +18.6 p = 8.4e-17 FAIL
[Low8/64]FPF-14+6/64:(1,14-0) R= +11.4 p = 3.9e-10 very suspicious
[Low8/64]FPF-14+6/64:(2,14-0) R= +8.3 p = 2.8e-7 mildly suspicious
[Low8/64]FPF-14+6/64:all R= +15.3 p = 6.9e-14 FAIL
[Low8/64]FPF-14+6/32:(0,14-0) R= +7.8 p = 7.1e-7 unusual
[Low8/64]FPF-14+6/32:(1,14-0) R= +7.2 p = 2.7e-6 unusual
[Low8/64]FPF-14+6/32:all R= +5.8 p = 6.9e-5 unusual
...and 1786 test result(s) without anomalies
์ด ํน์ ์ด๊ธฐํ ๋ฐ์ดํฐ์๋ 56 ๊ฐ์ ํ์ ๊ณ ์ ๋นํธ๊ฐ ์์ผ๋ฏ๋ก ์์ ๋นํธ๋ฅผ ๋ค์ง์ด 2 ^ 72 ๊ฐ์ ์๊ด ์ํ์ค๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค. ํต๊ณ์ ์ค๋ฅ๋ 64GB์ ๋ฐ์ดํฐ ํ์ ๋ฐ์ํ๋ฉฐ ์ค๋ณต์ด ์๊ด ๊ด๊ณ์ ๋ํ ์ฑ ์์ด ์์์ ๋ณด์ฌ์ค๋๋ค. ๋ฌผ๋ก 64GB ์ด์ ์ ๋ค๋ฅธ ํน์ ๋์ ์ ํ ํญ๋ชฉ๊ณผ ์ค๋ณต์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํน์ ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ๋ ๊ฒน์นจ์ด ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค. ์์ฑ๊ธฐ์ ๋ฐ๋์งํ์ง ์์ ๋ด๋ถ ์๊ด ๊ด๊ณ๊ฐ ๋ง์ด ์์ต๋๋ค.
ํ๋ ๊ฐ๋ น์ ์กด์คํ์ญ์์ค. ๊ทํ์ ์๊ฒฌ์ "๊ณต๊ฐ, ํ์, ์น์ , ์ธ๋ด"๋ฐ "์ฐ๋ฆฌ๊ฐ ์ ํํ ๋จ์ด์์ฃผ์ํ์ญ์์ค. ์ฐ๋ฆฌ๋ ์์ฌ ์ํต์์ฃผ์ํ๊ณ ์กด์คํฉ๋๋ค"๋ผ๋ ์ง์นจ์ ๋ฐ๋ผ ์ด์กฐ๋ก ์ ์งํ์ญ์์ค.
๋๋ ๊ฒน์น์ง ์๋๋ค๊ณ ๋งํ ์ ์ด ์๋ค. xoshiro256 ++์ ๋ํด ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ํ ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ์ธ์. ๋ ์จ์์ด ๊ฒน์น์ง ์๋๋กํฉ๋๋ค.
์, ๊ทธ๊ฒ์ ์ฌ์ํ ์ผ์ ๋๋ค. ์คํธ๋ฆผ์ ๊ธธ์ด๋ฅผ ๊ฒฐ์ ํ๊ณ , ๋ฐ๋ณตํ๊ณ , ๋ ์คํธ๋ฆผ์ด ์ด๊ธฐ ์ํ๋ฅผ ๋์ง ์๋์ง ํ์ธํฉ๋๋ค. http://prng.di.unimi.it/intpcgnumpy.c ํ๋ก๊ทธ๋จ์์ ์ํธ ๊ด๋ จ๋ PCG ์คํธ๋ฆผ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ๊ณผ ๋์ผํ ์ฝ๋๊ฐ ๊ฒน์น์ง ์์ต๋๋ค.
PCG๊ฐ ์ด๋ป๊ฒ ๋ ๋ ํนํ๋ค๋ ๊ทธ์ ์ฃผ์ฅ์๋ ๋ถ๊ตฌํ๊ณ , ์ค์ ๋ก PCG๋ ๊ฝค ์ ํต์ ์ ๋๋ค. PCG์ ์คํธ๋ฆผ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ PRNG ์ธ SplitMix๋ณด๋ค ๋์์ง ์์ต๋๋ค.
IMHO, PCG ๋ด์ ์๊ธฐ ์๊ด ๊ด๊ณ๋ ํจ์ฌ ๋ ๋์ฉ๋๋ค. LCG์ ๋ํ Durst์ ๊ทน์ ์ธ 1989 ๊ฒฐ๊ณผ์ ์ ์ฌํ SplitMix ์ธ์คํด์ค์ ๊ธฐ๋ฐ์ด๋๋ ์ฒจ๊ฐ์ ์์ฑ๊ธฐ์ ๋ํ ๊ฒฐ๊ณผ๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ SplitMix์ ๋งค์ฐ ๊ฐ๋ฒผ์ด ๋ฌธ์ ๊ฐ ์๋ ค์ ธ ์์ผ๋ฉฐ JEP 356 ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ก์ด ์ข ๋ฅ์ ๋ถํ ๊ฐ๋ฅ ์์ฑ๊ธฐ LXM์ ์ ๊ณต ํ ๊ฒ์ ๋๋ค. PCG๋ ๊ฒฐํจ์ด ๋ํ ๊ฒ์ผ๋ก ์ด๋ํ์ฌ ๊ต์ฒดํด์ผ ํ ๋์ ๋๋ค.
๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ๋ ์์ฑ๊ธฐ ๋ชจ๋์ ๋ํด ์๋ ค์ ธ ์์ผ๋ฉฐ ์ํ ํผํฉ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ์์ฑ๊ธฐ ์ค ํ๋์ ์ํ์์ ๋นํธ _k_๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ด ๋นํธ _k_ ์๋๋ก ์ ํ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ํ๋ผ์ ๋ชจ๋๋ฌ์ค๋ฅผ ๊ฐ์ง LCG, Fโ- ์ ํ ์์ฑ๊ธฐ, CMWC ์์ฑ๊ธฐ ๋ฑ์์ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์์ฑ๊ธฐ๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ํ๋ฅผ ํผํฉํ๋ ค๊ณ ํฉ๋๋ค.
PCG์ SplitMix์ ๋ฌธ์ ๋ฅผ ๋์ผ์ํ๋ ๊ฒ์ ๋ถ์ ์ฒญ์ด์ ๋๋ค. SplitMix๋ ๋งค์ฐ ๊ฐ๋จํ ๊ธฐ๋ณธ ์์ฑ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋จ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ด์ง๋ง ๊ทธ ์์ ๋งค์ฐ ๊ฐ๋ ฅํ ์คํฌ๋จ๋ธ๋ง ๊ธฐ๋ฅ์ด ์์ต๋๋ค.์ด ๊ธฐ๋ฅ์ Appleby์ MurmurHash3 ํด์ ํจ์์ ๋ํ 64 ๋นํธ ์ข ๋ฃ ์์ ๋๋ค. Stafford (http://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.html)์ ์ํด ๊ฐ์ ๋์์ต๋๋ค. ํจ์์ ์์๋ ๊ตฌ์ฒด์ ์ด๊ณ ์ธก์ ๊ฐ๋ฅํ ๋์ฌํ ์์ฑ์ ๊ฐ๋๋ก ํ๋ จ๋์์ต๋๋ค. ์ ์ ์์ ๋นํธ ๋ณ๊ฒฝ์กฐ์ฐจ๋ ๋ชจ๋ ์ถ๋ ฅ์ ํผ์ง๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ฆ, SplitMix๋ ๊ฑฐ์ธ์ ์ด๊นจ ์์ ์ ์์ต๋๋ค.
๋ฐ๋๋ก LCG ๊ธฐ๋ฐ PCG ์์ฑ๊ธฐ๋ ๋์ผํ ํผํฉ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ์คํฌ๋จ๋ธ๋ง ๊ธฐ๋ฅ์ ์ด๋ก ์ ๋๋ ํต๊ณ์ ๋ณด์ฅ์์ด ์ ์๊ฐ ์กฐ๋ฆฝ ํ ๊ฐ๋จํ ์ฐ์ ๋ฐ ๋ ผ๋ฆฌ ์ฐ์ฐ ์ํ์ค ์ผ๋ฟ์ ๋๋ค. ๊ธฐ๋ณธ LCG์ ๋ชจ๋ ์ํ์ค๊ฐ โโ๋์ผํ ๋ชจ๋๋ก ๋ง์ ์์ ๋ฐ ๋ถํธ ๋ณ๊ฒฝ์ด๋ผ๋ ์ฌ์ค์ ๊ณ ๋ คํ์ฌ ๊ณ ์ ๋์๋ค๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ ์๋ ์ํ์ค๊ฐ โโ์๋ก ์ฝ๊ฒ ํ์ ๋ ์ ์๋ค๋ ๊ฒ์ ์ ํ ๋ชฐ๋์ต๋๋ค. ์ด๋ PCG ๊ธฐ์ ๋ณด๊ณ ์ โโ(https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf)์ ์น์ 4.2.3์์๋ ๋ค์ ์ฑ๋ช ์์ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
"_c_๋ฅผ ์ ํํ ๋๋ง๋ค ๋ค๋ฅธ ์ํ์ค์ ๊ณตํต๋ ์ฐ์ ์ถ๋ ฅ ์์ด์๋ ๋ค๋ฅธ ์ซ์ ์ํ์ค๊ฐ โโ์์ฑ๋ฉ๋๋ค."
์ด๊ฒ์ ์ํ์ค๊ฐ โโ๋ค๋ฅด๋ค๋ ์ฆ๊ฑฐ, ์ฆ ๊ธฐ๋ณธ LCG๊ฐ ์ฌ๋ฌ ์คํธ๋ฆผ์ ์ ๊ณตํ๋ค๋ ์ฆ๊ฑฐ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด ์ฃผ์ ์ ๋ํ Durst์ 1989 ๋ถ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ๋ ผ๋ฌธ ์ด๋์๋ ๋ํ๋์ง ์์ต๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด ์ด๋ฌํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด ์ด๋ฌํ ๋ชจ๋ ์ํ์ค๋ ๋์ผํ๊ณ ๋ชจ๋๋ก ๊ฐ์ฐ ์์ ๋ฐ ๋ถํธ ๋ณ๊ฒฝ ์ผ ์ ์์ต๋๋ค (PCG์์ ๋ฐ์ํ๋ ์ต๋ ํจ๋ฅ์ 2 ์น ๋ชจ๋๋ฌ์ค๋ฅผ ๊ฐ์ง LCG์ ๊ฒฝ์ฐ).
Durst์ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ฉํ๋ ๊ฒ์ _ ์ง์ง _ ์ค์๋ผ๊ณ ํ์ ํฉ๋๋ค.ํ์ง๋ง ๋ฌธ์ ๋ ์ฌ์ฉ์ค์ธ ๊ธฐ๋ณธ LCG๊ฐ ์ด๋ค ์๋ฏธ์์ "๋ค๋ฅธ" "์คํธ๋ฆผ"์ ์ ๊ณตํ๋ค๊ณ ํ์ ํ๋ฉด ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ฒฐ๊ตญ PCG์ ๊ฐ์ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด "์คํธ๋ฆผ"์ ๋ณ๊ฒฝํ๋๋ผ๋ ๊ฐ ํ์ ์ํ์ค์ ๋ํด 2 ^ 72 ๊ฐ์ ๊ฒน์น์ง ์๋ ์๊ด ํ์ ์ํ์ค๊ฐ โโ์์ต๋๋ค.
๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ์ฌ๋ก์๋ "PCG๊ฐ ์ข๋ค / ๋์๋ค"์ ๊ฐ์ ์ด์ง ํ๋จ์ ๊ด์ฌ์ด ์์ต๋๋ค. ์ด๋ฌํ ํ ๋ก ์๋ ์์ ์ ํฌ๋ผ์ ์ฌ์ฉํ์ญ์์ค. ์ฌ๊ธฐ์ ์ฃผ์ ๋ numpy๊ฐ ํ ์ผ์ด๋ฉฐ ์ต์ข ํ๋จ์ numpy ๊ฐ๋ฐ์์๊ฒ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฌ๋ถ ๋ชจ๋๊ฐ์ด ํ ๋ก ์ ์ ๊ณต ํ ์ ๋ฌธ ์ง์์ ๊ฐ์ฌํ์ง๋ง ์ต์ข ํ๋จ๋ณด๋ค๋ ๊ทผ๋ณธ์ ์ธ ์ฌ์ค์ ์ด์ ์ ๋ง์ถ๊ณ ์ถ์ต๋๋ค. ํนํ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฌ์ ๊ณต๊ฐ์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํ๋ ์ ๋์ ์ง์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด์ ํ๋จ์ด ํ๋ ธ๋ค๋ฉด ๋๋ฌด ๋นจ๋ฆฌ ํ๋จ์ ๋ฐ์ด๋ค์๊ธฐ ๋๋ฌธ์ ๋ค์ ํผํ ์ ์๋๋ก ๋์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ ๊ฐ์ ์์ฑ๊ธฐ๊ฐ ๋ ๊ฐ์ ์๊ด ๋ ์๋ (๋ฌด์์๋ก ์ ํ๋จ)์์ ์์๋ ํ๋ฅ ์ 50 % ๋ ์ป์ผ๋ ค๋ฉด ๋ฌด์์๋ก ์์ํ๋ ์ฝ 50 ๋ง ๊ฐ์ ์์ฑ๊ธฐ๊ฐ ํ์ํฉ๋๋ค (์์ผ ํจ๋ฌ๋ ์ค).
@vigna ์ด ๊ณ์ฐ ๋ฐฉ๋ฒ์ 2**(n/2)
ํญ๋ชฉ์์ n
-๋นํธ ์ถฉ๋์ 50 % ํ๋ฅ ์ ์ ๊ณตํฉ๋๋ค (2์ ์ธ์๋ฅผ ์ฃผ๊ฑฐ๋ ๋ฐ์). 50 ๋ง ๋ฌ๋ฌ๋ 2**19
์ด๋ฏ๋ก ์ํํ ์๊ด ๊ด๊ณ๊ฐ ํ์ ๋นํธ์ ์ฝ 40 ๋นํธ ์ถฉ๋์์ ์์ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก ๊ด์ฐฐ ํ ์ ์๋ค๋ ์ฆ๊ฑฐ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ํ์ 40 ๋นํธ๋ฅผ ๊ณต์ ํ๋ ์์ ํ
์คํธํ๊ณ ํ
์คํธ๋ฅผ ์ทจ์ํ๊ธฐ ์ ์ PractRand์์ 16TiB์ ๋๋ฌํ์ต๋๋ค. 40 ๋นํธ ์ถฉ๋๋ก ์ธํ ์ค๋ฅ๋ฅผ ๊ด์ฐฐ ํ ๊ฒฝ์ฐ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ช TiB๋ฅผ ํ
์คํธํด์ผ ํ์ต๋๊น?
์ฆ๋ถ์ ๋ณ๊ฒฝํด๋ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๊ณ ํ์ ํฉ๋๋ค. "PCG ์คํธ๋ฆผ"์ ์ฅ์ ์ ๋ํ ์ถ๊ฐ ๋ ผ์๋ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด ํ ๋ก ์ "์ ์"์ ๋ํด ๋ฐ๋ณต์ ์ผ๋ก ๋ง์น๋ ํ๊ณ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ํนํ ๋ฐ๊ฐ์ง ์์ผ๋ฉฐ ์ฐ๋ฆฌ ์ ํ๋ ๊ฐ๋ น์ ์๋ฐ ํฉ๋๋ค. ์ง์ํ๋ค๋ ๊ฒ์ ๊ทํ์ ์ ๋ ฅ์์ด ์งํํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@imneme ์ด๊ฒ์ 2์ ํฐ ๊ฑฐ๋ญ ์ ๊ณฑ์ ๋ฐฐ์๋ก ์ ํํ๋ ๋ฌธ์ ์ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์ผํ ์ฆ๋ถ์ผ๋ก ํ ์์ PCG64
์ธ์คํด์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ฎ์ n
๊ณต์ ํ ๋ ๋นํธ, ๋ด๊ฐ ๊ณ์ฐํ๋ ๊ฑฐ๋ฆฌ๋ 1 << n
์ ๋ฐฐ์์
๋๋ค. ๋ ๊ฐ๋ ฅํ DXSM
์ถ๋ ฅ ํจ์ ๋์ด ํ์์ ํด๊ฒฐํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์ฆ๋ถ๊ณผ ํ์ 64 ๋นํธ ์ํ๋ฅผ ๋ฌธ์ ์์ด 2TiB๊น์ง ๊ณต์ ํ๋ ํ ์์ PCG64DXSM
์ธ์คํด์ค๋ฅผ ํ
์คํธํ์ต๋๋ค.
์ข์์, ์ด๊ฒ์ ๋นํฉ ์ค๋ฝ์ต๋๋ค. ๊ทธ๊ฒ์ 5 ๋ฐฑ๋ง ๋ฌ๋ฌ๊ฐ ์๋๋ผ 5 ์ต ๋ฌ๋ฌ์์ต๋๋ค. ํ ๊ธ์๊ฐ ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ ํ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
๊ทธ๋ฌ๋ ์์ ๋งํ๋ฏ์ด ์ด๊ฒ์ ์ ํํ ๋์ผํ ์์ ์ํ์ ๋๋ฌ ํ ํ๋ฅ ์ด์ง ์๊ด ๋ ํ์ ์ํ์ค๊ฐ โโ์๋นํ ๊ฒน์น ํ๋ฅ ์ด ์๋๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ ๋ PRNG๋ฅผ ์๊ด ๊ด๊ณ๊ฐ์๋ ํ์ ์ํ์ค์์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๊ทธ ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทํ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋งํ๋ฏ์ด ๊ฒฐ์ ์ ๊ทํ์ ๊ฒ์ ๋๋ค.
๋ ๋์ ๋ฏน์ฑ ์์ฑ์ ๊ฐ๋๋ก ์คํฌ๋จ๋ธ๋ง ๊ธฐ๋ฅ์ ์์ ํ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ธ ํด๊ฒฐ์ฑ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋ด ๊ฒ์๋ฌผ์ PCG์ SplitMix์ ๊ตฌ์กฐ์ ์ฐจ์ด์ ์ ์ค๋ช ํ๊ธฐ์ํ ๊ฒ์ผ๋ฟ์ ๋๋ค. ์ด์ ๊ฒ์๋ฌผ์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์ฃผ์ฅํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ง์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. SplitMix์ ๋ํด http://prng.di.unimi.it/corrpcgnumpy.c ์ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค.
@rkern , ๋น์ ์ ๋ฌผ์์ต๋๋ค :
@imneme ์ด๊ฒ์ 2์ ํฐ ํ์ ๋ฐฐ์๋ก ์ ํํ๋ ๋ฌธ์ ์ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์ผํ ์ฆ๋ถ์ผ๋ก ํ ์์
PCG64
์ธ์คํด์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ฎ์n
๊ณต์ ํ ๋ ๋นํธ, ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋1 << n
์ ๋ฐฐ์์ ๋๋ค. ๋ ๊ฐ๋ ฅํDXSM
์ถ๋ ฅ ํจ์ ๋์ด ํ์์ ํด๊ฒฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ฆ๋ถ๊ณผ ํ์ 64 ๋นํธ ์ํ๋ฅผ ๋ฌธ์ ์์ด 2TiB๊น์ง ๊ณต์ ํ๋ ํ ์์PCG64DXSM
์ธ์คํด์ค๋ฅผ ํ ์คํธํ์ต๋๋ค.
์๋ ์ ํ ๋ก ์ค๋ ๋๋ฅผ ์ฐพ์ ๋ค์ ์ฐ๊ฒฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์, Sebastiano๊ฐ ๋ต๋ณ์์ ์ธ๊ธํ๋ฏ์ด
๋ ๋์ ๋ฏน์ฑ ์์ฑ์ ๊ฐ๋๋ก ์คํฌ๋จ๋ธ๋ง ๊ธฐ๋ฅ์ ์์ ํ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ํฉ๋ฆฌ์ ์ธ ํด๊ฒฐ์ฑ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
XSL-RR์ ๋ ์ฝํ ๊ฒ์ ๋๋ค. ๋ฐ๋๋ก PCG ๋ ผ๋ฌธ์ ์๋ RXS-M ์ถ๋ ฅ ๊ธฐ๋ฅ๊ณผ ์๋ก์ด DXSM ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋ชจ๋ ์คํฌ๋จ๋ธ๋ง ๋ฐฉ์์ผ๋ก ๋ ๋ง์ ์์ ์ ์ํํ๋ฏ๋ก ์ด๋ฌํ ์ข ๋ฅ์ ๋ฌธ์ ๋ฅผ ํ์ํ์ง ์์ต๋๋ค. DXSM (์๋ ์์ด ์ปค๋ฐ ์์ PCG ์์ค์ ์ถ๊ฐ๋จ)์ XSL-RR๋ณด๋ค ๋ ๊ฐ๋ ฅํ์ง๋ง ์ ์ฌํ ์๊ฐ ์ฑ๋ฅ์ ๊ฐ๋๋ก ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค (์ฐธ์กฐ : RXS-M, ๋ ๋๋ฆผ). ์๋ ์ DXSM์ ์๋นํ ์ด์ฌํ ํ ์คํธํ์ง๋ง 67 ์ผ ๋์ ์๋ฒ๋ฅผ ์ค๋จํ๊ณ (UPS ๋ฐฐํฐ๋ฆฌ๊ฐ ์๋ชจ ๋จ) ํ ์คํธ ์คํ์ ์ข ๋ฃํ๋ ์ฐ์ฅ ๋ ์ ์ ์ด ์์์ง๋ง ๊ทธ ์์ ์์ ๋ ๊ฐ์ง ๋ชจ๋์์ ๊ฝค ์ ์ ์ฆ๋์์ต๋๋ค. ํ ์คํธ (128TB์ ์ถ๋ ฅ ํ ์คํธ) ๋ฐ 2 ^ 48์ ์ ํ (64TB์ ์ถ๋ ฅ ํ ์คํธ๋ ๋๋ฆฌ๊ฒ ์คํ๋๊ธฐ ๋๋ฌธ์).
DXSM์ ์ค๊ณํ์ง ์์๋๋ผ๋ RXS-M์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๋ฉด, ํ ๊ฐ์ง ์ง๋ฌธ์ ์ ์ ๊ฐ ์ฝํ XSL-RR ์์ด์ ๋์ ์ฌ์ฉํ๋์ง์ ๋๋ค. ์ถ๋ ฅ ํจ์์์ ํญ์ ๋งค์ฐ ๊ฐ๋ ฅํ ๋นํธ ์คํฌ๋จ๋ธ๋ง์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ต์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ๊ธฐ๋ก ๊ท๊ฒฐ๋๋ค๋ ๊ฒ์ ๋๋ค. ์๋๋ ์ฌ๋๋ค์๊ฒ ์ค์ํ๋ฏ๋ก ํ์ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์คํฌ๋จ๋ธ๋ง์ ํผํ๋ ค๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ๊ทธ์ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋์ ๊ณตํต์ ์ด ๋ง๊ธฐ ๋๋ฌธ์ Sebastiano๊ฐ ์น์ํ ๋ฌธ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๊ฐ ํ๋ ํต๊ณ ํ ์คํธ (์ ๊ฒฝ์ฐ์๋ LCG, ๊ทธ์ ๊ฒฝ์ฐ์๋ Marsaglia์ XorShift LFSR)์ ์คํจํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์คํฌ๋จ๋ธ๋ง ์ถ๋ ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์ค๋ ํ๋ฆฝ ๋ ์ ๊ทผ ๋ฐฉ์์ ์ทจํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ ๋ค ๊ทธ ์ถ๋ ฅ ํจ์๋ฅผ ์ ๋ ดํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ง๋ง, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ถ๋ ฅ ํจ์๋ก ๋ง์คํนํ๋ ค๋ ๊ธฐ๋ณธ ์์ฑ๊ธฐ์ ๊ฒฐํจ์ด ๋๋ฌ๋๋ ๋ถ๋ถ์ ์กฐ๊ธ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ์ ๊ฒฝ์ฐ,์ ๋ฅผ ํตํด ๋ณด์ฌ ์ฃผ์๋ค ์ ํ์ฑ ๋ฌธ์ .
๊ทธ๋ฌ๋ ์ ๋ฅผ ๋ง์ด ๊ธฐ์๊ฒํ๋ ์ต๊ทผ์ ์์ ์์ ๊ทธ๋ ์ผ๋ง๋ ๋ง์ LFSR ๊ธฐ๋ฐ ๋์์ธ์ด ์ถ๋ ฅ ๊ธฐ๋ฅ์ ์ํด ๋ถ์ ์ ํ๊ฒ ๊ฐ๋ ค์ง๋ ํด๋ฐ ๊ฐ์ค์น ๋ฌธ์ (๋ด ์์ ์ ์ค๋ ๊ด์ฌ์ฌ๋ฅผ ๋ฐ์ ํจ)๊ฐ ์๋์ง๋ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๊ทธ์ ๋ฐ์ ๊ธฐ๋ ๊ทธ์ ํ ์คํธ๋ฅผ ํต๊ณผํ์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋ฌด์ธ๊ฐ์ ๋๋ค.ํ์ง๋ง 2018 ๋ ์ ๊ทธ์ ์๋ก์ด xoshiro PRNG๋ฅผ๋ณด๊ณ ์์์ ๋ ์ ์๊ฒ ์์ด์๋ ์ธ๋ ๋ง ์์ฑ๊ธฐ์ ํด๋ฐ ๊ฐ์ค์น ๋ฌธ์ ๊ฐ ๊ทธ์ ์ถ๋ ฅ ํจ์๋ฅผ ํตํด ๋ง๋ ๊ฒ ๊ฐ์์ต๋๋ค. ๊ทธ๋ ์ดํ ์๋ก์ด ์ถ๋ ฅ ๊ธฐ๋ฅ์ผ๋ก xoshiro๋ฅผ ์์ ํ์ผ๋ฉฐ, ์ด๊ฒ์ด ํธ๋ฆญ์ ์ํํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค (๊ทธ๋ ๋ค๋ฅธ ๋ณ๊ฒฝ๋ ์ํ ํ์ผ๋ฏ๋ก์ด ํ ์คํธ ํ๋ก๊ทธ๋จ ์์ ๊ฐ์กฐํ ๋ฐ๋ณต ๋ฌธ์ ๋ ์์ ํ์ต๋๊น?).
๊ทธ์ ์๊ด ํ๋ก๊ทธ๋จ์ ๊ดํด์๋ 2018 ๋
์ ๊ทธ๊ฐ ๋ค์ํ ์ด์ (์ : ์ธ์์ ์ธ ์๋ ๋ฑ)๋ก ์์ฑํ ํ๋ก๊ทธ๋จ์ ํฌํจํ๋ ๊ทธ์ ์น ์ฌ์ดํธ์ PCG์ ๋ํ ๋นํ์ ์ฌ๋ ธ์ ๋ ๋น์ทํ ํ๋ก๊ทธ๋จ์ด ๋ง์ด ํฌํจ ๋ ๋ต๋ณ ์ ์ผ์ต๋๋ค corrsplitmix2.c
๋ฅผ ํฌํจํ์ฌ ์ค๋ซ๋์ ํ๋ฆฝ ๋ PRNG์ ๊ฒฝ์ฐ. ์ธ๋ฐ์ค์ฐฌ์ด ํ ์ ์๋ค๊ณ ๋งํ์ ๋ ๋ฌด์จ ๋ป์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ทธ์ ์๋ก์ด ํ
์คํธ ํ๋ก๊ทธ๋จ์ด ๊ทธ์ ํ
์คํธ ํ๋ก๊ทธ๋จ๊ณผ ์ค์ง์ ์ผ๋ก ๋ค๋ฅธ์ง ํ์ธํ๊ธฐ ์ํด ๊ทธ์ ํ
์คํธ ํ๋ก๊ทธ๋จ์ ๋ฉด๋ฐํ ์ดํด๋ณผ ๊ธฐํ๊ฐ ์์์ต๋๋ค. ๋ช ๋
์ ์ ์ผ์ต๋๋ค.
์ ์ ์ดํด ๋ถ์กฑ์ ์ฉ์ํด์ฃผ์ญ์์ค.ํ์ง๋ง์ด ๋จ๊ณ์์ ๋๊ตฐ๊ฐ์๊ฒ ์์ฝ ๊ฒฐ๋ก ์ ์์ฒญํ ์ ์์ต๋๊น? ๊ธฐ๋ณธ PCG๊ฐ ์์ ํ์ง ์์ ํ์ค์ ์ํฉ์ด ์์ต๋๊น? ๊ธฐ๋ณธ๊ฐ์ ์ ํํ๊ธฐ์ํ ์ธ์๋ ๋ฌด์์ ๋๊น?
์ฌ์ด ๊ฒฝ๋ก๋ ๊ณ ์ฐจ์ (์ด๊ณ ๋) ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ์๊ด ์ํ์ค์ ํ๋ฅ ์ ๋ํ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
๋ ์ด๋ ค์ด ๊ฒฝ๋ก๋ ์คํธ๋ฆผ์ ์ค๋จ์ํฌ ์ถ๋ ฅ ํจ์๋ฅผ ๊ต์ฒดํ๋ ๊ฒ์
๋๋ค. default_rng
์ฝ์์ด ์ผ๋ง๋ ๊ฐ๋ ฅํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฌธ์๋ ์ด๊ฒ์ด ๋ณ๊ฒฝ ๋ ์ ์๋ค๊ณ ๊ฒฝ๊ณ ํ์ง ์๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด ์ง์ ์ค๋จ์ฃผ๊ธฐ๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์๋ก์ด ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋
๋ฆฝํ ๋นํธ ์์ฑ๊ธฐ๋ก ์ถ๊ฐํ๊ณ (๋๋ PCG64์์ ๊ตฌ์ฑ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ ํฉ๋ฆฌ์ ์ธ) XXXX / ๋ฆด๋ฆฌ์ค Y.ZZ ์ดํ์ ๋ณ๊ฒฝ ๋ ๊ฒ์ด๋ผ๊ณ ์ฌ์ฉ์์๊ฒ ๊ฒฝ๊ณ ํด์ผํฉ๋๋ค.
๊ฐ์ฅ ์ด๋ ค์ด ๊ฒฝ๋ก๋ ์๋ก์ด ๊ธฐ๋ณธ rng๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ฒ์์๋ ์ฝ์ง ์์๊ณ ์ง๋ 18 ๊ฐ์ ๋์ ๋ฐ๋์ ํน์ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๊ธฐ ์ํด ๋ณ๊ฒฝ๋ ๊ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
default_rng()
์์ ์ ๋ํด gh-16493์ ์ด์์ต๋๋ค.์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋
ผ์ํด์ผ ํ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ง๋ ์ด๋ฏธ ์ค๋ ์ ์ ๊ท์น์ ์ ํด ๋์์ ๊ฒ์
๋๋ค. ๊ธฐ์ตํ์ง ๋ง์ญ์์ค.
๋๋์ด ๋ ผ์๋ฅผ ์์ ํ ์ดํดํ๋ค๊ณ ์ฃผ์ฅํ์ง ์์ง๋ง, ์์ ๋ด์ผ ํ ๋ ๊ฐ์ง๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํฉ๋๋ค.
๋ฐ ์ง์ [...] ๋ฐ : math :
2^{127}
์คํธ๋ฆผ
์ซ์์ ์ถ์ฒ๋ฅผ ์ ํํ ์์ง ๋ชปํ๋ ๊ฒฝ์ฐ ์ฐ๋ฆฌ ์ธก์์ ์ฝ๊ฐ ๊ณผ์ฅ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฉฐ ์๋ฒฝํ๊ฒ ์ ํํ๋๋ก ์ฝ๊ฐ ์กฐ์ ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ํ ์ ์์ต๋๊น? ๋๋ ์ถ๊ฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ธ๋ถ ๋ฆฌ์์ค์ ๋ํ ๋งํฌ?
์ง๊ธ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ "์ ๋ ดํ ์น์"์ ๋ ๊ฐ๋ ฅํ DXSM
์ถ๋ ฅ ๊ธฐ๋ฅ์ ๊ฐ์ง PCG64์ ๋ณํ ์ธ PCG64DXSM
BitGenerator
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๊ฒ์ด ํ์ฌ PCG64
๊ตฌํ์์๋ XSL-RR ์ถ๋ ฅ ํจ์์์ ํ ๋จ๊ณ ์ฌ๋ผ๊ฐ ๊ฒ์ผ๋ก, ๋ฐํ์ ์ฑ๋ฅ์ ์์์์ฃผ์ง ์๊ณ ํต๊ณ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ๋ค๋ ๋ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋ BitGenerator
๋ํด PCG64
์ ๊ณตํ๋ ํ์ ์์ฅ์์์ ๊ฐ๋จํ ์
๊ทธ๋ ์ด๋์
๋๋ค. PCG64
์ ํจ๊ป ์ถ๊ฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ง๋ถ์ฌ์, PCG64
์์ฑ์์ ๋ํ ์ต์
๋ณด๋ค๋ BitGenerator
๋ผ๋ ๋ณ๋์ ์ด๋ฆ์ ์ ํธํฉ๋๋ค. ์ด๋ฌํ ์ต์
์ randomgen
์์ ํ๋ฅญํฉ๋๋ค. ๊ทธ ๋ชฉ์ ์ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ณํ์ ์ ๊ณตํ๋ ๊ฒ์ด์ง๋ง numpy
์ ๊ฒฝ์ฐ ์ ํ ํญ๋ชฉ์ด ๋ค์๊ณผ ๊ฐ์ด "๊ทธ๋ฉ ์ค ๊ณ "๊ฐ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ํ ๋ง์ด.
๋๋ ์ฐ๋ฆฌ๊ฐ default_rng()
์ ๊ณตํ๋ ๊ฒ์ ๋ณ๊ฒฝํ๊ธฐ์ํ ์ ์ฑ
์ ์ค์ ๋ก ์ ํ์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๊ทธ๊ฒ์ ์ ์ํ์ ๋, ๋๋ ๊ทธ ๊ธฐ๋ฅ์ Generator()
์์ฑ์์ ๋ฃ๋ ๊ฒ๋ณด๋ค ์ ํธํ๋ ์ด์ ์ค ํ๋๊ฐ ํ์ํ๋ค๋ฉด ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ณ ๋ค๋ฅธ ์ด๋ฆ์ ํจ์๋ก ์ด๋ํ ์ ์๋ค๋ ์๊ฐ์ ๋ ์ฌ ๋ ธ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋น์ ์ฐ๋ฆฌ๋ default_rng()
๊ธฐ๋ณธ BitGenerator
๋ํ ๋ง์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋
ธ์ถํด์ผ ํ ์ ์๋ค๊ณ ์๊ฐํ๊ณ ์์์ง๋ง ๋์ค์ ํผํ์ต๋๋ค. ๋๋ฌธ์ PCG64DXSM
๊ฐ์ API (๋
ธ์ถ .jumped()
๋ก ํนํ) PCG64
, ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ์ ์ผํ ๊ณ ๋ ค ์ฌํญ์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ๋นํธ ์คํธ๋ฆผ์ ๋ณ๊ฒฝ ๊ฒ์
๋๋ค. NEP 19 ๋น Generator
๋ฉ์๋ (์ฆ, X.Y.0
๊ธฐ๋ฅ ๋ฆด๋ฆฌ์ค)์์ ์ค๋ ์คํธ๋ฆผ์ ๋ํ ๋ค๋ฅธ ์์ ๊ณผ ๋์ผํ ํ์ ๋ผ์ธ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ์กฐ๊ธ ๋ ์ ์คํ๊ฒ ์ ํํ ์ ์์ต๋๋ค. ๋จผ์ 1.20.0
๋ฐ ๋ฌธ์์์ PCG64DXSM
๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ BitGenerator
๋ก ๋
ธ์ถํฉ๋๋ค ( warn()
, ๋๋ฌด ์๋๋ฌ์์ ํจ๊ณผ๊ฐ ์์) default_rng()
๋ 1.21.0
์์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
์ BG๋ฅผ ์ถ๊ฐํ๋ ๊ณผ์ ์์ ์ง์นจ ์ญํ ์ ์์ํ๊ณ ์ต์ ๋ณํ์ ์ ํธํ๋ ๊ทผ๊ฑฐ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ ธํธ๋ฅผ PCG64๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ์ถฉ๋ถํ ์ง๋ก๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ํ์ ํ๊ณ , ๋๋ ์ด๊ฒ์ ๋ํด ๋ก๋ฒํธ๋ฅผ ์ ๋ขฐํด์ผํ๊ณ ์ง๊ธ ๋น์ฅ ์ฐ๋ฆฌ๊ฐ ์๋ ํ ๊ทธ๊ฒ์ด ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๊น? (์ฆ, ์ค์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ NumPy๊ฐ ์ฌ์ฉ๋ ์์๋ ์ด๋ค ๊ฒ๋ณด๋ค ํฐ ํ๊ฒฝ์์๋ ๋ถ๋๋ฝ๊ฒ ๋ฎ์ ๊ฒ์ ๋๋ค. ๋ฏธ๋์ ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํด์ผํ ์ง ์ฌ๋ถ๋ ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค.)
๊ทธ๊ฒ์ ์๋ง๋ ๋๋ฌด ์ด๋ฆฌ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์คํธ๋ฆผ ์, ๊ฐ ์คํธ๋ฆผ์์ ๊ฐ์ ธ ์ค๋ ๋ฐ์ดํฐ์ ์, ์์ผ ์ถฉ๋์ ๋ํ ์ํ ํ์ฉ ๋ฒ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์์ง ๋ฐ๋ผํ๊ธฐ ์ฌ์ด ๊ถ์ฅ ์ฌํญ์ ๋ง๋ค๊ธฐ ์ํด ๊ทธ ์ํ์ ์ดํดํ๊ธฐ ์ฌ์ด ๋จ๋ฝ์ผ๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํ๋์์ด Github ๋ฌธ์ ๋ฅผ ๋ค์ ๊ฒํ ํ์ง ์์์ต๋๋ค. ๊ทธ๋๋ _ ์ง๊ธ ๋น์ฅ ๊ณ ์ณ์ผ ํ ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์ค์ ๋ ์ค๋ ์ธ ๊ฒ์ด์ง๋ง,์ด ์ค๋ ๋์์ ๋ณผ ๋ ์ฐ๋ฆฌ๋ ์๋ ์ ๋ค๋ฃฌ ๋ ์ ๋ค์ ์ฝ์์ต๋๋ค. Sebastiano๊ฐ NumPy๊ฐ PCG๋ฅผ ์ถ์ํ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌ ํ ๊ฒ ์ธ์๋ ์๋ฌด๊ฒ๋ ๋ณํ์ง ์์์ต๋๋ค. ์๋ NumPy ํ์ ๋ถ์์ ๋ ์ฌ์ธต์ ์ด์๊ณ ๋ ๊ทธ๋ด๋ฏํ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ต๋๋ค.
๋ด๊ฐ ์ ํธํ๋ ๊ฒ์ ํผ๋์ ์ค์ด๊ธฐ ์ํด ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ ๋๋ค. ๋ด ๋ง์, ๊ฐ๊ฐ ์๊ฐ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ๋ง๋ผ๋ ๊ฒ์ ๋๋ค.
@imneme- ๋๋จํ ๊ฐ์ฌํฉ๋๋ค-๋ ๊ธด ๊ฒ์ด ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐํ๊ณ ์ถ์ ๋ง์ด ๋จธ๋ฆฟ์์ ์์์ง๋ง 1 ๋ ์ ์ ๊ฒ์๋ฌผ์ ๋ณด๋ฉด ์ด๋ฏธ ์ฌ๊ธฐ์ ๋ค๋ฅธ ๊ณณ์์ ๋ชจ๋ ๋งํ ์ ์ด ์์ต๋๋ค ( ๋ด ๋ธ๋ก๊ทธ (2017), ๋ ๋ง , ๋ด ๋ธ๋ก๊ทธ ๋ค์ (2018)) , NumPy ํ ๋ก ๋ฑ)
์คํธ๋ฆผ๊ณผ ๊ทธ ์์ฒด ์ ์ฌ์ฑ ( @rkern ์ด ์คํธ๋ฆผ ์์กด์ฑ ํ ์คํฐ ๋ฅผ ์ผ์ )์ ๋ํด ์๋ ์ ์ผ์ต๋๋ค.
์์ ์ธ๊ธ ํ ๋ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์์ ์ธ๊ธํ๋ฏ์ด 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์์ ๋ฐ๋ณต๋๋ ๋ฌธ์ ๋ฅผ ๋ณต๊ตฌ
(I๋ ๋ ๊น์ด ๋ค์ด๊ฐ๋ค ์ด ๋๊ธ ๊ณผ์์ ์ด๊ฒ .)
์ค์ํ ์ ์ ๊ฑฐ์ ๋ชจ๋ PRNG์ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ์๊ฐ๊ณผ ์๋์ง๋ก ๋ณ์ ์จ์์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. PCG๋ ์์ผ๋ก ๋ง๋ ๋ณ๋ฆฌํ (์ : Sebastiano)์ด์๋ PCG์ ๋ํด ๊ทธ๋ด๋ฏํ๊ฒ ๋ณด์ด๋ ์๋ ์์ ์ ์ฆ๊ธฐ๋ ์ฌ๋์ด ์๋ค๋ ๋ค์ ํน์ดํ ์์น์ ์์ต๋๋ค. ๊ทธ ์์ ์ ๊ฒฐ๊ณผ๋ก ์ ๋ ๊ทธ์ PRNG์ ๋ค๋ฅธ ์ค๋ ๊ธฐ๊ฐ ๋์์ PRNG์ ๋ํด ๋๊ฐ์ ์ผ์ํ์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก "๋ฌด์์"๋ก ๋ณด์ด๋ ๊ฒ์ผ๋ก PRNG ์ํ๋ฅผ ์ด๊ธฐํํ๋ ค๊ณ ํฉ๋๋ค. ์ฌ๋๋ค์ด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ํ๋๋ผ๋ ๊ทธ๊ฒ์ ๋งค์ฐ ๋ณดํธ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ LFSR PRNG (XorShift ์คํ์ผ, Mersenne Twister ๋ฑ)์ ๊ฒฝ์ฐ์๋ ๊ทธ๋๋ก ์ ์ง๋๋ฏ๋ก ๋ชจ๋ 0 ์ํ๋ก ์ด๊ธฐํํด์๋ ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ด 0 ์ธ ์ํ์กฐ์ฐจ๋ LFSR (์ ๋ก ๋๋๋ก ์๋ ค์ง ํ์๊ณผ C ++ ์ฌ๋๋ค์ด seed_seq
๋ง๋ ์ด์ )์ ๋ฌธ์ ๊ฐ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. "์ธ์์ ์ธ ์๋ฉ์ ํด๋ณด์"๊ฒ์์ํ๊ณ ์ถ๋ค๋ฉด 100 ๊ฐ์ LFSR์ ๋ํ ์ด๊ธฐํ ์ปฌ๋ ์
์ ๋ง๋ค๊ณ ๋ชจ๋ ์ ๋ก ๋๋๋ฅผ ์น๋ ๊ฒ์ผ๋ก๋ถํฐ 1K ๋จ์ด์ ธ ์๋๋กํ๋ ๊ฒ์ด ์ด๋ ต์ง ์์ต๋๋ค. ์ธ์์ ์ธ ์ด๊ธฐํ๋ ๋ชจ๋ ์์ง ํด ๋ณด์ด์ง๋ง ๋์์ ํด๋ฐ ๊ฐ์ค์น๊ฐ ์ด์ํ๊ฒ ๋จ์ด์ง ๊ฒ์
๋๋ค.
ํฉ๋ฆฌ์ ์ธ ์ํธ๋กํผ๋ก ์ด๊ธฐํ ๋ PCG ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ด์ฐฎ์ต๋๋ค. 1, 2, 3๊ณผ ๊ฐ์ ์ ํฌ๋ก ์ด๊ธฐํํ๋ ค๋ฉด ์ค์ ๋ก PRNG์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ PCG๋ฅผ ์ฌ์ฉํ๋ฉด 99.9 %์ ์๊ฐ ๋์ ์ฝ๊ฐ์ ์ฐ๋ ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค. LFSR์ด ๊ฐ์ง ์ข ๋ฅ์ ๋ฌธ์ ์ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ DXSM์ ํ์คํ ๋ ๊ฐ๋ ฅํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ๋ซ๊ฑฐ๋ ๋ง๋ค์ง ์์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ฝ๊ฐ์ ๊ด์ ์ ๊ฐ์ง๊ณ ์ค์ ๋ก ์ฌ์ฉ์๊ฐ ๊ณ ์ ์ ์ธ PCG64 ๊ตฌํ์์ ๋ฌธ์ ์ ๋ถ๋ชํ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ซ๋ ๊ฒ์ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ ํ์ฌ ๋ ผ์์์ PCG64์ ์คํธ๋ฆผ (LCG ์ฆ๊ฐ๋ฅผ ํตํด)์ ๋ํ ๋นํ / ๋ฐฉ์ด๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ถ์ต๋๋ค. LCG์ ์ํ์ผ๋ก ์ธํด ํน์ ์ด์ค์ฑ์ด ํฌํจ๋์ด ์์ง๋ง ์๋ ์ฌ๊ธฐ์์ ์ ๊ธฐ ๋ ํต์ฌ ๋ฌธ์ ๋ ์๋๋๋ค. ๋ํ Sebastiano์ ์๋ ๋นํ , ๊ทํ์ ๋ต๋ณ ๋๋ ์ค๋๋ ๋ฉ๊ฐ ์ค๋ ๋๋ณด๋ค ๋ ๋ง์ ์ธ๋ถ ์ฌํญ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์๋ง๋ ์ํ์ ๋ ๋ง์ ์๊ฐ์ ํฌ์ ํ ์ ๋ฌธ๊ฐ๋ค์๊ฒ๋ ์ฐ๊ด์ฑ์ด ๋ ๋ถ๋ช ํ ์ ์์ง๋ง, ์ ์ด๋ ์ค์ง์ ์ธ ๊ฒฐ๊ณผ๋ ์ด์ ๋์๊ฒ ๋ ๋ถ๋ช ํด์ก์ต๋๋ค.
์ค์ํ ์ ์ ๊ฑฐ์ ๋ชจ๋ PRNG์ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ์๊ฐ๊ณผ ์๋์ง๋ก ๋ณ์ ์จ์์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋น์ฐํ์ง๋ง, ๋ด ์์์ ๊ฒฐ์ ์ ๋ด๋ฆด ์์๋ ๊ฒ์ ๋ฐ์ด๋๋ฆฌ๊ฐ ์๋๋๋ค. ์ ํ PRNG์์ ๋๋ฌด ๋ง์ ์ซ์๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๊ฒฐ๊ตญ PractRand๊ฐ์ด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ด์ง ์ฌ์ค์ PRNG ์๊ณ ๋ฆฌ์ฆ์ ๋ฌดํจํํ์ง ์์ต๋๋ค. ๋ฐ์ด๋๋ฆฌ์์ ๋ฒ์ด๋ ํค๋ ๋ฃธ์ ๊ฐ๋ ์ ์ค์ ํ๋ ๊ฒ์ ์๋ PCG ๋ ผ๋ฌธ์ ๋ํด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์๊ฐํ๋ ๊ฒ ์ค ํ๋์์ต๋๋ค. ์ ๋์ ์ผ๋ก ์์ฑ ๋ ๋ณ๋ฆฌ๋ฅผ ๊ฐ์ํ ๋, ๊ทธ ๋ณ๋ฆฌ๊ฐ ์ข์ ์ํธ๋กํผ ์๋์์ ๋ฌด์์๋ก ๋ฐ์ํ๋ ๋น๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ฅผ ์๋ํํ์ฌ ์ฌ์ฉ์๋ฅผ์ํ ์ค์ฉ์ ์ธ ์กฐ์ธ์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค.
ํ์ 58 ๋นํธ์ ๋์ผํ ์ฆ๋ถ์ ๊ณต์ ํ๋ ๋ ๊ฐ์ ์ํ (๊ทธ ์์ ํ์ ๋ฃ์ ๊ฒ์)๋ฅผ ๊ฐ์ํ ๋ ์ด๋ฌํ ์ํ์์ PCG64 XSL-RR ์ธ์คํด์ค๋ฅผ ์ธํฐ๋ฆฌ๋นํ๋ฉด PractRand์์ ์ฝ 32GiB์์ ์ค์ ๋ก ๊ด์ฐฐ ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํผํ๊ณ ์ถ์ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ์ด๋ฅผ ๋ฒค์น ๋งํฌ๋ก ์ผ์ ์ข์ ์ํธ๋กํผ ์๋๋ก ์ผ๋ง๋ ์์ฃผ ๋ฐ์ํ๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ๋คํ์ค๋ฝ๊ฒ๋์ด ์ ๋์ ์ธ ๊ณํ์ ํ๋ฅ ์ ๋ถ์์ด ๊ฐ๋ฅํฉ๋๋ค (๋ชจ๋๊ฐ ๊ทธ๋ ๊ฒ ์น๊ทผํ ๊ฒ์ ์๋๋๋ค). n
์ธ์คํด์ค์ ๊ฒฝ์ฐ ๋์ผํ ํ์ 58 ๋นํธ๋ฅผ ๊ณต์ ํ๋ 2 ๊ฐ์ ํ๋ฅ ์ n**2 / 2**58
์ด๋ฉฐ ์ด์ค ๊ณ์ฐ์ ๋ํด 2์ ์ธ์๋ฅผ ์ฃผ๊ฑฐ๋๋ฐ์ต๋๋ค. ๋ฐ๋ผ์ 5 ์ต ๊ฐ์ ์ธ์คํด์ค์์ ์ธํฐ๋ฆฌ๋ธ ๋ ๊ฒฝ์ฐ PractRand์ ์คํจํ๋ ํ์ด๋ง์ด ํ๋์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. 5 ์ต์ ๋ง์ต๋๋ค! ์ ํ๋จ์ผ๋ก๋ PCG64
์ธ์คํด์ค๋ฅผ ๋ง์ด ์์ฑํ๋ ค๊ณ ์๋ํ๋ numpy
ํ๋ก๊ทธ๋จ์ ๊ฒฐ์ฝ ๋ณผ ์ ์์ ๊ฒ์
๋๋ค. numpy
๋ ์๋ชป๋ ๋๊ตฌ ์ผ ์ ์์ต๋๋ค.
๋ํ ํ์ ๊ทธ๋ฆฌ๊ธฐ๊ฐ ๋ค๋ฅธ ์ด๊ธฐ ์ํ์ 58 ๋นํธ ํ์ ์ถฉ๋ ์ํ๋ฅผ _cross_ํ๋ ์ด๊ธฐ ์ํ๋ฅผ ํผํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ๋ํ ๋
ผ๋ฆฌ๋ฅผ ์๊ฐํ๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์์ง๋ง ๊ธธ์ด๋ ํ๋ฅ ์ 2 ์ฐจ์ ์ด ์๋ ์ ํ ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๋ง๊ณ ๊ฐ ์ธ์คํด์ค ( 2**28
๋๋ก์ฐ)์์ 16GiB๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ ( 2**15
๋ก๋ง ์์
ํ ์ ์์ต๋๋ค. numpy
ํ๋ก๊ทธ๋จ์ XSL-RR ์ถ๋ ฅ ํจ์์ ํจ๊ป PCG64
๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๊น์์ง๊ธฐ ์์ํ ์ ์์ต๋๋ค (์ : ๋๊ท๋ชจ ๋ถ์ฐ ๊ฐํ ํ์ต ์คํ).
์ฆ๋ถ ํ์ ๊บผ๋ด์ด ํด๊ฒฐํด ๋ด
์๋ค. XSL-RR ์ถ๋ ฅ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ์ ์ถ๊ฐ๋ก ์ฆ๊ฐ๋ถ์ ์ํธ๋กํผ ์๋ํด๋์ด ํน์ ๋ถ์์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค๊ณ ๋งํ๋ ๊ฒ์ด ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฃผ์ด์ง ์ํธ๋กํผ ์๋ ์ฆ๋ถ ์์ ๋ํด ์ค์ง์ ์ผ๋ก ์ถฉ๋ํ๋ ์ํ์ ์๊ฐ ๋์ผํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ์ํ๋ฅผ ์๋์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๊ตฌ์ฒด์ ์ธ ์ ์ฐจ๋ ๋์ผํ ํ์ 58 ๋นํธ์์ bashingํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํด ๋ณด์ด์ง๋ง ์ถฉ๋ ์ํ์ ์๊ฐ ๋์ผํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ํ๋ฅ ๊ณ์ฐ์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก PCG ์ฒด๊ณ์ ๋ด์ฌ ๋ ๊ฒ์ด ์๋๋๋ค. DXSM ์ถ๋ ฅ ๊ธฐ๋ฅ์ (๋จ์ํ +2
๋ง์ผ๋ก๋) ์ฆ๋ถ์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ธฐ๋ณธ LCG์ ๋ํ ์ต์
์ ์ํ (๊ฑฐ๋ฆฌ ๋ฉํธ๋ฆญ์ด 0
์ ๊ณตํ๋ ๊ฒฝ์ฐ)์๋ ์ ํญ ํ ์์์๋งํผ ์ถฉ๋ถํ ๊ฐ๋ ฅ ํด ๋ณด์
๋๋ค.
๋๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์์ ํ ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋ฐ๋ณตํ๋ฉด์ ๋๋ด๊ณ ์ถ์ต๋๋ค. PCG64DXSM
์ ์ข์ ์๊ฐ์
๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด, ๊ทธ๊ฒ์ ๊ฐ์ ๋ ํต๊ณ์ ์์ฑ์ ๋ด๊ฐ ๋ฌธ์ํํด์ผํ๋ค๊ณ ๋๋ผ๋ ์ ์ ์ ๋ชจ๋ธ์ ๋จ์ํํ๊ณ , ๋ฌธ์๋ฅผ ์ ๊ฒ ์์ฑํด์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ๋ด ์ฑ
์์ ์ข๋ค.
๋์ผํ ์คํธ๋ฆผ์ ์์ฑ๊ธฐ๊ฐ์๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์ ๊ฐ ๋ํ๋๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆผ์ ์ฌ์ ํ โโ๋ค์ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ค ์ํฉ์์ ๋์ผํ ํ์ 58 ๋นํธ๋ฅผ ๊ฐ๊ณ ๋์ผํ ์คํธ๋ฆผ์ ์์๊น์? ์ด๊ฒ์ด ์ผ์ด๋ ์์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๊น?
์ ๊ฐ ์๋ ๋ค์ ํ์ค์ ์ธ ๊ฒฝ์ฐ๋ ์๋
์ ( jumped
๋ํด ์ด์ผ๊ธฐํ์ ๋) ์ด์ผ๊ธฐ ํ ๊ฒ์ด๊ณ , ์ ๊ฐ ์์ ๋งํฌ ํ์ด ๊ฒ์๋ฌผ ์์ ์ด์ผ๊ธฐ ํ ๊ฒ์
๋๋ค.
๋์ผํ ์คํธ๋ฆผ์ ์์ฑ๊ธฐ๊ฐ์๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์ ๊ฐ ๋ํ๋๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆผ์ ์ฌ์ ํ โโ๋ค์ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ถํํ๋ XSL-RR์ ๊ฒฝ์ฐ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ ๊ฐ์ PCG64
XSL-RR ์ธ์คํด์ค๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. ์ฆ๋ถ์ ์์๋ก ์ํธ๋กํผ ์๋ํ๊ณ ์ํ ์ค ํ๋๋ฅผ ์ํธ๋กํผ ์๋ํฉ๋๋ค. ๋์ผํ ํ์ 58 ๋นํธ ์ํ ๋์ผ ์ฆ๋ถ ์คํจ์ ๋์ผํ ๋ฐฉ์์ผ๋ก PractRand์ ์คํจํ๋ ๋ค๋ฅธ PCG64
์ธ์คํด์ค์ ๋ํด 2**70
์๋ชป๋ ์ํ๋ฅผ ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค. ๊ฐ์ ์ฆ๋ถ์ ๊ฒฝ์ฐ๋ณด๋ค ์ํํ๋ ๊ฒ์ด ๋ ๋ณต์กํฉ๋๋ค. ํ์ 58 ๋นํธ๋ฅผ ๋ค๋ฅธ ์ฆ๋ถ์ ๊ฐ์ง ์ฒซ ๋ฒ์งธ ์ํ๋ก ๊ณต์ ํ๋ ๋์ ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค์์ 0 ๊ฑฐ๋ฆฌ (LCG ๊ฑฐ๋ฆฌ ์ธก์ ์ ๋ฐ๋ผ) ์ธ ์ํ์ ํ์ 58 ๋นํธ๋ฅผ ๊ณต์ ํ์ฌ ์ฆ๋ถ์ ์ค๋ช
ํฉ๋๋ค. ๊ฑด์ค์ ์ธ ์ฆ๊ฑฐ (Python ์ฝ๋)๊ฐ ์์ง๋ง ์ง๊ธ ์๊ณ ๋ด์ผ ์ฒญ์ํด์ผํฉ๋๋ค.
@rkern , ์ข์ ์ง์ ์ ๋๋ค. ๋๋ ์ธ์ ํ ๊ฒ์ด๋ค, ๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง๋ณด๊ธฐ ์ํด ๊ทธ ์๋๋ฆฌ์ค๋ฅผ ์ํํ์ง ์์๋ค.
์ค์ํ ์ ์ ๊ฑฐ์ ๋ชจ๋ PRNG์ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ์๊ฐ๊ณผ ์๋์ง๋ก ๋ณ์ ์จ์์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. PCG๋ ์์ผ๋ก ๋ง๋ ๋ณ๋ฆฌํ (์ : Sebastiano)์ด์๋ PCG์ ๋ํด ๊ทธ๋ด๋ฏํ๊ฒ ๋ณด์ด๋ ์๋ ์์ ์ ์ฆ๊ธฐ๋ ์ฌ๋์ด ์๋ค๋ ๋ค์ ํน์ดํ ์์น์ ์์ต๋๋ค. ๊ทธ ์์ ์ ๊ฒฐ๊ณผ๋ก ์ ๋ ๊ทธ์ PRNG์ ๋ค๋ฅธ ์ค๋ ๊ธฐ๊ฐ ๋์์ PRNG์ ๋ํด ๋๊ฐ์ ์ผ์ํ์ต๋๋ค.
์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ ๊ฑฐ์ง์ ๋๋ค. PCG ๋ด์์ ์ฝ๊ฒ ์ฐพ์ ์์๋ xoshiro256 ++์ ๊ฐ์ ์๊ด ๊ด๊ณ๊ฐ์๋ ํ ์์ ๊ฒน์น์ง ์๋ ์ํ์ค์ ์๋ฅผ ์์ง ๋ชปํฉ๋๋ค.
์ ์ฒด ์ํ๋ฅผ ๋น ๋ฅด๊ฒ ํผํฉํ๋ PRNG์๋์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. xoshiro256 ++์์ ๋ ๊ฐ์ ๋น ์ค์ฒฉ ์ํ์ค๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ ์ ๊ณต ํ ์ ์๋ค๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ ํ ์์ ์ ๊ฐ์ด ์๊ด ๊ด๊ณ๊ฐ ์์ต๋๋ค.
๊ทธ์ ์๊ด ํ๋ก๊ทธ๋จ์ ๊ดํด์๋ 2018 ๋ ์ ๊ทธ๊ฐ ๋ค์ํ ์ด์ (์ : ์ธ์์ ์๋ ๋ฑ)๋ก ์์ฑํ ํ๋ก๊ทธ๋จ์ ํฌํจํ๋ ๊ทธ์ ์น ์ฌ์ดํธ์ PCG์ ๋ํ ๋นํ์ ์ฌ๋ ธ์ ๋ ๋น์ทํ ํ๋ก๊ทธ๋จ์ด ๋ง์ด ํฌํจ ๋ ๋ต๋ณ ์ ์ผ์ต๋๋ค
corrsplitmix2.c
๋ฅผ ํฌํจํ์ฌ ์ค๋ซ๋์ ํ๋ฆฝ ๋ ๋ค๋ฅธ PRNG์ ๊ฒฝ์ฐ. ์ธ๋ฐ์ค์ฐฌ์ด ํ ์ ์๋ค๊ณ ๋งํ์ ๋ ๋ฌด์จ ๋ป์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ทธ์ ์๋ก์ด ํ ์คํธ ํ๋ก๊ทธ๋จ์ด ๊ทธ์ ํ ์คํธ ํ๋ก๊ทธ๋จ๊ณผ ์ค์ง์ ์ผ๋ก ๋ค๋ฅธ์ง ํ์ธํ๊ธฐ ์ํด ๊ทธ์ ํ ์คํธ ํ๋ก๊ทธ๋จ์ ๋ฉด๋ฐํ ์ดํด๋ณผ ๊ธฐํ๊ฐ ์์์ต๋๋ค. ๋ช ๋ ์ ์ ์ผ์ต๋๋ค.
์์ ์ธ์ฉ ๋ ํ๋ก๊ทธ๋จ์ _ ์คํธ๋ฆผ์ ์ ํํฉ๋๋ค _. ์ฐ๊ธฐ๋ ๋ถ๋ช ํ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ PCG์ ๋ฌธ์ ์๋ ์๋ฌด๋ฐ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ด๊ฐ ์ ๊ณต ํ ํ๋ก๊ทธ๋จ์ _user_๊ฐ ์คํธ๋ฆผ์ ์ ํํ๋๋ก ํ ๋ค์ ์๊ด ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ค์ ํ ๋ฒ @inmeme ์๊ฒ http : / ์ ๊ฐ์ ๋ค๋ฅธ ์์ฑ๊ธฐ์์ ์๊ด ์ํ์ค๋ฅผ ์ฐพ์ต๋๋ค
์ฌ์ฉ์๊ฐ ์คํธ๋ฆผ์ ์์๋ก ์ ํํ๊ฒํ๋ฉด ํจ์ฌ ๋ ๊ฐ๋ ฅํ ์๊ด ๊ด๊ณ๊ฐ ๋ํ๋ฉ๋๋ค.
์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ ๊ฑฐ์ง์ ๋๋ค. PCG ๋ด์์ ์ฝ๊ฒ ์ฐพ์ ์์๋ xoshiro256 ++์ ๊ฐ์ ์๊ด ๊ด๊ณ๊ฐ์๋ ํ ์์ ๊ฒน์น์ง ์๋ ์ํ์ค์ ์๋ฅผ ์์ง ๋ชปํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก ๊ณผ๊ฑฐ ์ด์ผ๊ธฐํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด๋ค PRNG์ ๋ํด์๋ ์๊ด ๊ด๊ณ๊ฐ์๊ณ ๊ฒน์น์ง ์๋ ์์ด์ ์๊ฐ ํด๋ผ ์ ์๋ค๊ณ ๋งํ์ง ์์๊ณ , ๋ด๊ฐ ์ด์ ์ ์์ฑํ ๋ค์ํ ์๊ด ๊ด๊ณ ํ๋ก๊ทธ๋จ์์ ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋ฆฌํ ์ ์๋๋ฅผ ์๊ฐ ํด๋ผ ์ ์๋ค๊ณ ๋งํ๊ณ Xoshiro **์ ๋ํ ๋์ ๋ฐ๋ณต ๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์ผ๋ก .
๋ํ ์ ์ฒด ์ํ๋ฅผ ํผํฉํ์ง ์์ PRNG๋ XorWow, ์์น ๋ ์ํผ์ ์์ฑ๊ธฐ ๋ฑ์ ํฌํจํ์ฌ ์ค๋ ์ญ์ฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. Sebastiano์ ์ฃผ์ฅ์ ๊ด์ ์ ๋ํ๋ด์ง ๋ง Marsaglia๊ฐ Weyl์ ์ถ๊ฐํ์ฌ XorWow์์ XorShift๋ฅผ _worse_ ๋ง๋ค์์ต๋๋ค. ์ ๋ง์ ์ ์ฌํ ์์ฑ๊ธฐ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก ๊ณผ๊ฑฐ ์ด์ผ๊ธฐํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด๋ค PRNG์ ๋ํด์๋ ์๊ด ๊ด๊ณ๊ฐ์๊ณ ๊ฒน์น์ง ์๋ ์์ด์ ์๊ฐ ํด๋ผ ์ ์๋ค๊ณ ๋งํ์ง ์์๊ณ , ๋ด๊ฐ ์ด์ ์ ์์ฑํ ๋ค์ํ ์๊ด ๊ด๊ณ ํ๋ก๊ทธ๋จ์์ ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋ฆฌํ ์ ์๋๋ฅผ ์๊ฐ ํด๋ผ ์ ์๋ค๊ณ ๋งํ๊ณ Xoshiro **์ ๋ํ ๋์ ๋ฐ๋ณต ๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์ผ๋ก .
๊ธฐ์ ์ ์ธ ์์ค์์ ํ ๋ก ์ ์ ์งํ์ญ์์ค. "๋ณ๋ฆฌํ ์ "์ ์ํ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์๊ธฐ ์๊ด์ ํ์ธํ๋ ๊ธฐ์ ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ ๊ฒน์น์ง ์๋ ์ํ์ค (ํ ์คํธ ๊ธฐ๊ฐ ๋์ ๊ฒน์น์ง ์์-์ถฉ๋ถํ ๋ฉ๋ฆฌ ๊ฐ๋ฉด ๋ถ๊ฐํผํ๊ฒ ๊ฒน์น ์ ์์)๋ฅผ ์์ฑํ๋ ๋ ๊ฐ์ ์๋๋ฅผ ์ฐพ์์ ์ธํฐ๋ฆฌ๋ธํ๊ณ ๋ฐฐํฐ๋ฆฌ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ํ ์คํธ
๊ฒน์น๋ ๋ ๊ฐ์ ์ํ์ค๋ฅผ ๊ณ ๋ คํ๋ฉด ์ํ์ค๊ฐ โโ๊ฒน์น ํ ๋์ผํ ์ถ๋ ฅ์ด ๋ ๋ฒ ๋ฐ์ํ๊ณ ํฉ๋ฆฌ์ ์ธ ํ ์คํธ๊ฐ์ด๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ฑ๊ธฐ, ์ฌ์ง์ด ์ํธํ ๋ ์์ฑ๊ธฐ์ ๋ํด ์๊ด ๊ด๊ณ๊ฐ ์์ต๋๋ค.
์ค์ฒฉ ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ "๋ณ๋ฆฌ ์ ์๋ฉ"์ ๋ชจ๋ ์์ฑ์์๊ฒ ์ฌ์ํ ์์ ์ ๋๋ค ( "๋ณ๋ฆฌ ์ "์ด ์๋ฏธํ๋ ๊ฒ์ด ๋ฌด์์ด๋ ๊ฐ์).
๋ค์ ํ ๋ฒ, ๋ค๋ฅธ ์์ฑ๊ธฐ์์ PCG (์ํ์ค๊ฐ ๊ฒน์น์ง ์๋ ๊ฒฝ์ฐ)์ ์ ์ฌํ ์๊ด ๊ด๊ณ๋ฅผ ๋ฐ๊ฒฌํ๋ค๊ณ ์ฃผ์ฅํ๋ฏ๋ก xoshiro256 ++ ๋๋ SFC64์ ๊ฐ์ ์๊ด ๊ด๊ณ๊ฐ์๋ ํ ์์ ๊ฒน์น์ง ์๋ ์ํ์ค๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ?
์๊ธฐ ์๊ด์ ํ์ธํ๋ ๊ธฐ์ ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ ๊ฒน์น์ง ์๋ ์ํ์ค (ํ ์คํธ ๊ธฐ๊ฐ ๋์ ๊ฒน์น์ง ์์-์ถฉ๋ถํ ๋ฉ๋ฆฌ ๊ฐ๋ฉด ๋ถ๊ฐํผํ๊ฒ ๊ฒน์น ์ ์์)๋ฅผ ์์ฑํ๋ ๋ ๊ฐ์ ์๋๋ฅผ ์ฐพ์์ ์ธํฐ๋ฆฌ๋ธํ๊ณ ๋ฐฐํฐ๋ฆฌ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ํ ์คํธ
์ด ์๊ด ๊ด๊ณ ์ ์์ ๋ํ ๋ฌธํ์ ์ง์ ํ์ฌ ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด "๊ธฐ์ ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ"์ํ๋ฅผ ์ ์งํ๋๋ก ํ ์ ์์ต๋๊น?
Sebastiano, ๋น์ ์ ๋ด๊ฐ ๋น์ ์ ์กฐ๊ฑด์ ์ค์ ๋ ๋์ ์ ๋๋ตํ๊ธฐ๋ฅผ ๊ณ์ ์ํฉ๋๋ค. ๋น์ ์ด ์ง์ ํ๋ ๊ฒ์ ์๊ธฐ ์ ์ฌ์ฑ์ด์๋ LCG์ ๋ณธ์ง์ ์ธ ์์ฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ํผ๋์ค๋ฌ์ด PRNG ๋๋ LFSR ๊ธฐ๋ฐ์ ๊ฒฝ์ฐ ๋์ผํ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ค๋ฅธ PRNG์๋ ๋ค๋ฅธ ์ฝ์ ์ด ์์ต๋๋ค.
LFSR์๋ ์ ๋ก ๋๋, ๋ถ๋ ์ํ, ํด๋ฐ ๊ฐ์ค์น ๋ฌธ์ , ์ ํ์ฑ์ด ์์ผ๋ฉฐ xoshiro์ ๋ํ ์๋์์ ๋ฐฐ์ ๋ฏ์ด ๋ฐ๋ณต๋๋ ์ด์ํ ๋ฌธ์ ์ ๊ฐ์ ๋ค๋ฅธ ๊ธฐ์ดํจ๋ ์์ต๋๋ค.
ํผ๋์ PRNG๋ ์งง์์ฃผ๊ธฐ (์นด์ดํฐ๊ฐ์๋ ๊ฒฝ์ฐ-Weyl ์ํ์ค FTW!)์ ๊ณ ์ ํ ํธํฅ์ ์ํ์ด ์์ต๋๋ค.
๋ด๊ฐ ์ด ๊ฒ์ฒ๋ผ ์ํ์ค๊ฐ โโ๊ฒน์น๋ฉด ํ ์คํธ๋ _ ํญ์ _ ์คํจํฉ๋๋ค. _ ํญ์ ์คํจํ๋ ํ ์คํธ๊ฐ ํ ์คํธ๊ฐ ์๋์ ์ดํดํ๊ธฐ ์ํด ๋ฌธํ์ด ํ์ํ์ง ์์ต๋๋ค.
๋ค์ ํ ๋ฒ, ๋ค๋ฅธ ์์ฑ๊ธฐ์์ PCG (์ํ์ค๊ฐ ๊ฒน์น์ง ์๋ ๊ฒฝ์ฐ)์ ์ ์ฌํ ์๊ด ๊ด๊ณ๋ฅผ ๋ฐ๊ฒฌํ๋ค๊ณ ์ฃผ์ฅํ๋ฏ๋ก xoshiro256 ++ ๋๋ SFC64์ ๊ฐ์ ์๊ด ๊ด๊ณ๊ฐ์๋ ํ ์์ ๊ฒน์น์ง ์๋ ์ํ์ค๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ?
๋น์ ์ ์ ๋ง๋ก ์ง๋ฌธ์ ํผํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทํ์ ์ฃผ์ฅ์ ๋ฐ๋ผ ๊ทธ๋ฌํ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋งค์ฐ ์ฌ์ธ ๊ฒ์ ๋๋ค.
์ง๊ธ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ "์ ๋ ดํ ์น์"์ ๋ ๊ฐ๋ ฅํ
DXSM
์ถ๋ ฅ ๊ธฐ๋ฅ์ ๊ฐ์ง PCG64์ ๋ณํ ์ธPCG64DXSM
BitGenerator
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๊ฒ์ด ํ์ฌPCG64
๊ตฌํ์์๋ XSL-RR ์ถ๋ ฅ ํจ์์์ ํ ๋จ๊ณ ์ฌ๋ผ๊ฐ ๊ฒ์ผ๋ก, ๋ฐํ์ ์ฑ๋ฅ์ ์์์์ฃผ์ง ์๊ณ ํต๊ณ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ๋ค๋ ๋ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ๋BitGenerator
๋ํดPCG64
์ ๊ณตํ๋ ํ์ ์์ฅ์์์ ๊ฐ๋จํ ์ ๊ทธ๋ ์ด๋์ ๋๋ค.PCG64
์ ํจ๊ป ์ถ๊ฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
64 ๋นํธ "์ ๋ ดํ ์น์"์๋ ์ ์ฆ ๊ฐ๋ฅํ ๊ฒฐํจ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ค๋ซ๋์ ์๋ ค์ ธ ์์ต๋๋ค.
W. Hรถrmann ๋ฐ G. Derflinger, ํด๋์ฉ ๋์ ์์ฑ๊ธฐ
๊ฑฐ๋ถ ๋ฐฉ๋ฒ, ACM Trans. ์ํ. Softw. 19 (1993), no. 4, 489โ495.
์ผ๋ฐ์ ์ผ๋ก ๊ณ์์ ์ ๊ณฑ๊ทผ๋ณด๋ค ์์ ์น์๋ ์คํํธ๋ผ ์ ์ fโ์ ๋ํ ๊ณ ์ ํ ํ๊ณ๋ฅผ ๊ฐ์ต๋๋ค.
์ด ํ๊ณ๋ 65 ๋นํธ ์น์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ทน๋ณต ํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ถ๊ฐ "์ถ๊ฐ"์์ ์ผ๋ก ๋ง ๋ณํ ํ ์ ์์ผ๋ฉฐ ์์ฑ๊ธฐ ์๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ ์๋ ์์ต๋๋ค.
Guy Steele๊ณผ ์ ๋์ด ๋ฌธ์ ์ ๋ํด ์ฝ๊ฐ ์์ ํ๊ณ ๋ค์ํ ํฌ๊ธฐ์ ์ ๋ ดํ ์น์์ ๋ํ ์คํํธ๋ผ ์ ์ ํ๋ฅผ ๊ฒ์ํ์ต๋๋ค : https://arxiv.org/pdf/2001.05304.pdf . ํด์๋ก ๋ ์ข์ง๋ง 64 ๋นํธ์์ 65 ๋นํธ (์ํ๊ฐ 128 ๋นํธ ์ธ LCG์ ๊ฒฝ์ฐ)์์ ์ ์ฆ ๊ฐ๋ฅํ ๊ฐ๊ฒฉ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ ผ๋ฌธ์ ํ 7์์ fโ ์ ์๊ฐ 0.9919 ์ธ 0x1d605bbb58c8abbfd๋ฅผ ์ป์ต๋๋ค. 64 ๋นํธ ์น์๋ 0.9306 (๋ ผ๋ฌธ์ ์ ๋ฆฌ 4.1)์ ์ด๊ณผ ํ ์ ์์ต๋๋ค.
ํผํฉ๊ณผ ๋ชจ๋ ์์ ํ์ fโ ์ ์์ ๊ฐ์ ์ ํต๊ณ์ ๊ด์ ์์ ์ ํ ๋์ ๋์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ถ๊ฐ ์์ ๋ง์ผ๋ก ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ ์ฐจ์์ ๋ํด ์ป์ ์์๋ ํฐ ๊ฐ์ ์ ๊ณ ๋ คํ ๋ ๋ ธ๋ ฅํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค (๊ธ์, ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๊ฑฐ๋ ๋ฌธ์๋ฅผ ์์ฑํ์ง ์์์ ๊ฒ์ ๋๋ค).
Sebastiano, ๋น์ ์ ๋ด๊ฐ ๋น์ ์ ์กฐ๊ฑด์ ์ค์ ๋ ๋์ ์ ๋๋ตํ๊ธฐ๋ฅผ ๊ณ์ ์ํฉ๋๋ค. ๋น์ ์ด ์ง์ ํ๋ ๊ฒ์ ์๊ธฐ ์ ์ฌ์ฑ์ด์๋ LCG์ ๋ณธ์ง์ ์ธ ์์ฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ํผ๋์ค๋ฌ์ด PRNG ๋๋ LFSR ๊ธฐ๋ฐ์ ๊ฒฝ์ฐ ๋์ผํ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์, ๊ฑฐ๊ธฐ์ ๋์ฐฉํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค!
LFSR์๋ ์ ๋ก ๋๋, ๋ถ๋ ์ํ, ํด๋ฐ ๊ฐ์ค์น ๋ฌธ์ , ์ ํ์ฑ์ด ์์ผ๋ฉฐ xoshiro์ ๋ํ ์๋์์ ๋ฐฐ์ ๋ฏ์ด ๋ฐ๋ณต๋๋ ์ด์ํ ๋ฌธ์ ์ ๊ฐ์ ๋ค๋ฅธ ๊ธฐ์ดํจ๋ ์์ต๋๋ค.
๋๋ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ด ๊ทธ๋ค์ ๋ค์์ด ์ผํ๋ ์ด์ ์ ๋๋ค. LFSR๊ณผ Fโ- ์ ํ ์์ฑ๊ธฐ๋ ์๋ก ๋ค๋ฆ ๋๋ค. ๊ด๋ จ์ด ์์ง๋ง ๋ค๋ฆ ๋๋ค.
"๋ฐ๋ณต์ด์๋ ์ด์ํ ๋ฌธ์ "๋ ํ์์ ๊ฐ์ด ๋ด๊ฐ ์ธ๊ธ ํ ์์๋ ๋น ๊ธฐ์ ์ ์ธ ์ฉ์ด์ ๋๋ค.
ํผ๋์ PRNG๋ ์งง์์ฃผ๊ธฐ (์นด์ดํฐ๊ฐ์๋ ๊ฒฝ์ฐ-Weyl ์ํ์ค FTW!)์ ๊ณ ์ ํ ํธํฅ์ ์ํ์ด ์์ต๋๋ค.
[์ ๋ฐ์ดํธ : ๊ดํธ ์์ ์นด์ดํฐ ๊ด์ฐฐ์ ๋์ณ์ ์ฝ๋ฉํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์์ต๋๋ค.]
์, SFC64์๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก (์นด์ดํฐ ์ฌ์ฉ) ์ ์ฒด ๋ฒ์ฃผ๋ก ์ผ๋ฐํํ์ง ์์ต๋๋ค. ์ ์ฆ ๊ฐ๋ฅํ๊ณ ๊ฐ์ฅ ์งง์์ฃผ๊ธฐ ๊ธธ์ด๋ฅผ ๊ฐ์ง ์ ์คํ๊ฒ ์ค๊ณ๋ ํผ๋ ๋ฐ์๊ธฐ๊ฐ ์์ต๋๋ค.
"๋ฐ๋ณต์ด์๋ ์ด์ํ ๋ฌธ์ "๋ ํ์์ ๊ฐ์ด ๋ด๊ฐ ์ธ๊ธ ํ ์์๋ ๋น ๊ธฐ์ ์ ์ธ ์ฉ์ด์ ๋๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅธ ์ ๋ฌธ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๊ธ์ ๋ฌ ์์๋ ๊ฒ์ด ์ด์ํด ๋ณด์ ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ ์คํ ํ ๋ค์ ์ ์ ํ ์ ๋ฌธ ์ฉ์ด๋ก ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๊ณ ์ ์ ํ ํด์ค์ ์ ๊ณตํ์ญ์์ค. ๋๋ ๋น์ ๊ณผ David Blackman์ด ๊ทธ ๋ฌธ์ ์ ๋ํด ๊ทธ์ ํต์ ํ๊ธฐ ๋๋ฌธ์ ์ฒ์ ๋ฐํ ์ก์ ๋ ๊ทธ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ์ ๊ฒ์ด๋ผ๊ณ ์์ํ์ ๊ฒ์ ๋๋ค.
numpy
์๋ PRNG์ ๋ํ ํ ๋ก ์ ์ฃผ์ ์์ ๋ฒ์ด๋ฉ๋๋ค. ํ ๋ก ์ ๊ณ์ํ๋ ค๋ฉด ์์ ์ ํฌ๋ผ์ ์ฌ์ฉํ์ญ์์ค. ๊ฐ์ฌํฉ๋๋ค.
@rkern- ๊ธฐ์ค์ผ๋ก ์ฝ๊ฐ ์๊ฒฉํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๊ตฌํ์์ ๊ณต์ ํ์ง ์๋ Numpy ํํ์ ๊ฒฐํจ์ด์๋ ๊ฒฝ์ฐ ๋ ผ์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
์ ๊ฐ ์ธ๊ธํ๋ ๊ฑฐ๋์๊ฐ์ด ๋ฌธ์ ์์ ์ฐ๋ฆฌ ์์ ๋์ธ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ด๋์ง ์์์ ํ์ธํ ์ ์์ต๋๋ค. ์งํ๋ ๋๊น์ง ์ง์คํ ์์๋ ๋ํ๊ฐ ํ์ํฉ๋๋ค.
๋ ๋์ ๋งฅ๋ฝ์ ์ดํดํ๋ ๊ฒ์ด ๋์์ด๋๋ค๊ณ ์๊ฐํฉ๋๋ค. Sebastiano๋ PCG์ ๋ํด ์ฝ๊ฐ์ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๋ ๋์ ์ด์ ๋ํด ๋๊ด์ ์ ๊ธฐ ํด ์์ต๋๋ค. ์์ฆ ์ด๋ค ์ฌ๋๋ค์ ์ฐ๋ฆฌ ๋ ๋ค๋ณด๊ณ ๋์ ๊ตด๋ฆฌ๋ฉฐ "๋ํฌ ๋ ๋ค ์๋ก ๋์๋ค"๋ผ๊ณ ๋งํ ์ง๋ ๋ชจ๋ฅธ๋ค๊ณ ์๊ฐํ๋ค. ๋๋ ๊ทธ์ PRNG์ ๋ํด ๋นํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ ๊ทธ์ ๋ฌผ๊ฑด์ ๋ํด ๋งํ์ง ์๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ์จ๊ธฐ๋ ค๊ณ ํ๋ค (์ค์ ๋ก ๋๋ ์๊ฐ / ์ฑํฅ์ด ์์์ ๋ โ ์ฌ์ค, ๋๋ ๊ทธ๋ค์ด ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ ๋ฟ์ด์๋ค).
๊ทธ์ ๋นํ์ ์ ์ฉํ๊ณ , ๊ทธ์ ์ธ์์ ๋ง์ ๋ถ๋ถ์ ๋ด ์ํ์ ๋ํด ์๊ฐํ๋ ๋ฐ ๋ณด๋ด๋๋ก ์ ํ๋์ด ๊ธฐ์ฉ๋๋ค.ํ์ง๋ง ๊ทธ์ ํ ์คํธ๊ฐ ๋ณธ์ง์ ์ผ๋ก ์ ๋์ ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ซ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ PCG์ ๊ตฌ์กฐ์ ๋ํ ์ง์์ ์ฌ์ฉํ์ฌ RNG ํ ์คํฐ ๋ฐ ์คํจ ํ ์คํธ์ ์ ๊ณต ํ ์์๋ ๋ฐฐ์ด์ ๊ตฌ์ฑํฉ๋๋ค.
๊ทธ๊ฒ์ด ์ผ๋ง๋ ๋ฌด์ญ๊ฒ ๋ณด์ผ ์ ์๋์ง๋ฅผ ๊ฐ์ํ ๋, ์ ์ฌํ ์ ๋์ ์ ๊ทผ ๋ฐฉ์์ด ์๋ง์ ๋ค๋ฅธ ์์ฑ์๋ค์ ๋์ด ๋จ๋ฆด ๊ฒ์ด๋ฉฐ ๊ทธ๊ฐ PCG์ ๋ํด ์ ๊ธฐํ๋ ๋ง์ ์ฐ๋ ค๊ฐ ์์ฑ ๊ณํ์ ๋ํด ๊ด์ฐฐ ํ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ์ธ๋ ๊ณํ์๋ ์ ์ฉ๋ ๊ฒ์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค. XorWow์ ๊ฐ๊ณ , ์๋์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ SplitMix๋ฅผ ์์ ๋ก ์์ฃผ ์ฌ์ฉํฉ๋๋ค. (์ฐ๋ฆฌ ์ค ๋๊ตฌ๋ ํนํ SplitMix์ ์ด๋ค ์ ์ผ๋ก๋ ํฌ์ํ์ง ์์ต๋๋ค.)
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๋ SplitMix์ ๋ํด ๋งค์ฐ ๋ฌด์์ ํ ์ ์์ผ๋ฉฐ ๊ธฐ๋ณธ ์คํธ๋ฆผ ์์๋ฅผ ์ฌ์ฉํ์ฌ 35185 ๋ฒ์งธ ์ถ๋ ฅ์ ๋ณผ ๋๋ง๋ค PRNG ํ
์คํธ ์ค์ํธ์์ ์คํจ ํจ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ฐ! ์ด๋ ๋ด๋ถ์ ์ผ๋ก ์นด์ดํฐ (Weyl ์ํ์ค!)๋ฅผ 0x9e3779b97f4a7c15
(ฯ, ํฉ๊ธ ๋น์จ ๊ธฐ์ค)๋งํผ ์ฆ๊ฐ ์ํค์ง๋ง 35185 * 0x9e3779b97f4a7c15
= 0x86a100000c480245
. 14 ๋นํธ ์ธํธ์ ์ค๊ฐ์ ์๋ฌด๊ฒ๋์๋ ํฐ ์ค์ ์ค. ๋๋ ๋ชจ๋ 360998717 ๋ฒ์งธ ์ถ๋ ฅ์ ์ดํด๋ณด๋ฉด 0x48620000800401
์ ๋ด๋ถ ์ํ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ด๋ 8 ๋นํธ ๋ง ์ถ๊ฐ๋๊ณ ์ถ๋ ฅ ํจ์๊ฐ ์์ ํ ๋ง์คํนํ๊ธฐ ์ด๋ ค์ด ๊ฒ์
๋๋ค. .
์ฐ๋ฆฌ๋ ๊ณ์ํด์ SplitMix์ ๋ํด ๊ฒ์์ด๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ํ๋๋ ๊ฐ์ฐ ์์ 0x9e3779b97f4a7c15
์๊ณ ๋ค๋ฅธ ํ๋๋ 0xdaa66d2c7ddf743f
๊ฐ์๋ ์คํธ๋ฆผ์ด ๋ ๊ฐ ์์ผ๋ฉด ์ด๋จ๊น์? PRNG ํ
์คํธ ์ค์ํธ !!! ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ ๋ฒ์งธ ๊ฒ์ด ๋ค๋ฅธ ๊ฒ์ 3 ๋ฐฐ์ ๋ถ๊ณผํ๋๋ก ๊ณ ์ ๋์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, ๋๊ตฐ๊ฐ๊ฐ "๋ด๊ฐ ๋ ์คํธ๋ฆผ์ ๋ชจ๋ ์ ๊ณต ํ ๊ฒ์
๋๋ค. ๋ฌด์์ด ์ผ์ํ์ธ์!"๋ผ๊ณ ๋งํ๋ฉด ฯ ( 0x243f6a8885a308d3
) ๋ฐ _e_ ( 0xb7e151628aed2a6b
)๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ), ์ฐ๋ฆฌ๋ ํ์คํ ๋ ๊ฒ์์ด๋ฅผ ์ผ์ผํค๊ณ Pi ์คํธ๋ฆผ์์ ๋ชจ๋ 6561221343 ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ์ ธ์ E ์คํธ๋ฆผ๊ณผ ๋ก์ฐ ์ค ๋ฒจ ํ๋์ ๋ชจ๋ 6663276199 ๋ฒ์งธ ํญ๋ชฉ๊ณผ ํผํฉํ์ฌ ๋ ๊ฐ์ ๋์ผํ ํญ๋ชฉ์ ์์ฑํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์ํ์ค. ๊ทธ๋ฆฌ๊ณ _worse_, ๋๋ ๊ณ์ํด์ ์คํธ๋ฆผ a์ ๋ชจ๋ ์ ํ์ ๋ํด ๋์ผํ ์ถ๋ ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ์คํธ๋ฆผ b์ ์ผ์นํ๋ ์ ํ๊ฐ ์์์ ๋ณด์ฌ์ค๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก ์๊ด ๊ด๊ณ๊ฐ์๋ 2 ^ 64 ๋ฐฉ์์ด ์์ต๋๋ค !!! (๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ์คํธ๋ฆผ์ ๋ํด ์ด๊ฒ์ ํ ์ ์์ต๋๋ค. ฯ์ _e_์๋ ํน๋ณํ ๊ฒ์ด ์์์ต๋๋ค.)
PCG๋ก ๋์๊ฐ์ Sebastiano์ ํ ์คํธ๋ ๋ ๊ฐ์ PCG64 XSH RR ์์ฑ๊ธฐ๊ฐ ์ ํํ๊ฒ ์ ๋ ฌ๋์ด ์ผ์นํ๋ ์ถ๋ ฅ์ด ์ธํฐ๋ฆฌ๋ธ๋๋๋กํ๋ ๋ฐ ์์กดํฉ๋๋ค. PRNG ์ค ํ๋๋ฅผ ์กฐ๊ธ๋ง ์ ์ง์์ผ ์๋ฒฝํ ์ ๋ ฌ์ ์กฐ๊ธ๋ง ๊นจ ๋จ๋ฆฌ๋ฉด ์์ฌ์ค๋ฌ์ด ๊ฒ์ ๊ฐ์งํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ค์์ง๋๋ค.
๋ค๋ฅธ ๋ฐฉํฅ์์ ๋น์ทํ ์ ๋์ ํ ์คํธ (Sebastiano์๊ฒ ๋ถ๋ด์ ์ค)๋ ์๊ด ๊ด๊ณ๊ฐ ์๋ค๋ ๊ทธ์ ์ฃผ์ฅ์ ์ถฉ์กฑ์ํค๋ PCG64 XSH RR์ ์ถ๋ ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด์ง๋ง ์ฐ๋ฆฌ๋ ์ ํํ ์ด๋ป๊ฒ ์ ๋ ฌ๋์ด ์๋์ง ์๋ ค์ฃผ์ง ์์ต๋๋ค (๊ทธ๋ฅ ์ค๋ฅธ์ชฝ ์ผ๋ฐ ์ด์). ๊ทธ์ ์๋ฌด๋ ์๋ก ์ฐ๊ด๋์ด ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ๋ ฌ์ ์ฐพ๋ ๊ฒ์ ๋๋ค.
์ ๋ฐ์ ์ผ๋ก ๊ธด๊ธํ ํ์ฌ๋ฅผ ์ง์ํ๋ ๊ฒ์ด ์ค์ ๋ก ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ง๋ง, ๋ฐ๋ฉด์ DXSM ๋ฒ์ ์ ์๋ ์ ์ด๋ฌํ ์ข ๋ฅ์ ๋ฌธ์ ๋ฅผ ์ ํํ๊ฒ ์ํํ๊ธฐ ์ํด ์์ฑ ๋์๊ธฐ ๋๋ฌธ์ ๋ ๋ซ์ต๋๋ค. ์ ํ ํด ์ฃผ์ ์ ๊ธฐ์ฉ๋๋ค.
์ถ์ :์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ข์ํ๋ ์ค์๋ก ๋งค์ง Weyl ๊ฐ์ฐ ์์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
WeylConst[r_,bits_] = BitOr[Floor[(r-Floor[r])*2^bits],1]
๊ทธ๊ฒ์ด Mathematica์ ๋๋ค. ์ ๋ ์ฐ์ต์ผ๋ก Python ๋ฒ์ ์ ๋จ๊ฒจ ๋๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ์ฆ๋ถ์ ๋ํด ๋ฎ์ ๋นํธ ์ถฉ๋์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PCG64 XSL-RR ๋ฐ ํ์ 58 ๋นํธ ์ถฉ๋ ๊ฒฐ๊ณผ
โฏ ./pcg64_correlations.py -m 58 | stdbuf -oL ./RNG_test stdin64 -tf 2 -te 1 -tlmaxonly -multithreaded
s0 = 0b01110010100110011101000110010010101111111001100011001011001011111001001110101010011101111101001101011000011100001111111111100001
s1 = 0b10110001011001100111100010000110101110011010101010011011010100011001011111001100010001101001001011010010110101001011101111111100
dist = 0x2eb6ec432b0ea0f4fc00000000000000
[
{
"bit_generator": "PCG64",
"state": {
"state": 152330663589051481538402839025803132897,
"inc": 228410650821285501905570422998802152525
},
"has_uint32": 0,
"uinteger": 0
},
{
"bit_generator": "PCG64",
"state": {
"state": 235805414096687854712168706130903874556,
"inc": 70910205337619270663569052684874994465
},
"has_uint32": 0,
"uinteger": 0
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin64, seed = 0x12d551b8
test set = expanded, folding = extra
rng=RNG_stdin64, seed=0x12d551b8
length= 128 megabytes (2^27 bytes), time= 2.8 seconds
no anomalies in 891 test result(s)
rng=RNG_stdin64, seed=0x12d551b8
length= 256 megabytes (2^28 bytes), time= 9.4 seconds
no anomalies in 938 test result(s)
rng=RNG_stdin64, seed=0x12d551b8
length= 512 megabytes (2^29 bytes), time= 18.1 seconds
no anomalies in 985 test result(s)
rng=RNG_stdin64, seed=0x12d551b8
length= 1 gigabyte (2^30 bytes), time= 31.2 seconds
Test Name Raw Processed Evaluation
[Low1/8]FPF-14+6/16:cross R= +4.9 p = 1.7e-4 unusual
[Low4/16]FPF-14+6/16:all R= +8.4 p = 2.3e-7 very suspicious
[Low4/16]FPF-14+6/16:all2 R= +8.3 p = 8.1e-5 unusual
[Low8/32]FPF-14+6/32:all R= +6.3 p = 2.1e-5 mildly suspicious
[Low8/32]FPF-14+6/16:all R= +5.7 p = 8.0e-5 unusual
...and 1034 test result(s) without anomalies
rng=RNG_stdin64, seed=0x12d551b8
length= 2 gigabytes (2^31 bytes), time= 52.7 seconds
Test Name Raw Processed Evaluation
[Low4/16]FPF-14+6/32:all R= +7.4 p = 2.0e-6 suspicious
[Low4/16]FPF-14+6/16:(0,14-0) R= +7.7 p = 9.4e-7 unusual
[Low4/16]FPF-14+6/16:all R= +8.0 p = 5.9e-7 suspicious
[Low4/16]FPF-14+6/16:all2 R= +12.2 p = 2.1e-6 mildly suspicious
[Low4/16]FPF-14+6/4:(0,14-0) R= +7.9 p = 6.3e-7 mildly suspicious
[Low4/16]FPF-14+6/4:all R= +5.8 p = 6.7e-5 unusual
[Low4/16]FPF-14+6/4:all2 R= +11.5 p = 3.1e-6 mildly suspicious
[Low8/32]FPF-14+6/32:(0,14-0) R= +7.8 p = 8.4e-7 unusual
[Low8/32]FPF-14+6/32:all R= +7.3 p = 2.3e-6 suspicious
[Low8/32]FPF-14+6/32:all2 R= +14.3 p = 3.8e-7 suspicious
[Low8/32]FPF-14+6/16:(0,14-0) R= +7.7 p = 8.8e-7 unusual
[Low8/32]FPF-14+6/16:(1,14-0) R= +7.7 p = 9.3e-7 unusual
[Low8/32]FPF-14+6/16:all R= +6.9 p = 5.3e-6 mildly suspicious
[Low8/32]FPF-14+6/16:all2 R= +18.3 p = 8.0e-9 very suspicious
...and 1078 test result(s) without anomalies
rng=RNG_stdin64, seed=0x12d551b8
length= 4 gigabytes (2^32 bytes), time= 90.2 seconds
Test Name Raw Processed Evaluation
[Low1/8]BCFN_FF(2+0):freq R= +14.8 p~= 6e-18 FAIL !
[Low1/8]BCFN_FF(2+1):freq R= +7.4 p~= 1e-6 mildly suspicious
[Low1/8]FPF-14+6/16:cross R= +8.4 p = 2.1e-7 very suspicious
[Low4/16]FPF-14+6/32:(0,14-0) R= +8.9 p = 8.1e-8 mildly suspicious
[Low4/16]FPF-14+6/32:(1,14-0) R= +8.5 p = 1.9e-7 mildly suspicious
[Low4/16]FPF-14+6/32:all R= +9.4 p = 2.4e-8 very suspicious
[Low4/16]FPF-14+6/32:all2 R= +23.9 p = 5.2e-11 VERY SUSPICIOUS
[Low4/16]FPF-14+6/16:(0,14-0) R= +13.8 p = 2.2e-12 VERY SUSPICIOUS
[Low4/16]FPF-14+6/16:(1,14-0) R= +10.0 p = 7.3e-9 suspicious
[Low4/16]FPF-14+6/16:all R= +12.1 p = 8.0e-11 VERY SUSPICIOUS
[Low4/16]FPF-14+6/16:all2 R= +52.5 p = 1.3e-22 FAIL !!
[Low4/16]FPF-14+6/4:(0,14-0) R= +12.2 p = 7.0e-11 VERY SUSPICIOUS
[Low4/16]FPF-14+6/4:all R= +7.1 p = 3.7e-6 mildly suspicious
[Low4/16]FPF-14+6/4:all2 R= +29.8 p = 7.1e-14 FAIL
[Low4/16]FPF-14+6/4:cross R= +5.3 p = 7.8e-5 unusual
[Low4/32]FPF-14+6/32:(0,14-0) R= +7.6 p = 1.3e-6 unusual
[Low4/32]FPF-14+6/32:all R= +6.0 p = 4.4e-5 unusual
[Low4/32]FPF-14+6/32:all2 R= +9.4 p = 2.9e-5 unusual
[Low4/32]FPF-14+6/16:(0,14-0) R= +7.3 p = 2.5e-6 unusual
[Low4/32]FPF-14+6/16:all R= +6.5 p = 1.4e-5 mildly suspicious
[Low4/32]FPF-14+6/16:all2 R= +8.2 p = 8.0e-5 unusual
[Low8/32]FPF-14+6/32:(0,14-0) R= +17.2 p = 1.7e-15 FAIL
[Low8/32]FPF-14+6/32:(1,14-0) R= +12.7 p = 2.3e-11 VERY SUSPICIOUS
[Low8/32]FPF-14+6/32:all R= +15.3 p = 7.9e-14 FAIL
[Low8/32]FPF-14+6/32:all2 R= +86.1 p = 1.2e-35 FAIL !!!
[Low8/32]FPF-14+6/16:(0,14-0) R= +16.8 p = 3.5e-15 FAIL
[Low8/32]FPF-14+6/16:(1,14-0) R= +12.2 p = 6.6e-11 VERY SUSPICIOUS
[Low8/32]FPF-14+6/16:all R= +13.1 p = 8.9e-12 VERY SUSPICIOUS
[Low8/32]FPF-14+6/16:all2 R= +82.1 p = 1.7e-34 FAIL !!!
[Low8/32]FPF-14+6/4:(0,14-0) R= +12.8 p = 2.0e-11 VERY SUSPICIOUS
[Low8/32]FPF-14+6/4:(1,14-0) R= +9.4 p = 2.5e-8 suspicious
[Low8/32]FPF-14+6/4:all R= +10.5 p = 2.2e-9 VERY SUSPICIOUS
[Low8/32]FPF-14+6/4:all2 R= +42.0 p = 5.8e-19 FAIL !
...and 1118 test result(s) without anomalies
PCG64 DXSM ๋ฐ ๋ ๋ฎ์ 64 ๋นํธ ์ถฉ๋์ ๊ฒฐ๊ณผ (๋ฌธ์ ๊ฐ ๋ ๋นจ๋ฆฌ ๋ฐ์ํ์ง๋ง ์๋ฌด๊ฒ๋ ๋ณด์ง ๋ชปํจ)
โฏ ./pcg64_correlations.py -m 64 --dxsm | stdbuf -oL ./RNG_test stdin64 -tf 2 -te 1 -tlmaxonly -multithreaded
s0 = 0b10001000010110111101010101010101111100100011011111011111011111001011110101111100101101101100110101110001101101111111010101111111
s1 = 0b11000101110100011001011000001110100001001111001001100101010000101100011001010111011001100000010010011100101110001110101000011100
dist = 0x3a26b19c91e6da1d0000000000000000
[
{
"bit_generator": "PCG64DXSM",
"state": {
"state": 181251833403477538233003277050491434367,
"inc": 46073632738916603716779705377640239269
},
"has_uint32": 0,
"uinteger": 0
},
{
"bit_generator": "PCG64DXSM",
"state": {
"state": 262946148724842088422233355148768897564,
"inc": 125105549038853892415237434774494719583
},
"has_uint32": 0,
"uinteger": 0
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin64, seed = 0x85cea9
test set = expanded, folding = extra
rng=RNG_stdin64, seed=0x85cea9
length= 128 megabytes (2^27 bytes), time= 2.6 seconds
no anomalies in 891 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 256 megabytes (2^28 bytes), time= 9.4 seconds
no anomalies in 938 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 512 megabytes (2^29 bytes), time= 18.5 seconds
no anomalies in 985 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 1 gigabyte (2^30 bytes), time= 32.3 seconds
Test Name Raw Processed Evaluation
[Low4/32]BCFN_FF(2+3,13-3,T) R= -8.3 p =1-9.5e-5 unusual
...and 1035 test result(s) without anomalies
rng=RNG_stdin64, seed=0x85cea9
length= 2 gigabytes (2^31 bytes), time= 55.8 seconds
no anomalies in 1092 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 4 gigabytes (2^32 bytes), time= 93.1 seconds
no anomalies in 1154 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 8 gigabytes (2^33 bytes), time= 175 seconds
no anomalies in 1222 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 16 gigabytes (2^34 bytes), time= 326 seconds
no anomalies in 1302 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 32 gigabytes (2^35 bytes), time= 594 seconds
no anomalies in 1359 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 64 gigabytes (2^36 bytes), time= 1194 seconds
no anomalies in 1434 test result(s)
rng=RNG_stdin64, seed=0x85cea9
length= 128 gigabytes (2^37 bytes), time= 2334 seconds
no anomalies in 1506 test result(s)
...
@rkern , ์ฝ๋๋ฅผ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์๋ฒฝํ๊ฒ ์ ๋ ฌ๋์ง ์์ ํ ์คํฐ์ ์ธํฐ๋ฆฌ๋ธ ์ถ๋ ฅ์ ๊ณต๊ธํ๊ธฐ ์ํด ์คํ๋ฅผ ์ถ๊ฐํ๋ ์ต์ ์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์กฐ๊ธ ํ๊ตฌ ํ ๊ฒ์ ๋๋ค.
๋ค, ์ต์ข
return
์ ์ ๋ค์ํ N
๋ํด bg0.advance(N)
๋ฅผ ์ฝ์
ํ์ฌ ๋น๊ณต์์ ์ผ๋ก ์ํํ์ต๋๋ค. ๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณผ ์ ์๋๋ก ๋ฎ์ 64 ๋นํธ ์ถฉ๋์ ์ฌ์ฉํ์ต๋๋ค. ๊ฐ์ ์์ ๋ณํ 16
๋ง์ ์คํจ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ง๋ง, ๊ฐ์ ์ฌ์ง์ด ๊ฒธ์ํ ๋ณํ 128
32 ์ง๋ธ์ ์คํจ๋ฅผ ์ฐ์ฅ.
PCG64 DXSM์ ์ ํ์ ๋นํธ ์์ฑ๊ธฐ๋ก ์ถ๊ฐํ๊ณ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋ค์ด์ผํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๊ตฌํ์ด ์์ต๋๊น?
๋ ๋์ ๋งฅ๋ฝ์ ์ดํดํ๋ ๊ฒ์ด ๋์์ด๋๋ค๊ณ ์๊ฐํฉ๋๋ค. Sebastiano๋ PCG์ ๋ํด ์ฝ๊ฐ์ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๋ ๋์ ์ด์ ๋ํด ๋๊ด์ ์ ๊ธฐ ํด ์์ต๋๋ค. ์์ฆ ์ด๋ค ์ฌ๋๋ค์ ์ฐ๋ฆฌ ๋ ๋ค๋ณด๊ณ ๋์ ๊ตด๋ฆฌ๋ฉฐ "๋ํฌ ๋ ๋ค ์๋ก ๋์๋ค"๋ผ๊ณ ๋งํ ์ง๋ ๋ชจ๋ฅธ๋ค๊ณ ์๊ฐํ๋ค. ๋๋ ๊ทธ์ PRNG์ ๋ํด ๋นํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ ๊ทธ์ ๋ฌผ๊ฑด์ ๋ํด ๋งํ์ง ์๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ์จ๊ธฐ๋ ค๊ณ ํ๋ค (์ค์ ๋ก ๋๋ ์๊ฐ / ์ฑํฅ์ด ์์์ ๋ โ ์ฌ์ค, ๋๋ ๊ทธ๋ค์ด ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ ๋ฟ์ด์๋ค).
์ด๋ฌํ ๊ณ ๋ ค ์ฌํญ์ ์์ ํ ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฅ์ ๊ณผ ์ฆ๊ฑฐ์์ด ๋ค๋ฅธ ์ฌ๋์ ์์ (์ : SplitMix)์ ๊ณต๊ฒฉํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ PCG ๋๋ Numpy์ ์์ฑ๊ธฐ๋ฅผ ๋ ์ข๊ฒ ๋ง๋ค์ง ์์ต๋๋ค. ๋์ ๋ ๋์ ์น์ ๋๋ ๋ ์ ์ค๊ณ๋ ์คํฌ๋จ๋ธ๋ฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์คํธ๋ฆผ์ ์ ํํ ์์์ ๋ SplitMix์์ ์๊ด ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ ์คํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ๋ช ํํ๊ฒ ๋งํ๋ฉด Numpy์ ์์ฑ๊ธฐ์ ๋ํด ๋ค์ ํ์์ ์ง์ ์ ์ฆ๋ช ํ์ต๋๋ค.
โc โd โx โy ์๊ด ๊ด๊ณ
์ฌ๊ธฐ์ c, d๋ ์ฆ๋ถ ( "์คํธ๋ฆผ")์ด๊ณ x, y๋ ์ด๊ธฐ ์ํ์ ๋๋ค. ์ฌ์ค, 2 ^ 72 y๊ฐ ์์ต๋๋ค. ์ฆ, c, d, x๋ฅผ ์ด๋ป๊ฒ ์ ํํ๋ ์๊ด ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ 2 ^ 72 y๊ฐ ์์ต๋๋ค.
SplitMix์ ๋ํด ์ ๊ณต ํ ํด๋น ์ฝ๋๋
โc โd โx โy ์๊ด ๊ด๊ณ
์ฆ, ์ ๋์ ์ผ๋ก c, d, x ๋ฐ y๋ฅผ ์ ํํ๋ฉด ์๊ด ๊ด๊ณ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
๋ ์ง์ ์ ๊ฐ์ ์ฐจ์ด๋ ์๋นํ ๋๋์ต๋๋ค. ๋ ๋ฌธ์ฅ์ ํฉ์น๋ ค๊ณ ํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒ์ ๋๋ค.
@vigna ๊ทํ๋ @mattip ๋ฐ @rkern์ ํ๋ ๊ฐ๋ น์ ๋ํด ๋ ๋ฒ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ต๋๋ค. "๋ค๋ฅธ ์ฌ๋์ ์ผ์ ์ฐ๋ฅด๋ ๊ฒ"๊ณผ "๋ ์ง์ ์ ํฉ์น๋ ค๋ ๊ฒ์ ์์ํ FUD"์ ๊ฐ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. ์ด๊ฒ์ด ๋ง์ง๋ง ๊ฒฝ๊ณ ๋ผ๊ณ ์๊ฐํ์ญ์์ค. ์ด์กฐ๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฉด _ ๊ธ์ง _ํ๊ฒ ์ต๋๋ค. ๊ธฐ์ ์ ์ธ ์ฃผ์ฅ์ ์ฌ์ ํ โโํ์ํฉ๋๋ค. ๋ค๋ฅธ ๊ฒ์์ด ์์ ์์ ์์ต๋๋ค.
๋๋ ๊ทธ ํํ์ ์ค๋ฆฝ์ ์ธ ํํ์ผ๋ก ๋ฐ๊พธ๋ ๋ฉ์์ง๋ฅผ ์์ ํ์ต๋๋ค. ๋๋ ์ฌ์ ํ ํ ๋ก ์ ๋ค๋ฅธ ์ฐธ๊ฐ์๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๊ฒฉํ๋ ๊ฒ ( "์ธ๋ฐ์คํฐ์๋ ธ๋ PCG์ ๋ํด ์ฝ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๋ ๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋๊ฐ์ ํด์๋ค")์ ์ ์ ์ผ๋ก ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ด ์๋๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋๋์ต๋๋ค.
์ธ ๋ฒ์งธ์ด์ ๋ง์ง๋ง์ผ๋ก, ์ด๋ ๋ฐฉํฅ ์ผ๋ก๋ SplitMix์ ๋ํ ๋ ผ์๋ ์ ์๊ฒ ์กฐ๊ธ๋ ๋์์ด๋์ง ์์ต๋๋ค. ์ ํ์ํ ๋งฅ๋ฝ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ๋์ง ๋๋ ์๋๋ฐฉ์๊ฒ ์๋ตํด์ผํ๋ค๊ณ ์๊ฐํ๋์ง ์ดํดํ ์ ์์ง๋ง, ์ฌ๊ธฐ์์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ด๋๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋งํ๊ณ ์๋ค๋ ์ฌ์ค์ ๋ฏฟ์ผ์ญ์์ค. ๋ ๋ค ์์ ์ ์น ์ฌ์ดํธ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์จ.
๋๋ ๊ทธ ํํ์ ์ค๋ฆฝ์ ์ธ ํํ์ผ๋ก ๋ฐ๊พธ๋ ๋ฉ์์ง๋ฅผ ์์ ํ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๋๋ ์ฌ์ ํ ํ ๋ก ์ ๋ค๋ฅธ ์ฐธ๊ฐ์๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๊ฒฉํ๋ ๊ฒ ( "์ธ๋ฐ์คํฐ์๋ ธ๋ PCG์ ๋ํด ์ฝ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๋ ๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋๊ฐ์ ํด์๋ค")์ ์ ์ ์ผ๋ก ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ด ์๋๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋๋์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ค์ ๋ก ๋ณด์ง ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ฉ์์ง์ ์ด์กฐ๋ ๊ทธ๋ค์ง ๋์์ง ์์ต๋๋ค.
๋ ๋ค @vigna ์ @imneme์ ๊ฑด์ค์ ์ธ ์ฌ์ค ์ง์ ์ ๊ณ ์ ํ ์ ์๋ค๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
ํ์ธ. ์ฒ์๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ํธ์์ฑ๊ณผ ์๋๋ฅผ ์ํด 2์ ๊ฑฐ๋ญ ์ ๊ณฑ ๋ชจ๋๋ฌ์ค๋ฅผ ์ฌ์ฉํ๋ LCG๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ ์ผ์ข ์ ์คํธ๋ฆผ์ด์๋ ์์ฑ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ฌธํ์์๋ LCG ๊ฐ์ฐ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ ์คํธ๋ฆผ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๊ณ ์ ์ํ์ง๋ง (์ง๊ธ ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ) ์ด๊ฒ์ด ์ํ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
128 ๋นํธ ์ํ์ ์ข์ ์น์ (์ต์ 65 ๋นํธ)๊ฐ์๋ LCG๋ฅผ ๊ฐ์ ธ ์์ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ (ํด์ฑ, PRNG ๋ฑ)์์ ๋ง์ด ํ ์คํธ ๋ SplitMix์ ํผํฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ ๋นํธ๋ฅผ ๊ต๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๊น?
๋๋ ์๋์ ์ฐจ์ด๊ฐ ๋ฏธ๋ฏธํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๋นํธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค๋ (ํต๊ณ์ ) ๋ณด์ฅ์ด ์๋๋ฐ, ์ด๊ฒ์ด ์ฌ๊ธฐ์ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ ์๊ธฐ ์๊ด ๋ฌธ์ ๊ฐ์๋ ์์ฑ๊ธฐ์์ ๋ฏน์ฑ ํจ์๋ฅผ ์ง์ ๋ง๋๋ ๊ฒ๋ณด๋ค "๊ฑฐ์ธ์ ์ด๊นจ ์์์๋"์ ๊ทผ ๋ฐฉ์์ ๊ฐ๊น๋ค๊ณ ์๊ฐํฉ๋๋ค.
@imneme ๋ด๊ฐ ์ฌ์ฉํ ์์๋ ๊ฒ์ ์์์ด ๋ฐํ ์ฝ๋ฉํธ ๋ณด๋ค ๋งํฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ๊ทธ ์ฃผ์์์๋ ๊ฒ ์ด์์ผ ํ์๋ ์์ง๋ง ์ฌ๊ธฐ์์ ์ธ๊ธ ํ ํ ์คํธ์ ํ์ฌ ์ํ๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ ๋ฐ์ ์ ์ด๋ ๋ฉ๊ฐ ์ด์์์ ๋ ผ์ ๋ ๋ด์ฉ์ ์์ฝํ๊ณ ์ถ๋ค๋ฉด ํ์คํ ์ ์ฉ ํ ๊ฒ์ด์ง๋ง ์ ์ ์ผ๋ก ํ์ํ์ง๋ ์์ต๋๋ค.
๋น๋
128 ๋นํธ ์ํ์ ์ข์ ์น์ (์ต์ 65 ๋นํธ)๊ฐ์๋ LCG๋ฅผ ๊ฐ์ ธ ์์ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ (ํด์ฑ, PRNG ๋ฑ)์์ ๋ง์ด ํ ์คํธ ๋ SplitMix์ ํผํฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ ๋นํธ๋ฅผ ๊ต๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๊น?
๋น์ ์์ ์ผ๋ก ๋ค๋ฆฌ๋ฉด ์ฌ๊ณผํ์ง๋ง (ํ์คํ ์ง์ ๋๊ฒ ์ง๋ง) ์ฑ์คํฉ๋๋ค. ๊ทํ์ ์น ์ฌ์ดํธ ๋๋ arXiv์์ ๊ตฌํ, ๋ถ์, ๋ฒค์น ๋งํฌ ๋ฐ PractRand ๊ฒฐ๊ณผ๋ฅผ๋ณด๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ PRNG ์ฐ๊ตฌ์์ด ์๋ (ํฉ๋ฆฌ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ถ) ์ค๋ฌด์์ด๋ฉฐ์ด ์ ์์ ์ํ ํ ์์๋ ์ฅ๋น๊ฐ ํนํ ์ ๊ฐ์ถ์ด์ ธ ์์ง ์์ต๋๋ค. ๊ทธ ๋๋์ ๋ณผ ์๋ ์์ง๋ง ๊ฐ์ธ์ ์ธ ์๊ฐ์ ๋ํ ๋ค๋ฅธ ์ ์ฝ์ ๊ฐ์ํ ๋ ์ ์์์ ๊ตฌํ ๋ฐ ๋ถ์์ ์ด๋ฅด๊ธฐ๊น์ง ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ ์ํฅ์ด ์์ต๋๋ค. ์ด ์ ์์ numpy์๊ฒ ์ ๋ฌํ๋ ค๋ฉด PRNG ์ฐ๊ตฌ์์ด ํด๋น ์์ ์ ์ํํด์ผํฉ๋๋ค. ์ด ์ ์์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ค์ ๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ ์น ์ฌ์ดํธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
NumPy์ ์์์ Generator
-> BitGenerator
-> SeedSequence
์ํคํ
์ฒ๋ ํ๋ฌ๊ทธ ๊ฐ๋ฅํฉ๋๋ค. BitGenerator์ ๋ํ PR์ ์ด ์ฌ๋์ด ํ์ํ ์์ ์ ์ด๋ฅด๋ ์ผ๋ฏ๋ก ์ค์ ์์ฑ์ ํ์ฌ NumPy์์๋ ์์ฑ๊ณผ ๋น๊ตํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์ ์ผ๋ถ๊ฐ๋๋ฉด ๊ณ์ ํ
์คํธ ํ ์ ์์ผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๊ทธ ๊ฒฐ์ ์
BitGenerator.spawn
๋ฐ SeedSequence
์ฌ์ฉํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ถ์ฅํ๋ ๊ท๋ฒ ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค์ํ ์ ํ์ ์คํธ๋ฆผ ์ถฉ๋ ๊ฐ๋ฅ์ฑ.๊ฐ์ธ์ ์ผ๋ก์ด ํ ๋ก ์ spawn
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ํตํด BitGenerators
์ ์ฅ์ ์ ๋
ผ์ํ์ง ์์์ ๋ ์ ๋ฅผ ์์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ชจ๋ฒ ์ฌ๋ก๋ก ํ๋ณดํ๋ ์ด์ ๊ฐ ์์ผ๋ฉฐ, ํฅํ PR์ ๋ํ ๋
ผ์๊ฐ NumPy ์ฌ์ฉ์๋ฅผ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์๋ง๋ ์ฌ๊ธฐ์ ๊ฒฐ๋ก ์ค ํ๋๋ jumped
๋๋ advance
ํ๋ฉด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์๋ฐํ ์ ์์ผ๋ฏ๋ก spawn
๋ฉ์๋๋ก ํ์ฉํด์ผํ๋ค๋ ๊ฒ์
๋๋ค. ์ด์ ์ด์ ์ ๋ง์ถ ์๋ก์ด ๋ฌธ์ ๋๋ NEP ๋ ์์ฐ์ ์ผ ์ ์์ต๋๋ค.
@mattip @vigna๊ฐ ์ธ๊ธ ํ ํ์ ๋นํธ ์์ผ ์ถฉ๋์ SeedSequence.spawn()
์ธํฐํ์ด์ค์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ ๊ฐ ์ฐธ์ฌํ ๋
ผ์์ ๋ชจ๋ ๋ถ๋ถ์ API์ ์ ์ ํ ์ฌ์ฉ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋จ์ง ์์ ํ ๋ถ๋ฆฌ ๋ ๋ฐ์ ๊ธฐ์ ์ ํธ ๋ ์ ๊ทผ์ @rkern ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง #ifdef์ ๋ธ๋ก์ผ๋ก pcg64.c 8์ ๋ํ ํ์ ์ถ๊ฐํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด pyx / pxd๋ ์ฌ๋ฐ๋ฅธ ์ ์ (PCG_DXSM = 1) ๋ฐ ์ ๋ฐ์ดํธ ๋ ๋ ์คํธ๋ง์ผ๋ก ๋ง ๋น๋๋๋ PCG64 ํด๋์ค์ ๋์ผํฉ๋๋ค.
ํนํ์ด๋ฅผ ํ์๋กํ๋ ํ๋ซํผ์์ํ ์๋ฎฌ๋ ์ดํธ ๋ 128 ๋นํธ ์ํ์ ๋ํด ๋ ๋ช ํํ๊ฒ ์ค๋ช ํ ๊ฒ์ ๋๋ค.
https://github.com/rkern/numpy/compare/v1.17.4...rkern%3Awip/pcg64-dxsm
๊ทธ๊ฒ์ "์ ๋ ดํ"64 ๋นํธ ์น์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์๊ฒ ๊ทธ๊ฒ๋ณด๋ค ์ฌ์ ๋ค. ์ ์ถ๋ ฅ ๋ฏน์ (์ฆ, ๋ถ๋ณ)๋ฅผ ์ถ๊ฐ ํ ๋ค์ LCG์ ์ถ๋ ฅ์ ๊ฐ์ ธ์ ๋ฏน์๋ฅผ ์ ์ฉํ๋ ๋๋ค ์์ฑ๊ธฐ์ ์ต์ข ๋ผ์ธ ์ฃผ์์ ifdef๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
https://github.com/bashtage/randomgen/commit/63e50a63f386b5fd725025f2199ff89454321f4c#diff -879bd64ee1e2b88fec97b5315cf77be1R115
์ด ์์ ์์ Murmur Hash 3์ ์ถ๊ฐ ํ ์๋ ์์ต๋๋ค.
if
๋ฌธ์ด ์ปดํ์ผ๋์ง ์์ต๋๊น? ๋๋ ์ฐ๋ฆฌ๊ฐ ํซ ๋ฃจํ ์์ ๊ทธ๊ฒ๋ค์ ๋ฐฐ์๋ฅผ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ randomgen
์ numpy
๋ชฉ์ ์ฐจ์ด๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. randomgen
์์๋ ๋งค๊ฐ ๋ณ์ํ ๋ ํจ๋ฐ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง๋ง numpy
์์๋ ํ์ฑ ๊ธฐ๋ณธ๊ฐ์์ ๋ ๊ฑฐ์ BitGenerator
๊ตฌํ์ ์ฝํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. BitGenerator
๋ ์ค ํ๋์ ์ฑ๋ฅ์ ์ํด ์ ์ง ๊ด๋ฆฌ ๋๋ ๋ฆฌํฉํ ๋ง์ ์ํํด์ผํ๋ค๋ฉด ๊ทธ ๋
ธ๋ ฅ์ด ๋ ๋์์ง๊ธฐ๋ณด๋ค๋ ๋ ๋๋น ์ง ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์์ Robert์ ๋์ํฉ๋๋ค. 1.19.0 ๋ฆด๋ฆฌ์ค์ ์ ๋นํธ ์์ฑ๊ธฐ๋ฅผ ๋ฃ๋ ๊ฒ์ ๋ํด ์๋ฌด๋ฐ ๋ถ๋ง์ด ์์ผ๋ฉฐ ํ์ฌ ๋์์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
@bashtage ๋ํ pcg_cm_random_r()
๋ ์ฌํ ๋ฐ๋ณต ์ํ๊ฐ ์๋ #ifdef
๋๋ if
๋์ผํ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๊ฐ๋จํ์ง ์์ ๊ฒ์
๋๋ค.
if
๋ฌธ์ด ์ปดํ์ผ๋์ง ์์ต๋๊น? ๋๋ ์ฐ๋ฆฌ๊ฐ ํซ ๋ฃจํ ์์ ๊ทธ๊ฒ๋ค์ ๋ฐฐ์๋ฅผ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋์, NumPy์์ if
else
๋ ๋ค์๊ณผ ๊ฐ์์ผํฉ๋๋ค.
#if defined(PCG_DXSM)
pcg_output_dxsm(state.high, state.low)
#else
<old way>
#endif
uint128์ ๋์๊ณผ ๋ฎ์์ผ๋ก ์๋์ผ๋ก ์ด๋ํ๋ ค๋ฉด uint128 ๋ฒ์ ๊ณผ ๋์ฒด ๋ฒ์ ์์ ๋ณ๋๋ก ์ ์ํด์ผํฉ๋๋ค.
@bashtage ๋ํ
pcg_cm_random_r()
๋ post-iterated state ๋ณด๋ค๋ pre-iterated state๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ํ๋ฏ๋ก#ifdef
๋๋if
๋์ผํ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๊ฐ๋จํ์ง ์์ ๊ฒ์ ๋๋ค.
ํ , @imneme ์ฐธ์กฐ ๊ตฌํ์ ๋ํด ํ ์คํธ ํ ๊ฒฐ๊ณผ 2 ๊ฐ์ ๊ฐ๋ณ ์๋๋ฅผ ์ฌ์ฉํ์ฌ 1000 ๊ฐ์ ๊ฐ์ ๋ํด 100 % ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
https://github.com/bashtage/randomgen/blob/master/randomgen/src/pcg64/pcg_dxsm-test-data-gen.cpp
AFAICT (๊ทธ๋ฆฌ๊ณ ๋๋ ํ๋ฆด ์ ์์ต๋๋ค)
https://github.com/imneme/pcg-cpp/blob/master/include/pcg_random.hpp#L174
๊ณผ
https://github.com/imneme/pcg-cpp/blob/master/include/pcg_random.hpp#L1045
uint_128 ๊ฒฝ๋ก๊ฐ ํญ์ ์ ๋ ดํ ์น์๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
๋น์ ์ด ๊ฑฐ๊ธฐ์์ ๋ฌด์จ ๋ง์ ํ๋ ค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ์ PCG64 DXSM์ด ๋ฌด์์ธ์ง ๋ช
ํํ์ง ์์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ถ๋ ฅ ํจ์๋ 64 ๋นํธ ์ฐ์ฐ ๋ง ์ฌ์ฉํฉ๋๋ค. ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๋ฒ์ ์ ๋ค๋ฅธ ์์น์์ 64 ๋นํธ ์น์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ฌ ๋ ๋น ๋ฅด๋ฉฐ post๊ฐ ์๋ pre๋ฅผ ๋ฐํํฉ๋๋ค. setseq_dxsm_128_64
๋ ๊ธฐ์กด PCG64์ ์์ฐ์ค๋ฌ์ด ํ์ฅ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ถ๋ ฅ ๊ธฐ๋ฅ ๋ง ๋ณ๊ฒฝํฉ๋๋ค.
์, ์๊ฒ ์ต๋๋ค. ์๋์, C์์ ๊ตฌํ ํ ๊ฒ๊ณผ ๋ค๋ฅธ C ++ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. LCG ๋ฐ๋ณต์์ "์ ๋ ดํ ์น์"๋ฅผ ์ฌ์ฉํ๋ cm_setseq_dxsm_128_64
์ ๋๋ฑํ ๊ฒ์ ๊ตฌํํ์ต๋๋ค. setseq_dxsm_128_64
๊ฐ ์๋๋๋ค. LCG ๋ฐ๋ณต์์ ํฐ ์น์๋ฅผ ์ฌ์ฉํฉ๋๋ค. "์ ๋ ดํ ์น์"๋ DXSM ์ถ๋ ฅ ๊ธฐ๋ฅ ๋ด์์ ์ฌ์ฌ์ฉ๋์ง๋ง ์ด๋ ์ง๊ต ์ค๊ณ ์ถ์
๋๋ค.
setseq_dxsm_128_64๋ฅผ ์ ํธํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@imneme ๋ ๊ฒฐ๊ตญ C ++ ๋ฒ์ ์ ๊ณต์ pcg64
์ cm_setseq_dxsm_128_64
๊ฐ ์๋ setseq_dxsm_128_64
cm_setseq_dxsm_128_64
๋ฅผ ๊ฐ๋ฆฌ ํค๋๋ก ๋ณ๊ฒฝํ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค . ์ ๋ ดํ ์น์๋ XSL-RR์ ๋นํด DXSM์ ์ถ๊ฐ ๋น์ฉ ์ค ์ผ๋ถ๋ฅผ ์์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๋
๊ฐ ๋ช ๋ฌ ๋์ ํ
์คํธ๋ฅผ ํ ๊ฒ์ด ๋ณ์ข
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฌ์ ๋ฐ๋ณต ์ํ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ๋ ์ฑ๋ฅ ํฅ์์ ์ผ๋ถ์ ๋๋ค .
๋ค์์ ๋ช ๊ฐ์ง ํ์ด๋ฐ์ ๋๋ค.
In [4]: %timeit p.random_raw(1000000)
3.24 ms ยฑ 4.61 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each)
In [5]: p = rg.PCG64(mode="sequence",use_dxsm=False)
In [6]: %timeit p.random_raw(1000000)
3.04 ms ยฑ 8.47 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each)
In [7]: import numpy as np
In [8]: p = np.random.PCG64()
In [9]: %timeit p.random_raw(1000000)
3.03 ms ยฑ 2.54 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each)
๋ชจ๋ Ubuntu-20.04, ๊ธฐ๋ณธ ์ปดํ์ผ๋ฌ์ ๋๋ค.
6 % ๋๋ฆฝ๋๋ค. ๋์๊ฒ๋ ์์ ์ฐจ์ด์ฒ๋ผ ๋ณด์ ๋๋ค. NumPy / randomgen์ ๋ชจ๋ ํ์ด๋ฐ์ ๋ค์ดํฐ๋ธ ์ฝ๋์ ์ค์ ํ์ดํธ ๋ฃจํ์์ ์ป์ ์์๋ ๊ฒ๊ณผ๋ ์๋นํ ๋ค๋ฆ ๋๋ค.
๋น๊ต
In [10]: x = rg.Xoroshiro128(mode="sequence")
In [11]: %timeit x.random_raw(1000000)
2.59 ms ยฑ 35.7 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each)
C ์ฝ๋์์ ๊ฒ์ ๋ ๋ด์ฉ (150 % ๋๋ฆผ ??).
๋ฌผ๋ก numpy
์ปจํ
์คํธ์์๋ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. ์ด๋ C ++ ์ปจํ
์คํธ์์ ๋ ์ค์ํฉ๋๋ค. ์ด๋ ํด๋ฌ์คํฐ ์์ ํ
์คํธ์ ํ ๋นํ๊ณ ๊ณต์ C ++ ์ฝ๋์์ ํฅํ ๊ธฐ๋ณธ pcg64
๋ก ์ง๋ช
ํ๋๋ก ์ ๋ํ์ต๋๋ค. ์ด๊ฒ์ด numpy
, IMO์ ๋ํ ๊ฐ์ฅ ๊ฐ๊น์ด ๋๊ธฐ์
๋๋ค.
๋ด ๋ธ๋์น์ ์ฃผ์ PCG64
์ ๋ด PCG64DXSM
( "์ ๋ ดํ ์น์", DXSM ์ถ๋ ฅ ํจ์, ์ฌ์ ๋ฐ๋ณต ์ํ ์ถ๋ ฅ, ๋ณ๋์ ์ฝ๋ ๊ฒฝ๋ก) :
[practrand]
|1> s = np.random.SeedSequence()
[practrand]
|2> pcg64 = np.random.PCG64(s)
[practrand]
|3> pcg64dxsm = np.random.PCG64DXSM(s)
[practrand]
|4> %timeit pcg64.random_raw(1000000)
100 loops, best of 3: 3.46 ms per loop
[practrand]
|5> %timeit pcg64dxsm.random_raw(1000000)
100 loops, best of 3: 2.9 ms per loop
๋๋ MSVC์ ๋ํ ํน์ํ ๊ตฌํ์ผ๋ก๋ ๋ ์ฌ์ด์ #ifdefs
๋ช ๊ฐ (๋ด๊ฐ ๊ฐ์ง ๊ฒ๋ณด๋ค ๋ ๋ง์)์ ๋ถ๊ณผํ๋ค๊ณ ๋งํ๋ค. Plus RSN MS ์ฌ์ฉ์๋ clang # 13816 ๐์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฝ๋ ์ค๋ณต์ ๋ํด ๋
ผ์ํ๊ณ ์์ต๋๊น? #ifdefs
๋๋
ํ ๋ ๋ช ์ค์ ์ฝ๋์ ๋ํด ๊ฑฑ์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ถ๋ฆฌ ๋ ๊ตฌํ์ด ์์ต๋๋ค. :)
"PCG 2.0"(๊ฐ๊ธ์ ์ด๋ฉด NumPy์ GitHub ๋ฌธ์ ๊ฐ ์๋ ๊ณณ)์ ์ ์ํ๋ ์ ๋์ ์ผ๋ก ๋ช ํํ ์ง์ ์ ํ์์ฑ์ ๊ฐ์กฐํ์ง๋ง ๋๋ถ๋ถ์ ๋๋ด์ด์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค, @rkern et al.
@imneme ๋ด๊ฐ ์ฌ์ฉํ ์์๋ ๊ฒ์ ์์์ด ๋ฐํ ์ฝ๋ฉํธ ๋ณด๋ค ๋งํฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ๊ทธ ์ฃผ์์์๋ ๊ฒ ์ด์์ผ ํ์๋ ์์ง๋ง ์ฌ๊ธฐ์์ ์ธ๊ธ ํ ํ ์คํธ์ ํ์ฌ ์ํ๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ ๋ฐ์ ์ ์ด๋ ๋ฉ๊ฐ ์ด์์์ ๋ ผ์ ๋ ๋ด์ฉ์ ์์ฝํ๊ณ ์ถ๋ค๋ฉด ํ์คํ ์ ์ฉ ํ ๊ฒ์ด์ง๋ง ์ ์ ์ผ๋ก ํ์ํ์ง๋ ์์ต๋๋ค.
์๊ฐ์ ์ผ๋์๋๊ณ ๊ณ์ญ๋๊น? ์ ๋์ด ์ผ์ ํ๋์ํ๊ณ ๋ค๋ฅธ ์ผ๋ก ๋ฐ์ด ๋ถ์ด๋ ค ๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋ง๊ฐ์ผ์ ์ ์ํ๋ ๊ฒ์ด ์ ์๊ฒ ์ ์ฉํ ๋๊ธฐ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ผ์ฃผ์ผ ์ ๋? ๋?
@rkern ์ ๋ํ ํ์ต๋๋ค .
128 ๋นํธ ์ํ์ ์ข์ ์น์ (์ต์ 65 ๋นํธ)๊ฐ์๋ LCG๋ฅผ ๊ฐ์ ธ ์์ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ (ํด์ฑ, PRNG ๋ฑ)์์ ๋ง์ด ํ ์คํธ ๋ SplitMix์ ํผํฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ ๋นํธ๋ฅผ ๊ต๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๊น?
FWIW,์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ PCG ๋ ผ๋ฌธ์์ ๋ ผ์๋์์ผ๋ฉฐ, _FastHash_๋ฅผ ๊ธฐ์ฑํ ํด์ ํจ์๋ก ์ฌ์ฉํ์ฌ ๋งค์ฐ ์ ์ฌํ ๊ณฑ์ -์์ ์ํํธ ํด์ ํจ์์ ๋๋ค. ๋ด ํ ์คํธ์์ ๋ค๋ฅธ ์์ด๋งํผ ๋น ๋ฅด์ง๋ ์์์ง๋ง ๊ณ ํ์ง์ด์์ต๋๋ค. Sebastiano๋ 2018 ๋ PCG ๋นํ์์๋์ด ์์ด๋์ด๋ฅผ ์ธ๊ธํ์ผ๋ฉฐ, ์ด ๋นํ์ ๋ํ ์ ์ ์๋ต ์ด์ ๋ํด ๋ ผ์ํฉ๋๋ค.
PCG ๋นํ์ ์๋ ๋ฒ์ ์์ ๊ทธ๋ ์์ ์ PCG ๋ณํ์ ์์ฑํ์ฌ ๋๋ ๋๋ค.
#include <stdint.h>
__uint128_t x;
uint64_t inline next(void) {
// Put in z the top bits of state
uint64_t z = x >> 64;
// Update state
x = x * ((__uint128_t)0x2360ed051fc65da4 << 64 ^ 0x4385df649fccf645)
+ ((__uint128_t)0x5851f42d4c957f2d << 64 ^ 0x14057b7ef767814f);
// Compute mix
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
return z ^ (z >> 31);
}
๊ทธ๋ ๋นํ์ ์ฝ๋๋ฅผ ๋ ์ ๋ ดํ ์น์๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ฐ ์์๋ฅผ 64 ๋นํธ๋ก ์ค์ด๋ ๋ ๋น ๋ฅธ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค.
#include <stdint.h>
__uint128_t x;
uint64_t inline next(void) {
// Put in z the top bits of state
uint64_t z = x >> 64;
// Update state (multiplier from https://arxiv.org/abs/2001.05304)
x = x * ((__uint128_t)1 << 64 ^ 0xd605bbb58c8abbfd) + 0x14057b7ef767814f;
// Compute mix
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
return z ^ (z >> 31);
}
์ด ๋ ๊ฐ์ง ๋ณํ์ ๋ํ ๋ด ๋ฌธ์ ๋ ์๋ฆฐ ์ํ (์๋ถ ์ ๋ฐ)๊ฐ ์์ด / ์คํฌ๋จ๋ธ๋๊ธฐ ๋๋ฌธ์ ์์ด์ด ๋ฐ์ ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ญ์์ผ๋ก ์คํํ๊ณ ์คํฌ๋จ๋ธ์ ํด์ ํ์ฌ ๋ชจ๋ ๊ณ ์ ๊ฒฐํจ์ด์๋ ๋จ์ํ ์๋ฆฐ LCG ๋ง ๋จ๊ธธ ์ ์์ต๋๋ค. ๋ด๊ฐ ์ ํธํ๋ ๊ฒ์ ์ ์ฒด ์ํ๋ฅผ ์ํ / ์คํฌ๋จ๋ธ ํ ๋ค์ ๊ทธ ์๋ฆผ์ ์ถ๋ ฅํ๋ ๊ฒ์ ๋๋ค. (๋ฌผ๋ก ๋ ์ ์ ๋นํธ๋ฅผ ์์ด / ์คํฌ๋จ๋ธํ๋ ๊ฒ์ด ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ ๋๋ค. ํ์์์ฒ๋ผ ํธ๋ ์ด๋ ์คํ๊ฐ ์์ต๋๋ค. ํฉ๋ฆฌ์ ์ธ ์ฌ๋๋ค์ ์ค์ํ ๊ฒ์ ๋์ํ์ง ์์ ์ ์์ต๋๋ค.)
๊ทธ๋ฌ๋ ์์ ์ PCG ๋ณํ์ ๋ง๋๋ ๊ทธ์ ์์ ์ ์ ๊ฐ ์๋ ์ ๊ทธ๊ฒ์ ์ผ์ ๋ DXSM ์์ด์ ๋งค์ฐ ์ ์ฉํ ์๊ฐ์ ์ ๊ณตํ์ต๋๋ค.
@charris PCG64DXSM
๊ตฌํ์ 1.19.0์์ ์ฌ์ฉํ ์ ์๋๋ก (์์ง ๊ธฐ๋ณธ๊ฐ์ ์๋) ์ํ๋ ๊ฒ์ ๋ฌด์์
๋๊น? ๊ทธ ํ์ ๋ผ์ธ์ ๋ฌด์์
๋๊น? ๋๋ ์ด๋ฏธ 1.19.0rc2๊ฐ ์ถ์ ๋ ๊ฒ์ผ๋ก ๋ณด๋๋ฐ, ์ด๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์
ํ๊ธฐ์ _ ํ๋ฅญํ์ง ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ ๋์ด ๋ฌธ์ ์ ๋ํด ํ์ ๊ฐ๋์ง ์์ต๋๋ค. default_rng()
๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ ์ฑ
์ ๋ฌธ์ํํ๊ณ 1.20.0์ ์๋ก์ด ๋ด์ฉ์ ๋์
ํ๋ ๊ฒ๋ง์ผ๋ก 1.19.0์ ๋ฆด๋ฆฌ์ค ํ ๊ฒ์
๋๋ค.
@rkern ์ต์ข rc๋ 2 ์ฃผ ์ด์ ์ถ์๋์ด์ผํ๋ฏ๋ก 6 ์ ํ๋ฐ๊ธฐ์ ์ถ์ ๋ ์์ ์ ๋๋ค. ๋๋ PCG64DXSM์ด ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒํ๋ค๋ฉด ์ ํ ์ฌํญ์ผ๋ก ์ ํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ ๋ ๊ทธ๊ฒ์ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ๊ฐ์ฃผํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ก๋ ์ค์ ์์ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ ์ ์งํํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. NumPy๋ ํธ๋ ๋ ์ธํฐ์ ๋๋ค :)
ํธ์ง : ๋ฌผ๋ก ์ ์ฝ๋์ ํฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ฑฐ๊ธฐ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ๋๋ ๋ํ PCG64์ ๋ฌธ์ ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ์์ผ๋ฉฐ ๊ถ์ฅ ์ ์ฐจ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@imneme ์ผ์ฃผ์ผ
๋ค์ ์ฃผ์ ์์ ๋ฒ์ด๋ ์ง๋ฌธ์ด ์์ต๋๋ค. ๋นํธ ์์ฑ๊ธฐ๊ฐ ์์์ ๋นํธ๋ฅผ ์์ฑํ๊ธฐ๋ฅผ ์ํ์ง๋ง AFAICT, ๋๋ถ๋ถ์ ํ ์คํธ์๋ ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค. ๋นํธ๋ฅผ ์ค์ ๋ก ํ ์คํธ ํ ๋ ๊ธฐ์กด ํ ์คํธ๊ฐ ์ผ๋ง๋ ์ ์ํํฉ๋๊น? ๊ทธ ์ง์ญ์ ๋ ์ต์ํ ์ฌ๋์ด ๊ทธ ์ง๋ฌธ์ ๋ตํ ์ ์๋ค๋ฉด ๊ฐ์ฅ ๊ฐ์ฌ ํ ๊ฒ์ ๋๋ค.
ํ ์คํธ๋๊ณ ์๋ ๊ฒ์ ๋นํธ์ ํ๋ฆ์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ ์คํธ ์ํํธ์จ์ด์ ์ฐ๋ฆฌ๊ฐ ์ถ๋ ฅํ๋ PRNG์ ์์ฐ์ค๋ฌ์ด ๋จ์ด ํฌ๊ธฐ๋ฅผ ์๋ ค ์ฃผ์ง๋ง ๋นํธ๋ฅผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ํด๋ฉํ์ฌ ๋ฎ์ ๋๋ ๋์ ๋นํธ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ ๋ฐํ ์ ์๋๋กํฉ๋๋ค. ๋์ PRNG์ ๋จ์ด. ์ค๋๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฌ์ฉํ๋ ์ํํธ์จ์ด๋ PractRand์ด๋ฉฐ ํ ์คํธ๋ ์ฌ๊ธฐ์ ๊ฐ๋จํ ๋ฌธ์ํ๋์ด ์์ต๋๋ค . ์ฝ๊ธฐ์ ๊ฐ์ฅ ์ข์ ๋ ผ๋ฌธ ์ ์๋ง๋ ์ด์ ์ ๊ณจ๋ ํ์ค ํ ์คํธ ์ค์ํธ ์ธ TestU01 ์ ๋ํ ์ค๋ช ์ ์๋ ํ ์คํธ์ ๋ํ ์์ธํ ๋ด์ฉ์ด ์์ต๋๋ค.
๋น์ ์์ ์ผ๋ก ๋ค๋ฆฌ๋ฉด ์ฌ๊ณผํ์ง๋ง (ํ์คํ ์ง์ ๋๊ฒ ์ง๋ง) ์ฑ์คํฉ๋๋ค. ๊ทํ์ ์น ์ฌ์ดํธ ๋๋ arXiv์์ ๊ตฌํ, ๋ถ์, ๋ฒค์น ๋งํฌ ๋ฐ PractRand ๊ฒฐ๊ณผ๋ฅผ๋ณด๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ PRNG ์ฐ๊ตฌ์์ด ์๋ (ํฉ๋ฆฌ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ถ) ์ค๋ฌด์์ด๋ฉฐ์ด ์ ์์ ์ํ ํ ์์๋ ์ฅ๋น๊ฐ ํนํ ์ ๊ฐ์ถ์ด์ ธ ์์ง ์์ต๋๋ค. ๊ทธ ๋๋์ ๋ณผ ์๋ ์์ง๋ง ๊ฐ์ธ์ ์ธ ์๊ฐ์ ๋ํ ๋ค๋ฅธ ์ ์ฝ์ ๊ฐ์ํ ๋ ์ ์์์ ๊ตฌํ ๋ฐ ๋ถ์์ ์ด๋ฅด๊ธฐ๊น์ง ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ ์ํฅ์ด ์์ต๋๋ค. ์ด ์ ์์ numpy์๊ฒ ์ ๋ฌํ๋ ค๋ฉด PRNG ์ฐ๊ตฌ์์ด ํด๋น ์์ ์ ์ํํด์ผํฉ๋๋ค. ์ด ์ ์์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ค์ ๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ ์น ์ฌ์ดํธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๋๋ ๋น์ ์ ๊ด์ ์ ์๋ฒฝํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์ฝ๋์ ๋ฒค์น ๋งํฌ๋ ๋ช ๋ ๋์ LCG128Mix๋ผ๋ ์ด๋ฆ์ผ๋ก PCG (http://prng.di.unimi.it/pcg.php)์ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ํ์ด์ง ํ๋จ์์์์ต๋๋ค. ๋ด ํ๋์จ์ด, Intel (R) Core (TM) i7-7700 CPU @ 3.60GHz, gcc 9.2.1 ๋ฐ -fno-move-loop-invariants -fno-unroll-loops์์ 2.16ns๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํ์ค LCG์ ํ์ค ๋ฏน์ฑ ๊ธฐ๋ฅ์ ๊ฒฐํฉํฉ๋๋ค (Stafford์ ๊ฐ์ ๋ MurmurHash3์ ์ข ๋ฃ ์). ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ์์๋ฅผ ๊ฐ๋๋ก ์ฝ๊ฐ ์์ ํ์ต๋๋ค.
#include <stdint.h>
__uint128_t x; // state
__uint64_t c; // stream constant (odd)
uint64_t inline next(void) {
// Put in z the top bits of state
uint64_t z = x >> 64;
// Update LCG state
x = x * ((__uint128_t)1 << 64 ^ 0xd605bbb58c8abbfd) + c;
// Compute mix
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
return z ^ (z >> 31);
}
์์ ์ค๋ช ํ๋ฏ์ด 65 ๋นํธ ์์๋ ๋ชจ๋๋ฌ์ค์ ์ ๊ณฑ๊ทผ๋ณด๋ค ์์ ๊ณฑ์ ๊ธฐ์ ์ด๋ก ์ ๋ฌธ์ ๋๋ฌธ์ ๊ณฑ์ ๊ธฐ๋ก์ 64 ๋นํธ ์์๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
๋ณด๋ค ์์น์ ์ธ ๋์์ธ์ ๊ด์ฌ์ด ์๋ค๋ฉด PractRand ํ ์คํธ๋ฅผ ์คํํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋์ด ๋ฏน์ฑ ํจ์๋ ํจ์ฌ ๋ ์ฝํ ๊ธฐ๋ณธ ์์ฑ๊ธฐ (๋จ์ง ๊ฐ์ฐ ์ฑ)์ ๋ ์์ ์ํ (64 ๋นํธ)์์๋ ์ฐ์ํ ์์ฑ๊ธฐ SplitMix๋ฅผ ์์ฑํ์ต๋๋ค. ๋ฐ๋ผ์ 32TB์์ PractRand๋ฅผ ํต๊ณผํ๋ SplitMix๋ณด๋ค "๋ ๋์"๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ์์ฑ๊ธฐ๋ LCG์ด๋ฏ๋ก 60 ๋ ๋์ ๋ชจ๋ ์ผ๋ฐ์ ์ธ ์ข ์๋ฆฌ (์ ํ, ๊ฑฐ๋ฆฌ ๋ฑ)๊ฐ ์์ต๋๋ค. ๋ํ ๊ฒฐ๊ณผ์ ๋ชจ๋ ๋นํธ๊ฐ ์์ 64 ๋นํธ์ ๋ชจ๋ ๋นํธ์ ์์กดํ๋ค๋ ํต๊ณ์ ๋ณด์ฅ๋ ์์ต๋๋ค. ์ํ.
๋ค๋ฅธ ์์ฑ๊ธฐ์ ๋ํ ๋ฒค์น ๋งํฌ๋ฅผ ์ผ๋์ ๋๊ฑฐ๋ ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค.
๊ทธ๋ฌ๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ง์ฌ์ผ๋ก ๋ถํ๋๋ฆฝ๋๋ค. ํ์ค ๊ตฌ์ฑ ์์ ๋ง ์ฌ์ฉํ๋ "๊ฑฐ์ธ์ ์ด๊นจ ์์์๋"๋์์ธ์ ๊ณ ๋ คํ๋ ๋ฐ ์ ๋ง๋ก ๊ด์ฌ์ด์๋ ๊ฒฝ์ฐ์๋ง ํด๋น๋ฉ๋๋ค. ์ ์๊ฐ์๋ ๊ฐ์ธ์ ์ธ ์ ์ฝ์ด ์๊ณ , ๊ธฐ์ฌํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค.ํ์ง๋ง ๊ณ ๋ คํ ๊ธฐํ๊ฐ์๋ ๋ฐ์ ๊ธฐ์ ์๊ฐ์ ๋ณด๋ด๋ ๊ฒ์ ํผํ๊ณ ์ถ์ต๋๋ค.
BTW๋ ๊ด๋ จ๋ ์น์์ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ๋ณด๋ค ํ์คํ ์ธก์ ์ ์ ๊ณตํ๊ธฐ ์ํด PCG DXS ๋ฐ ์ผ๋ถ ๋์์์ ์ฌ์ฉํ๋ ํ์ฌ 64 ๋นํธ ์น์์ ์คํํธ๋ผ ์ ์๋ฅผ fโ์์ fโ๊น์ง ๊ณ์ฐํ์ต๋๋ค.
์คํํธ๋ผ ์ ์๋ ์น์์ ์ฅ์ ์ ํ๋จํ๋ ํ์ค ๋ฐฉ๋ฒ์ ๋๋ค. 0์ ๋์๊ณ 1์ ์ฐ์ํฉ๋๋ค. ๊ฐ ์ ์๋ ์ถ๋ ฅ์์ โโ์, ํธ๋ฆฌํ, 4- ํํ ๋ฑ์ด ์ผ๋ง๋ ์ ๋ถํฌ๋์ด ์๋์ง๋ฅผ ๋ํ๋ ๋๋ค.
์ด 7 ๊ฐ์ ์ซ์๋ TAoCP์์ Knuth๊ฐ ์ ์ํ๋๋ก ์ฒซ ๋ฒ์งธ ์ ์๋ฅผ ๋ ์ค์ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํด๋์ ์ธก์ ๊ฐ, ์ต์๊ฐ ๋๋ ๊ฐ์ค์น ์ธก์ ๊ฐ (์ฒซ ๋ฒ์งธ ์ ์์ ๋ ๋ฒ์งธ ์ ์๋ฅผ 2๋ก ๋๋ ๊ฐ ๋ฑ)์ผ๋ก ์ฌ๊ฐ ํ ์ ์์ต๋๋ค. , ๋ค์์ ํ์ฌ ์น์์ ๋ํ ์ต์ ๋ฐ ๊ฐ์ค์น ์ธก์ ๊ฐ์ ๋๋ค.
0xda942042e4dd58b 0.633 0.778
๊ทธ๋ณด๋ค ํจ์ฌ ๋ ๋์ 64 ๋นํธ ์์๊ฐ ์์ต๋๋ค.
0xff37f1f758180525 0.761 0.875
๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ์๋๋ก 65 ๋นํธ๋ก ์ด๋ํ๋ฉด (์ ์ด๋ LCG128Mix๊ฐ ๋์ผํ ์๋ ์ธ ๊ฒฝ์ฐ) ๋ ๋์ ๊ฐ์ค์น ์ธก์ ์ ์ป์ ์ ์์ต๋๋ค.
0x1d605bbb58c8abbfd 0.761 0.899
๊ทธ ์ด์ ๋ 64 ๋นํธ ์น์์๋ fโ ์ ์ (โค0.93)์ ๋ํ ๋ณธ์ง์ ์ธ ํ๊ณ๊ฐ ์์ผ๋ฉฐ, ์ด๋ Knuth๊ฐ ์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ต๋๋ค.
0xda942042e4dd58b5 0.795
0xff37f1f758180525 0.928
0x1d605bbb58c8abbfd 0.992
๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ์น์๋ ํ๋ฒํ fโ ์ ์๋ฅผ ๊ฐ์ต๋๋ค. ๋ ๋ฒ์งธ ์น์๋ 64 ๋นํธ ์น์์ ๋ํ ์ต์ ๊ฐ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค. 65 ๋นํธ ์น์๋ ์ด๋ฌํ ์ ํ์ด ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅํ ์ต๊ณ ์ธ 1์ ๋งค์ฐ ๊ฐ๊น์ด ์ ์๋ฅผ๊ฐ์ง๋๋ค.
์์ ์ฑ์ ์ํด ๋ชจ๋ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
0xda942042e4dd58b5 0.794572 0.809219 0.911528 0.730396 0.678620 0.632688 0.639625
0xff37f1f758180525 0.927764 0.913983 0.828210 0.864840 0.775314 0.761406 0.763689
0x1d605bbb58c8abbfd 0.991889 0.907938 0.830964 0.837980 0.780378 0.797464 0.761493
์ด ์ ์๋ฅผ ๋ค์ ๊ณ์ฐํ๊ฑฐ๋ Guy Steele๊ณผ ๋ด๊ฐ ๋ฐฐํฌ ํ ์ฝ๋ ( https://github.com/vigna/CPRNG) ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์น์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ ๋์ ์น์๋ ๊ด๋ จ ๋ ผ๋ฌธ์์ ๊ฐ์ ธ์ต๋๋ค.
PCG๋ ์๋ง๋ numpy์ ๋ํ ํ๋ฅญํ ๊ธฐ๋ณธ ํ๋ฆฐํ ์ด ๋ ๊ฒ์ด์ง๋ง, ๋ ์ ๋งํ์ง๋ง ํ ์คํธ๊ฐ ๋ํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ํ ์คํธ๋ฅผ ๊ฒฌ๋์ง โโ๋ชปํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ์ค ํ๋๋ฅผ ์ ์ํฉ๋๋ค.
ํํ ์นด์ค์ค SFC64๋ ํฉ๋ฆฌ์ ์ผ๋ก ํฐ ์ต์์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ํต๊ณ์ ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ์ฌ์ด๋ ์์ฑ๊ธฐ ์ค ํ๋์ ๋๋ค. SFC64์๋ ์ ํ ๊ธฐ๋ฅ์ด ์์ง๋ง _ ์๋ ์ค๋ฒ ํค๋์์ด 2 ^ 63 ๋ณด์ฅ ๋ ๊ณ ์ ์คํธ๋ฆผ์ ์ง์ํ๋๋ก ํ์ฅ ํ ์ ์์ต๋๋ค _. ์นด์ดํฐ๋ฅผ 1 ์ฉ ์ฆ๊ฐ์ํค๋ ๋์ ์ฌ์ฉ์๊ฐ ์ ํํ ์ถ๊ฐ ์์ k (ํ์ ์ฌ์ผ ํจ)๋ก Weyl ์ํ์ค ๋ฅผ ์ถ๊ฐํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค. ๊ฐ ํ์ k๋ ๊ณ ์ ํ ์ ์ฒด ๊ธฐ๊ฐ์ ์์ฑํฉ๋๋ค. Weyl ์์๋ฅผ ์ ์งํ๋ ค๋ฉด ์ถ๊ฐ 64 ๋นํธ ์ํ๊ฐ ํ์ํฉ๋๋ค.
typedef struct {uint64_t a, b, c, w, k;} sfcw64_t; // k = stream
static inline uint64_t sfcw64_next(sfcw64_t* s) {
enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
const uint64_t out = s->a + s->b + (s->w += s->k);
s->a = s->b ^ (s->b >> RSHIFT);
s->b = s->c + (s->c << LSHIFT);
s->c = ((s->c << LROT) | (s->c >> (64 - LROT))) + out;
return out;
}
320 ๋นํธ ์ํ๋ ๋๋๋ก ๋ฐ๋์งํ์ง ์๊ธฐ ๋๋ฌธ์ 256 ๋นํธ๋ฅผ ๋ค์ ์ฌ์ฉํ๋๋ก ์์ถํ๋ ค๊ณ ํ์ต๋๋ค. ๋นํธ ๋ฏน์ฑ์ Weyl ์ํ์ค๋ฅผ ๋ ์ ํ์ฉํ๋ ๋ณ๊ฒฝ๋ ์ถ๋ ฅ ๊ธฐ๋ฅ๋ ์ฃผ๋ชฉํ์ญ์์ค. ๊ทธ๊ฒ์ ์ข์ ๊ท ํ์ ์ด๋ฃจ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ 128/128 ๋นํธ ํผ๋ / ๊ตฌ์กฐํ ๋ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
/ ํธ์ง : ์ถ๋ ฅ func + ์ ๋ฆฌ์์ rotl64 () ์ ๊ฑฐ, 8 ์ 6 ์ผ :
typedef struct {uint64_t a, b, w, k;} tylo64_t;
static inline uint64_t tylo64_next(tylo64_t* s) {
enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
const uint64_t b = s->b, out = s->a ^ (s->w += s->k);
s->a = (b + (b << LSHIFT)) ^ (b >> RSHIFT);
s->b = ((b << LROT) | (b >> (64 - LROT))) + out;
return out;
}
์ด๊ฒ์ ํ์ฌ PractRand ํ ์คํธ์์ ์ด์์์ด 4TB๋ฅผ ํต๊ณผํ์ผ๋ฉฐ ์ง๊ธ๊น์ง ๋ฌธ์ ์์ด Vigna์ Hamming-weight ํ ์คํธ๋ฅผ ์ ์ ์คํํ์ต๋๋ค. ).
์ฐธ๊ณ : ๋นํธ ์ธํธ์ ์ฝ 50 %๋ฅผ ์ฌ์ฉํ์ฌ (๊ณ ์ ํ) ๋๋ค Weyl ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํต๊ณ์ ์ผ๋ก ์ด์ ์ด์์ ์ ์์ง๋ง ์ถ๊ฐ ํ ์คํธ ๋๋ ๋ถ์์ ํตํด์๋ง ์ด๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์ ์ ์์ต๋๋ค.
/ ํธ์ง : ์ ๋ฆฌ.
@ tylo-work SFC64๋ ์ด๋ฏธ NumPy์ ์์ผ๋ฉฐ Philox์ ํจ๊ป ๊ธฐ๋ณธ ์์ฑ๊ธฐ์ ๊ดํ ๊ฒ์ ๋๋ค.
์ข์ต๋๋ค. ์ ํํ ์ด๋ค ๊ฒ์ด ๊ตฌํ๋์๋์ง ๋ชฐ๋์ต๋๋ค.์ด ์ค์์ ์ ์ฒด์ ์ผ๋ก ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ ํํ๋ ๊ฒ๋ฟ์ ๋๊น? ์ถฉ๋ถํ ๊ณตํํ๊ณ ๋ช ํํ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ์ํ ์์ฑ๊ธฐ๋ฅผ ๊ด๋ฒ์ํ๊ฒ ํ ์คํธํ์ฌ ๋ค๋ฅธ ์์ฑ๊ธฐ์ ์ด๋ป๊ฒ ์์ด๋ ์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์ง๊ธ๊น์ง๋ ์๋, ์ถ๋ ฅ ํ์ง, ๋จ์์ฑ / ํฌ๊ธฐ / ํด๋ ์ฑ ๋ฐ ๋๊ท๋ชจ ๋ณ๋ ฌ ์ฌ์ฉ์ ๋ํด ๋งค์ฐ ์ข์ ๋ณด์ ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค๋ ์ํํด ๋ณธ๋ค๋ฉด ๊ธฐ์ ๊ฒ์ ๋๋ค.
NumPy์ ๋ฒ์ ์ k=1
๊ฐ์๋ ํ์ค ๋ณํ์
๋๋ค.
๊ธฐ๋ณธ PRNG์ ๋ํ ๋ ผ์๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ์ฌ PRNG์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ํด๋น ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ณํ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ด์ฌ์ฌ ์ค ํ๋๋ ํ์ฌ ๊ธฐ๋ณธ PRNG๊ฐ ์ ํ ๊ฐ๋ฅ์ฑ๊ณผ ๊ฐ์ PRNG์ ํน์ ๊ธฐ๋ฅ์ ๋ ธ์ถํ๊ณ ์ด๋ฅผ ๋์ฒดํ๋ ๋ณํ์ด ์ฌ์ ํ ๋ ธ์ถํด์ผํ๋ค๋ ๊ฒ์ ๋๋ค. SFC64 (์ ํฌ ๋๋ ๊ทํ์)์๋ ํด๋น ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
@bashtage ๋ SFC64 ์ Weyl ์คํธ๋ฆผ ๋ณํ์ ์ถ๊ฐํ๊ธฐ ์ํด
@ tylo-work ๋ณ๋ ฌ ์คํ์ ๊ด์ฌ์ด ์๋ค๋ฉด NumPy์ SeedSequence ๊ตฌํ์ ์ดํด๋ณผ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ PRNG์ ๋ํ ๋ ผ์๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ์ฌ PRNG์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ํด๋น ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ณํ์ ์ฐพ๊ณ ์์ต๋๋ค.
PCG-DXS์ ๊ฐ์ ๊ฒ์ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ ๋์ ์์ (๊ทธ๋ฆฌ๊ณ ๋งค์ฐ ๋ฏธ๋ฏธํ ์๋ ์ ํ)๋ก ํ ์์๋ ์ถ๊ฐ ๊ฐ์ ์ฌํญ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, PCG-DXS๋ ๋์ผํ ํ์ 112 ๋นํธ ์ํ๋ฅผ ๊ฐ์ง ๋ ๊ฐ์ ์ธํฐ๋ฆฌ๋น ๋ ์๊ด ํ์ ์ํ์ค์์ ๋ ๊ฐ์ง ๋ณ๊ฐ ์ ํ์ ํ ์คํธ์ ๊ณง ์คํจํฉ๋๋ค.
rng=PCGDXS_int112, seed=0x4d198651
length= 128 gigabytes (2^37 bytes), time= 5700 seconds
Test Name Raw Processed Evaluation
[Low1/64]TMFn(0+2):wl R= +57.3 p~= 2e-27 FAIL !!
[Low8/64]FPF-14+6/64:(1,14-0) R= +17.5 p = 8.0e-16 FAIL
[other failures in the same tests]
...and 1893 test result(s) without anomalies
์ฐ๋ฆฌ๋ โ65536 ๊ฐ์ ์๊ด ์ํ์ค์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ๋๋ ค์ ํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ 0x1d605bbb58c8abbfd์ ๊ฐ์ ๋ ๋์ ์น์์ 0x9e3779b97f4a7c15์ ๊ฐ์ ๋ ๋์ ๋ฏน์๋ฅผ ์ ํํ์ฌ ์์ฑ๊ธฐ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ซ์๋ ํจ์ฌ ๋ ๋์ ์คํํธ๋ผ ์ ์๋ฅผ ๊ฐ์ง 65 ๋นํธ ์น์์ ๋๋ค. ๋ ๋ฒ์งธ ์ซ์๋ 64 ๋นํธ ๊ณ ์ ์ ํํ์ ํฉ๊ธ ๋น์จ์ด๋ฉฐ, ์ด๋ ์ข์ ํผํฉ ์์ฑ์ ๊ฐ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค (๊ณฑ์ ํด์ฑ์ ๋ํ Knuth TAoCP ์ฐธ์กฐ). ์๋ฅผ ๋ค์ด Eclipse Collections ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํด์ ์ฝ๋๋ฅผ ํผํฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ผํ ์์ ๋ฐ์ดํฐ์ ๋ํด FPF ๋ง ์คํจํฉ๋๋ค.
rng=PCG65-DXSฯ_int112, seed=0x4d198651
length= 128 gigabytes (2^37 bytes), time= 5014 seconds
Test Name Raw Processed Evaluation
[Low8/64]FPF-14+6/64:(0,14-0) R= +16.1 p = 1.5e-14 FAIL
[other failures in the same test]
...and 1892 test result(s) without anomalies
์ฌ์ค, 2TB์์ ๋ ๋์๊ฐ๋ฉด PCG-DXS๊ฐ ๋์ผํ ์ธํฐ๋ฆฌ๋น ๋ ์๊ด ํ์ ์ํ์ค์ ๋ํด _three_ ์ ํ์ ํ ์คํธ์ ์คํจํฉ๋๋ค.
rng=PCGDXS_int112, seed=0x4d198651
length= 2 terabytes (2^41 bytes), time= 53962 seconds
Test Name Raw Processed Evaluation
[Low1/32]TMFn(0+0):wl R= +50.2 p~= 4e-23 FAIL !!
[Low8/64]FPF-14+6/64:(1,14-0) R=+291.1 p = 4.7e-269 FAIL !!!!!!
[Low8/64]Gap-16:B R= +19.5 p = 1.4e-16 FAIL !
[other failures in the same tests]
...and 2153 test result(s) without anomalies
PCG65-DXSฯ๋ ์ฌ์ ํ FPF ๋ง ์คํจํฉ๋๋ค.
rng=PCGDXS65ฯ_int112, seed=0x4d198651
length= 2 terabytes (2^41 bytes), time= 55280 seconds
Test Name Raw Processed Evaluation
[Low8/64]FPF-14+6/64:(0,14-0) R=+232.1 p = 2.0e-214 FAIL !!!!!!
[other failures in the same test]
...and 2153 test result(s) without anomalies
๋ฌผ๋ก ์กฐ๋ง๊ฐ PCG65-DXSฯ๋ Gap๊ณผ TMFn์ ์คํจ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ PCG-DXS๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ถ๋ ฅ์ ๋ณผ ํ์๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ PCG65-DXSฯ์ ๋ํ ์์ ํ ์ฝ๋์ด๋ฉฐ, ๋ ๋์ ์์๋ฅผ ๊ฐ์ง PCG-DXS์ ๋๋ค.
#include <stdint.h>
__uint128_t x; // State
uint64_t c; // Additive constant
static inline uint64_t output(__uint128_t internal) {
uint64_t hi = internal >> 64;
uint64_t lo = internal;
lo |= 1;
hi ^= hi >> 32;
hi *= 0x9e3779b97f4a7c15;
hi ^= hi >> 48;
hi *= lo;
return hi;
}
static uint64_t inline next(void) {
__uint128_t old_x = x;
x = x * ((__uint128_t)1 << 64 ^ 0xd605bbb58c8abbfd) + c;
return output(old_x);
}
ํ๊ณ ์๋ ์ ํ๋ ์ถ๊ฐ ๋ช ๋ น์ด (65 ๋นํธ ์น์๋ก ์ธํด ๋ฐ์)์๋ก๋ ํ ๋ ๊ฐ์ 64 ๋นํธ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฐ ์ข ๋ฅ์ ๋ฐ์ ๊ธฐ๋ฅผ์ง์งํ์ง๋ ์์ง๋ง PCG65-DXSฯ๋ ์๊ด ๊ด๊ณ๋ฅผ ์จ๊ธฐ๋ ๋ฐ PCG-DXS๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
@Vigna , FYI, ๋ํ ์ธํฐ๋ฆฌ๋น ํ
์คํธ๋ฅผ ์ํ ํ ๊ฒฐ๊ณผ 128 ๊ฐ ์ด์์ ์ธํฐ๋ฆฌ๋ธ ์คํธ๋ฆผ์ ์์ฑ ํ ๋ xoshiro256 **์ด ๋ค์ ๋น ๋ฅด๊ฒ ์คํจํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. 256์ผ๋ก ๋น ๋ฅด๊ฒ ์คํจํ์ต๋๋ค. ํ
์คํธ์ ์์ ์ ๊ฐ ์คํธ๋ฆผ์ด ์ผ๋ถ ์ ํ ์ข
์์ฑ์ผ๋ก ์ด๊ธฐํ๋์์ ๋ PRNG๊ฐ ์ผ๋ง๋ ์ ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ๋ s[0]=s[1]=s[2]=s[3] = k1 + stream*k2
์ด๊ธฐํ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 12 ๊ฐ์ ์ถ๋ ฅ์ ๊ฑด๋ ๋ฐ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก sfc64๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค.
๋๋ ์ด๊ฒ์ด xoshiro์ ๊ถ์ฅ๋๋ ์ด๊ธฐํ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ธํฐ๋ฆฌ๋น ์คํธ๋ฆผ์ด ๊ฑฐ์์๋ xoshiro์ ๋ํด์๋ ํ ์คํธ๊ฐ ๊ด์ฐฎ์ ๋ณด์์ง๋ง ๋ง์ ๊ฒฝ์ฐ ์คํจํ๋ค๋ ๊ฒ์ด ์ฌ์ ํ ํฅ๋ฏธ๋กญ๊ณ ์ฝ๊ฐ ๊ฑฑ์ ๋ฉ๋๋ค.
seed: 1591888413
RNG_test using PractRand version 0.95
RNG = RNG_stdin64, seed = unknown
test set = core, folding = standard (64 bit)
...
rng=RNG_stdin64, seed=unknown
length= 2 gigabytes (2^31 bytes), time= 29.6 seconds
Test Name Raw Processed Evaluation
[Low1/64]FPF-14+6/16:(1,14-1) R= +7.2 p = 3.7e-6 unusual
[Low1/64]FPF-14+6/16:all R= +9.6 p = 1.8e-8 very suspicious
...and 261 test result(s) without anomalies
rng=RNG_stdin64, seed=unknown
length= 4 gigabytes (2^32 bytes), time= 55.5 seconds
Test Name Raw Processed Evaluation
[Low1/64]FPF-14+6/16:(0,14-0) R= +13.4 p = 4.7e-12 VERY SUSPICIOUS
[Low1/64]FPF-14+6/16:(1,14-0) R= +9.4 p = 2.6e-8 suspicious
[Low1/64]FPF-14+6/16:(2,14-1) R= +7.7 p = 1.3e-6 unusual
[Low1/64]FPF-14+6/16:all R= +17.4 p = 8.8e-16 FAIL !
...and 275 test result(s) without anomalies
๋ํ SFC64 ๋ฐ TYLO64์ ์ด๊ธฐํ๋ฅผ ์ฝํ์์ผ 2 ๊ฐ์ ์ถ๋ ฅ ๋ง ๊ฑด๋ ๋ฐ๋ ค๊ณ ํ์ง๋ง ์ฌ์ ํ ๊ด์ฐฎ์ ๋ณด์์ต๋๋ค.
์ฑ๋ฅ : xoshiro256 **์ ๋ค๋ฅธ ๋ ์ปดํจํฐ๋ณด๋ค ๋ด ์ปดํจํฐ์์ 33 % ๋๋ฆฌ๊ฒ ์คํ๋ฉ๋๋ค. TYLO64๋ 196 ๋นํธ์ ์ํ ๋ณ์ ๋ง ์
๋ฐ์ดํธํฉ๋๋ค. ๋ค์์ ํ
์คํธ ํ๋ก๊ทธ๋จ์
๋๋ค.
int main()
{
//FILE* f = freopen(NULL, "wb", stdout); // Only necessary on Windows, but harmless.
enum {THREADS = 256};
uint64_t seed = 1591888413; // <- e.g. this fails. // (uint64_t) time(NULL);
fprintf(stderr, "seed: %lu\n", seed);
static tylo64_t tyl[THREADS];
static sfc64_t sfc[THREADS];
static uint64_t xo[THREADS][4];
for (size_t i = 0; i < THREADS; ++i) {
tyl[i] = tylo64_seed(seed + (12839732 * i), 19287319823 * i);
sfc[i] = sfc64_seed(seed + (12839732 * i));
xo[i][0] = xo[i][1] = xo[i][2] = xo[i][3] = seed + (12839732 * i);
for (int j=0; j<12; ++j) xoshiro256starstar_rand(xo[i]);
}
static uint64_t buffer[THREADS];
size_t n = 1024 * 1024 * 256 / THREADS;
while (1/*n--*/) {
for (int i=0; i<THREADS; ++i) {
//buffer[i] = tylo64_rand(&tyl[i]);
//buffer[i] = sfc64_rand(&sfc[i]);
buffer[i] = xoshiro256starstar_rand(xo[i]);
}
fwrite((void*) buffer, sizeof(buffer[0]), THREADS, stdout);
}
return 0;
}
๊ด๋ จ ํค๋ ์ฝ๋๋ฅผ ํฌํจํ๊ฒ ์ต๋๋ค.
typedef struct {uint64_t a, b, w, k;} tylo64_t; // k = stream
static inline uint64_t tylo64_rand(tylo64_t* s) {
enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
const uint64_t b = s->b, w = s->w, out = (s->a + w) ^ (s->w += s->k);
s->a = (b + (b << LSHIFT)) ^ (b >> RSHIFT);
s->b = ((b << LROT) | (b >> (64 - LROT))) + out;
return out;
}
/* stream in range [0, 2^63) */
static inline tylo64_t tylo64_seed(const uint64_t seed, const uint64_t stream) {
tylo64_t state = {seed, seed, seed, (stream << 1) | 1};
for (int i = 0; i < 12; ++i) tylo64_rand(&state);
return state;
}
static inline uint64_t rotl(const uint64_t x, int k) {
return (x << k) | (x >> (64 - k));
}
static inline uint64_t xoshiro256starstar_rand(uint64_t* s) {
const uint64_t result = rotl(s[1] * 5, 7) * 9;
const uint64_t t = s[1] << 17;
s[2] ^= s[0];
s[3] ^= s[1];
s[1] ^= s[2];
s[0] ^= s[3];
s[2] ^= t;
s[3] = rotl(s[3], 45);
return result;
}
@ tylo-work ๋ถ์์ ๊ฐ์ฌํ์ง๋ง ์ง์คํ๊ธฐ ์ํด์ด ๋ฌธ์ ๊ฐ ์ ๋ง๋ก ํ์ํฉ๋๋ค. ์ด ํ ๋ก ์ ๊ณ์ํ๊ณ ์ถ๋ค๋ฉด ์์ ์ Github ์ ์ฅ์์ ์์ ์ ๊ฒ์ํ๊ณ ์ฌ๊ธฐ์ ์ฌ๋๋ค์ ์ด๋ํ๋ ๊ฒ์๋ฌผ์ ํ๋ ๋ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ ์ธ ๋ชจ๋ ๊ฑฐ๊ธฐ์์ ์๋ต ํด์ฃผ์ญ์์ค. ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@imneme @rkern Time์ 1.19 ๋ฆด๋ฆฌ์ค์์ ์คํ ์ค์ ๋๋ค.
@rkern PCG64DXSM์ด 1.19.0์ผ๋ก ์ง์ ํ์ง ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฒ ์ฃผ๋ง์ ์ถ์ ํ ์์ ์ ๋๋ค. ์์์ ์ธ๊ธ ํ ๋ณ๊ฒฝ ์ ์ฑ / ์์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋ฉ๋ชจ๋ฅผ ์์ฑํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ค๋ฅธ ๊ด๋ จ์๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค. ํ ๋ก ์ ๋ฐ๋ฅด๋ฉด PCG64DXSM์ ์๋ก์ด ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๋์ฒด ์ต์ ์ผ๋ก ๊ณํ ๋์๊ธฐ ๋๋ฌธ์ ์์ ์ง์ฐ์ด ํฐ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค (์ ์ด๋ ํ์ฌ๋ก์๋).
์ด์ 1.20์ด ์์๋์์ผ๋ฏ๋ก ์ด๊ฒ์ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ DXSM์ผ๋ก ์ด๋ํ ๋์ ๋๊น?
๋ถ๊ธฐํ๊ธฐ ์ ์ ์ด๋์ ์ํ ํ ์๊ฐ์ด ์์ง๋ง ๋ค์ ์ฃผ ์ ๋ ์ด๋ด์ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. @bashtage ๋๋ ๋น์ ์ด PCG64DXSM
์ค๋น๊ฐ ๋์๋ค๊ณ ์๊ฐํ๊ณ ์ด๊ฒ์ ์ฃผ๋ก ๊ธฐ๋ณธ ์คํธ๋ฆผ์์ ์ค์์น๋ฅผ ๋ค์ง๋ ๊ฒฐ์ ์ด ํ์ํฉ๋๊น?
๋ณด์๋ค์ํผ ์ฐ๋ฆฌ๊ฐ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค๋ฉด 1.20์ ์ํด ์ด๊ฒ์ํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ ธ์ต๋๋ค.
IIRC, ์ฐ๋ฆฌ๋ ๋งํฌ ๋ ์์๋ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ ์ฌ๋๋ค์ด ๋ณํ์ ๋ง์กฑํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํด์ผํฉ๋๋ค. Windows ์ฉ ํน์ ์ฝ๋๊ฐ ํ์ํฉ๋๊น?
๊ทธ๊ฒ์ ๋จ์ง ๋ค๋ฅธ ์์์ด๊ณ ๋ค๋ฅธ ์คํฌ๋จ๋ธ๋ง ๊ธฐ๋ฅ์ ๋๋ค. @rkern Windows์์ ์๋ PCG64 ๊ตฌํ์ ์ด ๊ฒ๋ณด๋ค ๋ ๋ง์ ์๋ก์ด ์๋ฌด๊ฒ๋ ์์ต๋๋ค. (์ฑ๋ฅ์ ์ํด) ์ผ๋ถ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ๋ณด๋ค๋ ์์ ํ ๋ ๋ฆฝํ PCG64DXSM์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
rkern์ WIP ์ง์ ์์ ์์ํ๋
@rkern์ด ์ํ๋ค๊ณ ์๊ฐํ๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๊ฒ ๋ค๊ณ ๋งํ์ง๋ง ๋ค๋ฅธ ๋ฌธ์ ์ ์ฐธ์ํด ์์ง๋ง ์์ง ๋ฐ์ํ์ง ์์์ต๋๋ค (์ฃ์กํฉ๋๋ค). ๊ทธ ๋์ DXSM ์์ด์ ํ ์คํธ ์ค์ด๋ฉฐ ๊ณ์ํด์ ์๋ณธ๋ณด๋ค ๊ฐ์ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ค๋ ๋์ ์ด๊ธฐ ๋ฐ์ธ์์ @rkern ์ด ๋ ๊ฐ๋ ฅํ ์ถ๋ ฅ ์์ด์ ์ข์ํ์ ์๋ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ๊ฒํ๋ฉด ์๋๊ฐ