Numpy: Numpy๊ฐ€ ์ œ๊ณตํ•˜๋Š” PCG ๊ตฌํ˜„์—๋Š” ์ค‘์š”ํ•˜๊ณ  ์œ„ํ—˜ํ•œ ์ž๊ธฐ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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 .

numpy.random

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

@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๋ฅผ ์ž‘์„ฑ ํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ _ ์ •ํ™•ํ•˜๊ฒŒ _ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์ •์ด์ง€๋งŒ, ์ƒ์ˆ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

./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์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์˜ํ•ด์•ผ ํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๋ฏธ ์˜ค๋ž˜ ์ „์— ๊ทœ์น™์„ ์ •ํ•ด ๋†“์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์–ตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.


๋‚˜๋Š”์ด ๋…ผ์˜๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š์ง€๋งŒ, ์•Œ์•„ ๋‚ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•œ ์ง„๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•˜๊ณ , ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋กœ๋ฒ„ํŠธ๋ฅผ ์‹ ๋ขฐํ•ด์•ผํ•˜๊ณ  ์ง€๊ธˆ ๋‹น์žฅ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ํ•œ ๊ทธ๊ฒƒ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? (์ฆ‰, ์‹ค์ œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์€ NumPy๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜์žˆ๋Š” ์–ด๋–ค ๊ฒƒ๋ณด๋‹ค ํฐ ํ™˜๊ฒฝ์—์„œ๋„ ๋ถ€๋„๋Ÿฝ๊ฒŒ ๋‚ฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)
  2. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„์ˆ ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐ ์ง€์› [...] ๋ฐ : 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๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•œ ์ง„๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•˜๊ณ , ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋กœ๋ฒ„ํŠธ๋ฅผ ์‹ ๋ขฐํ•ด์•ผํ•˜๊ณ  ์ง€๊ธˆ ๋‹น์žฅ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ํ•œ ๊ทธ๊ฒƒ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? (์ฆ‰, ์‹ค์ œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์€ NumPy๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜์žˆ๋Š” ์–ด๋–ค ๊ฒƒ๋ณด๋‹ค ํฐ ํ™˜๊ฒฝ์—์„œ๋„ ๋ถ€๋„๋Ÿฝ๊ฒŒ ๋‚ฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)

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

๋‚˜์ค‘์— ๋” ์˜ค๋ž˜ ์“ธ ๊ฒƒ์ด์ง€๋งŒ,์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ณผ ๋•Œ ์šฐ๋ฆฌ๋Š” ์ž‘๋…„์— ๋‹ค๋ฃฌ ๋•…์„ ๋‹ค์‹œ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. Sebastiano๊ฐ€ NumPy๊ฐ€ PCG๋ฅผ ์ถœ์‹œํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌ ํ•œ ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž‘๋…„ NumPy ํŒ€์˜ ๋ถ„์„์€ ๋” ์‹ฌ์ธต์ ์ด์—ˆ๊ณ  ๋” ๊ทธ๋Ÿด๋“ฏํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๊ธฐ๋ณธ๊ฐ’์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๊ฐ๊ฐ€ ์ƒ๊ฐ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๋ง๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@imneme- ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค-๋” ๊ธด ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๋ง์ด ๋จธ๋ฆฟ์†์— ์žˆ์—ˆ์ง€๋งŒ 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 ๊ฐ€์žˆ๋Š” ํ‘œ์ค€ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.

https://github.com/numpy/numpy/blob/ad30b31af0bb3fbfdc0f11486807edc76cec2680/numpy/random/src/sfc64/sfc64.h#L25 -L33

๊ธฐ๋ณธ 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 ์ด ๋” ๊ฐ•๋ ฅํ•œ ์ถœ๋ ฅ ์ˆœ์—ด์„ ์ข‹์•„ํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ์†๋„๊ฐ€

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