Numpyã䜿çšããPCGãžã§ãã¬ãŒã¿ãŒã«ã¯ãããªãã®éã®èªå·±çžé¢ããããŸãã ã€ãŸããã·ãŒãããçæãããåã·ãŒã±ã³ã¹ã«ã¯ãä»ã®ã·ãŒãããéå§ãããçžé¢ã®ããéè€ããªãã·ãŒã±ã³ã¹ãå€æ°ãããŸãã ãçžé¢ããšã¯ããã®ãããª2ã€ã®ã·ãŒã±ã³ã¹ãã€ã³ã¿ãŒãªãŒãããçµæããã¹ããããšãåã·ãŒã±ã³ã¹ã«åå¥ã«è¡šç€ºãããªãã£ãé害ãçºçããããšãæå³ããŸãã
å€æ°ã®ç«¯æ«ã»ãããã2ã€ã®ãžã§ãã¬ãŒã¿ãŒããããã®ã·ãŒã±ã³ã¹ã®ãã¡ã®2ã€ãååŸãã確çã¯ç¡èŠã§ããŸããã æ°åŠçãªèŠ³ç¹ãããããçºçããçç±ã¯ããç¥ãããŠããŸãããããã§è©³çŽ°ã«èª¬æãããŠããŸãïŒ http ïŒ ãµãã·ãŒã±ã³ã¹ããåç §ïŒã
ãã®åé¡ãçŽæ¥ç€ºãããã«ãNumpyã³ãŒããåå©çšããŠãã®åçŽãªCããã°ã©ã ãäœæããŸããïŒ http ïŒ
./intpcgnumpy 0x596d84dfefec2fc7 0x6b79f81ab9f3e37b 0x8d7deae980a64ab0 0x6b79f81ab9f3e37b | stdbuf -oLã / svn / c / xorshift / practrand / RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
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
2ã€ã®ãžã§ãã¬ãŒã¿ãŒã2ã€ã®çžé¢ã·ãŒãïŒã©ã³ãã ã«éžæïŒããéå§ãã確çã50ïŒ ä»¥äžååŸããã«ã¯ãã©ã³ãã ã«éå§ãããžã§ãã¬ãŒã¿ãŒãçŽ50äžåå¿ èŠã§ããããšã«æ³šæããŠãã ããïŒèªçæ¥ã®ãã©ããã¯ã¹ïŒã ãããŠãããããæ£ç¢ºã«åãç¶æ ããéå§ããããã§ã¯ãªãããææã«éè€ããçžé¢ã·ãŒã±ã³ã¹ãããå¯èœæ§ãèæ ®ãããšãå¿ èŠãªãã®ã¯ã¯ããã«å°ãªããªããŸãã
æç®ããã®è³¢æãªãžã§ãã¬ãŒã¿ãŒã¯ããã®ããã«åäœããŸããã éã«ãMRG32k3aãSFC64ãCMWCãxoshiro256 ++ãªã©ã®ä»»æã®2ã€ã®éå§ç¶æ ãéžæã§ããŸããéè€ããªãã·ãŒã±ã³ã¹ãçæããéããäžèšã®é害ã¯çºçããŸããã ããã¯ãå€ãã®ããã€ã¹ããžã§ãã¬ãŒã¿ãŒã䜿çšãããšãã«çºçããå¯èœæ§ã®ãã倧ããªæ¬ ç¹ã§ããããã¢ããšã«ãããã®ã·ãŒã±ã³ã¹ãçžé¢é¢ä¿ã瀺ãã¹ãã§ã¯ãªããšæ³å®ããŸãã çžé¢é¢ä¿ã¯ãæ€åºãé£ããæãŸãããªãåäœãåŒãèµ·ããå¯èœæ§ããããŸãã
å°ãªããšãããžã§ãã¬ãŒã¿ãè€æ°ã®ç«¯æ«ãé«åºŠã«äžŠååãããç°å¢ã§äœ¿çšããŠã¯ãªããªãããšãã©ããã«ææžåããŠãã ããã
å æ³å®æ°ãå€æŽããããšã«ãã£ãŠLCGã«ãã£ãŠçæãããã·ãŒã±ã³ã¹ã¯ã笊å·ã®å€æŽãšå æ³å®æ°ãæ³ãšããŠãã¹ãŠåãã§ãããããç°ãªããã¹ããªãŒã ãã§ãåãããšãçºçããå¯èœæ§ããããŸãã ããã§ããã€ãã®è°è«ãèŠãããšãã§ããŸãïŒ https ïŒ https ïŒ //arxiv.org/abs/2001.05304 ã
@imnemeã@bashtageã@rkernã¯ããåœå±ã ããããç§ãã¡ã¯ããã®äžã§è¡ã£ãŠãããšæãããç§ãã¡ã奜é©ãªããããSeedSequence.spawn
è¶
ããã€ã³ã¿ãŒãã§ãŒã¹jumped
äžã€ã ããšãã°ãAPIã«ã€ããŠè©±ãåã£ãŠãããšãã«https://numpy.org/devdocs/reference/random/parallel.htmlã®ã¢ããã€ã¹ã確èªããå¿
èŠã«å¿ããŠæ¹åãææ¡ããŠ
@mattipããã¯ãžã£ã³ããšã¯äœã®é¢ä¿ããããŸããã
ããã¥ã¡ã³ããæ¹åããããšã¯åžžã«è¯ãèãã§ãããå®éã«ã¯å€§èŠæš¡ãªå€æŽãå ããããšã¯é£ãããšæããŸãã
ç§ã¯ããããæšèŠAESCounter
AES-NIãŸãã¯ãæã€äººã®ããã®SPECK128
ãé«åºŠã«äžŠåèšå®ã§ãªãã«ã誰ã®ããã«ã
å æ³å®æ°ãå€æŽããããšã«ãã£ãŠLCGã«ãã£ãŠçæãããã·ãŒã±ã³ã¹ã¯ã笊å·ã®å€æŽãšå æ³å®æ°ãæ³ãšããŠãã¹ãŠåãã§ãããããç°ãªããã¹ããªãŒã ãã§ãåãããšãçºçããå¯èœæ§ããããŸãã
ãããå®éåã§ããŸããïŒ åãå¢åã䜿çšããŠé害ãè€è£œã§ããŸãããå¢åãšç¶æ ãã·ãŒããã2ã€ã®ç°ãªãã©ã³ãã ãªå¢åã§é害ããŸã 芳å¯ããŠããŸããã å¢åã泚ææ·±ãäœæããå¿ èŠãããå Žåãããã¯å®éã®èªçæ¥ã®è¡çªé »åºŠã«åœ±é¿ããŸãã
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
OKãããäžåºŠããçŽããŸãã
2ä¹ã®ä¿æ°ãæã€LCGã«ã¯è€æ°ã®ã¹ããªãŒã ã¯ãããŸããã å€ãã®äººãåæã®é ã«ãããä¿¡ããŠããŸããããããŠãããã®ãã¹ããªãŒã ãã§é¢çœãããšããããšäž»åŒµããé·ãå€ãè«æãããããŸãããããå®æ°ãå€ããããšã«ãã£ãŠããªããåŸãè»éã¯_ãã¹ãŠåãã¢ãžã¥ãå ç®ã§ããããšãäœå幎ãã®éç¥ãããŠããŸãå®æ°ã§ãå Žåã«ãã£ãŠã¯ç¬Šå·ã®å€æŽ_ã ç§ãããããã©ãããšãã§ããæãé ãã®ã¯
Mark J. Durstã䞊åä¹±æ°çæã«ç·åœ¢ååæ³ã䜿çšã
1989 Winter Simulation Conference ProceedingsãIEEE Pressã1989幎ã462ã466ããŒãžã
ããã§ã次ã®ããã«èšå®ã§ããå¥ã®ããã°ã©ã http://prng.di.unimi.it/corrpcgnumpy.cãäœæããŸããã
ã€ãŸããããã¯æåã®ããã°ã©ã ã®èšå®ã§ãããå®æ°ãéžæããããšãã§ããŸãã
./corrpcgnumpy 0x596d84dfefec2fc7 0x6b79f81ab9f3e37b 0xac9c8abfcb89f65f 0xe42e8dff1c46de8b 0x8d7deae9efec2fc7 0x6b79f81ab9f3e37b 0x06e13e5e8c92c843 0xf92e8346feee7a21 56 | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
rng=RNG_stdin, seed=unknown
length= 4 gigabytes (2^32 bytes), time= 113 seconds
Test Name Raw Processed Evaluation
[Low1/8]BCFN(0+0,13-1,T) R= +27.2 p = 4.0e-14 FAIL
[Low1/8]DC6-6x2Bytes-1 R= +10.9 p = 4.4e-6 suspicious
[Low1/64]DC6-5x4Bytes-1 R= -6.4 p =1-1.4e-4 unusual
[Low8/64]FPF-14+6/64:(0,14-0) R= +8.4 p = 2.2e-7 mildly suspicious
[Low8/64]FPF-14+6/64:all R= +8.7 p = 1.2e-7 suspicious
[Low8/64]FPF-14+6/32:(0,14-0) R= +10.2 p = 5.1e-9 suspicious
[Low8/64]FPF-14+6/32:all R= +9.4 p = 2.7e-8 very suspicious
[Low8/64]FPF-14+6/16:all R= +5.8 p = 6.4e-5 unusual
...and 1439 test result(s) without anomalies
ãããã£ãŠããã¹ããªãŒã å®æ°ããã©ã®ããã«éžæããŠããåãå®æ°ã®å ŽåãšãŸã£ããåãããã«ãå°ãªããšã_ 2 ^ 72ã®çžé¢ãµãã·ãŒã±ã³ã¹ããããŸãã
ãããŠããžã§ãã¬ãŒã¿ãŒã«ã¯ãšãã§ããªãéã®ã¹ã©ãã¯ãäžããããŸããç§ãèšç®ããŠããæ£ç¢ºãªéå§ç¹ã®ä»£ããã«ãå°ãååŸã®ç¶æ ã䜿çšãããšããŠãããšã«ããçžé¢é¢ä¿ã衚瀺ãããŸãã ãããè¡ãããã®è¿œå ãã©ã¡ãŒã¿ã䜿çšããŠãããã°ã©ã ãç°¡åã«å€æŽã§ããŸãã
ç¹°ãè¿ããŸãããç§åŠæç®ã®æ¢åã®ææ°ã®çºé»æ©ã«ã¯ãã®ãããªåäœã¯ãããŸããïŒãã¡ããã2ã®çŽ¯ä¹ã®LCGã«ã¯ãã®åäœããããŸãããç¥ã®ããã«ãããã¯ææ°ã®çºé»æ©ã§ã¯ãããŸããïŒã
Sabastianoã®PCGã«å¯Ÿããæ¹å€ã¯ã2018幎ã®ãã®ããã°æçš¿ã§åãäžããããŠããŸãã
çãããŒãžã§ã³ã§ã¯ãç¹å®ã®ã·ãŒããèæ¡ããããšãèš±å¯ãããŠããå Žåãã»ãšãã©ãã¹ãŠã®PRNGãããèŠæ ãã®æªããåäœã瀺ãããšãã§ããŸãã PCGã¯ã©ãããããããŠããŒã¯ã§ãããšãã圌ã®äž»åŒµã«ãããããããå®éã«ã¯PCGã¯ããªãåŸæ¥åã§ããPCGã®ã¹ããªãŒã ã¯ãããšãã°ãåºã䜿çšãããŠããå¥ã®PRNGã§ããSplitMixã®ã¹ããªãŒã ãããæªãã¯ãããŸããã
ããã¯å®å šã«èª€ãã§ãã ç§ãééã£ãŠããããšã蚌æããããã«ãMRG32k3aãŸãã¯xoshiro256 ++ããã®2ã€ã®çžé¢ããéè€ããªãã·ãŒã±ã³ã¹ã瀺ããŸãã
éè€ããªããšèšã£ãããšã¯ãããŸããã xoshiro256 ++ã§çŸåšå©çšå¯èœãªãã¹ããèŠããŠãã ããã 2ã€ã®ã·ãŒããéè€ãåé¿ããããšã
å¯Ÿç §çã«ãç§ã¯ããªãã瀺ãããçžé¢é¢ä¿ããæ¬è³ªçã«éè€ã®åœ¢ã§ããããšã瀺ãPCGã®ãã¹ããæã£ãŠããŸãã
ãæ¬è³ªçã«ããããã©ãŒã ãã®ããã«FUDãšæŠãããšã¯ã§ããŸãããã httpïŒ//prng.di.unimi.it/intpcgnumpy.cãå€æŽããŠãæåã«åPRNGã100ååç¹°ãè¿ãããšã©ãŒã§çµäºããããã«ããŸãããçæãããã·ãŒã±ã³ã¹ãä»ã®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 ++ã§çŸåšå©çšå¯èœãªãã¹ããèŠããŠãã ããã 2ã€ã®ã·ãŒããéè€ãåé¿ããããšã
ããããªããšã§ããã¹ããªãŒã ã®é·ãã決å®ããç¹°ãè¿ãã2ã€ã®ã¹ããªãŒã ãåæç¶æ ãšäº€å·®ããªãããšã確èªããŸãã ããã¯ãããã°ã©ã http://prng.di.unimi.it/intpcgnumpy.cã§çžé¢PCGã¹ããªãŒã ãéè€ããªãããšã瀺ãããã«äœ¿çšããã®ãšåãã³ãŒãã§ãã
PCGã¯ã©ãããããããŠããŒã¯ã§ãããšãã圌ã®äž»åŒµã«ãããããããå®éã«ã¯PCGã¯ããªãåŸæ¥åã§ããPCGã®ã¹ããªãŒã ã¯ãããšãã°ãåºã䜿çšãããŠããå¥ã®PRNGã§ããSplitMixã®ã¹ããªãŒã ãããæªãã¯ãããŸããã
ç§èŠãPCGå ã®èªå·±çžé¢ã¯ã¯ããã«æªãã§ãã LCGã«é¢ããããŒã¹ãã®åçãª1989幎ã®çµæã«é¡äŒŒãããSplitMixã€ã³ã¹ã¿ã³ã¹ã®åºç€ãšãªãå æ³ãžã§ãã¬ãŒã¿ãŒã®çµæã¯ãããŸããã
ããããSplitMixã®éåžžã«è»œåºŠã®åé¡ã¯ç¥ãããŠããã JEP 356ã¯ããããã®åé¡ã«å¯ŸåŠããããšããæ°ããã¯ã©ã¹ã®åå²å¯èœãžã§ãã¬ãŒã¿ãŒLXMãæäŸããŸãã PCGã«ç§»ããæ¬ é¥ã®å°ãªããã®ã«äº€æããæãæ¥ãŸããã
æ ¹æ¬çãªåé¡ã¯äž¡æ¹ã®ãžã§ãã¬ãŒã¿ãŒã§ç¥ãããŠãããç¶æ ã®çµã¿åãããäžè¶³ããŠããããšãåå ã§ãã ãããã®ãžã§ãã¬ãŒã¿ãŒã®1ã€ã®ç¶æ ã®ããã_k_ãå€æŽããå Žåãå€æŽãããã_k_ããäžã«äŒæããããšã¯ãããŸããã ããã¯ããã©ã€ã ã¢ãžã¥ã©ã¹ãæã€LCGãF2ç·åœ¢ãžã§ãã¬ãŒã¿ãŒãCMWCãžã§ãã¬ãŒã¿ãŒãªã©ã§ã¯çºçããŸãããä»ã®ãã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã¯ãå¯èœãªéãè¿ éãã€å¯èœãªéãç¶æ ãæ··åããããšããŸãã
PCGãšSplitMixã®åé¡ãåäžèŠããããšã¯ãçã£èµ€ãªãã·ã³ã§ãã SplitMixã«ã¯ãéåžžã«åçŽãªåºç€ãšãªããžã§ãã¬ãŒã¿ãŒããããè¿œå æ©èœããããŸãããããã«å ããŠãéåžžã«åŒ·åãªã¹ã¯ã©ã³ããªã³ã°é¢æ°ããããŸããããã¯ãApplebyã®MurmurHash3ããã·ã¥é¢æ°ã®64ããããã¡ã€ãã©ã€ã¶ãŒã§ãããã¹ã¿ããã©ãŒãïŒhttp://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.htmlïŒã«ãã£ãŠæ¹åãããŸããã é¢æ°ã®å®æ°ã¯ãç¹å®ã®æž¬å®å¯èœãªãªã ãç¹æ§ãæã€ããã«ãã¬ãŒãã³ã°ãããŠããŸãã å°æ°ã®ãããã®å€æŽã§ããããã¹ãŠã®åºåã«åºããåŸåããããŸãã èšãæããã°ãSplitMixã¯å·šäººã®è©ã®äžã«ç«ã£ãŠããŸãã
ããã©ããããPCGãžã§ãã¬ãŒã¿ãŒã®åºç€ãšãªãLCGã«ãåãæ··åäžè¶³ã®åé¡ããããŸãããã¹ã¯ã©ã³ããªã³ã°é¢æ°ã¯ãçè«çãŸãã¯çµ±èšçãªä¿èšŒãªãã«ãäœæè ãçµã¿ç«ãŠãç®è¡æŒç®ãšè«çæŒç®ã®åçŽãªã·ãŒã±ã³ã¹ã§ãã åºç€ãšãªãLCGã®ãã¹ãŠã®ã·ãŒã±ã³ã¹ããå æ³å®æ°ãšå Žåã«ãã£ãŠã¯ç¬Šå·ã®å€åãæ³ãšããŠåãã§ãããšããäºå®ã«æ³šæããŠèæ¡ãããŠããã°ãåé¡ã«å¯ŸåŠããããšãã§ããã¯ãã§ãã
ããããäœè ã¯ãã·ãŒã±ã³ã¹ãäºãã«ç°¡åã«å°åºã§ããããšãç¥ããŸããã§ããã ããã¯ãPCGãã¯ãã«ã«ã¬ããŒãïŒhttps://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdfïŒã®ã»ã¯ã·ã§ã³4.2.3ã®ãã®ã¹ããŒãã¡ã³ãããç°¡åã«ç¢ºèªã§ããŸãã
ã_c_ãéžæãããã³ã«ãå¥ã®ã·ãŒã±ã³ã¹ãšå ±éã®é£ç¶ããåºåã®ãã¢ããªããç°ãªãçªå·ã®ã·ãŒã±ã³ã¹ãçæãããŸããã
ããã¯ãã·ãŒã±ã³ã¹ãç°ãªãããšãã€ãŸããåºã«ãªãLCGãè€æ°ã®ã¹ããªãŒã ãæäŸããããšã®èšŒæ ãšèŠãªãããŸãã ãã®ãããã¯ã«é¢ããããŒã¹ãã®1989幎ã®åŠå®çãªçµæã¯ãè«æã®ã©ãã«ãçŸããŠããŸããã åã«è¿°ã¹ãããã«ããããã®çµæã«ããããã®ãããªã·ãŒã±ã³ã¹ã¯ãã¹ãŠåãã§ãããå æ³å®æ°ãæ³ãšããŠãå Žåã«ãã£ãŠã¯ç¬Šå·ãå€åããŸãïŒPCGã§çºçããããã«ãæ倧ââå¹åã®2ã®çŽ¯ä¹ä¿æ°ãæã€LCGã®å ŽåïŒã
ããŒã¹ãã®çµæãåŒçšããªãã®ã¯ãèª å®ãªãééãã ãšç¢ºä¿¡ããŠããŸãããåé¡ã¯ã䜿çšããŠããåºã«ãªãLCGããããæå³ã§ãç°ãªãããã¹ããªãŒã ããæäŸããŠãããšç¢ºä¿¡ãããšãããã§ãªãå Žåã¯æçµçã«ãªãããšã§ãã PCGã®ãããªãžã§ãã¬ãŒã¿ãŒã䜿çšãããšããã¹ããªãŒã ããå€æŽããå Žåã§ãããµãã·ãŒã±ã³ã¹ããšã«2 ^ 72ã®éè€ããªãçžé¢ãµãã·ãŒã±ã³ã¹ãååšããŸãã
ãæèŠããããšãããããŸããã ä»ã®ãšããããPCGã¯è¯ã/æªããã®ãããªäºå çãªå€æã«ã¯èå³ããããŸããã ãã®ãããªè°è«ã®ããã«ããªãèªèº«ã®ãã©ãŒã©ã ã䜿çšããŠãã ããã ããã§è©±é¡ã«ãªã£ãŠããã®ã¯ãnumpyãäœããããã§ããããã®æçµçãªå€æã¯numpyã®éçºè ã«ãããŸãã çããããã®è°è«ã«ãããããå°éç¥èã«æè¬ããŸãããæçµçãªå€æã§ã¯ãªããæ ¹æ¬çãªäºå®ã«çŠç¹ãåœãŠãããšæããŸãã ç§ã¯ç¹ã«ãç§ãã¡ãæã£ãŠãããããã«ãŒã ã®éã®ã¢ã€ãã¢ãç§ã«äžããå®éçãªã¹ããŒãã¡ã³ãã«æè¬ããŸãã 以åã®å€æãééã£ãŠããã®ã¯ãå€æã«é£ã³ã€ãã®ãæ©ãããããã§ãã®ã§ããŸãé¿ããŠããã ããããšæããŸãã ããããšãããããŸããã
2ã€ã®ãžã§ãã¬ãŒã¿ãŒã2ã€ã®çžé¢ã·ãŒãïŒã©ã³ãã ã«éžæïŒããéå§ãã確çã50ïŒ ä»¥äžååŸããã«ã¯ãã©ã³ãã ã«éå§ãããžã§ãã¬ãŒã¿ãŒãçŽ50äžåå¿ èŠã§ããããšã«æ³šæããŠãã ããïŒèªçæ¥ã®ãã©ããã¯ã¹ïŒã
@vignaãã®èšç®ã«ã€ããŠæããŠããã ããŸããïŒ ç§ã粟éããŠããèªçæ¥ã®è¡çªèšç®ã§ã¯ã 2**(n/2)
ã¢ã€ãã ã§n
ãããã®è¡çªã50ïŒ
çºçããå¯èœæ§ããããŸãïŒ2ã®å æ°ãäžãããåãïŒã 50äžãã«ã¯2**19
ãªã®ã§ãå±éºãªçžé¢é¢ä¿ã¯äžäœãããã®40ãããååŸã®è¡çªããå§ãŸããšäž»åŒµããŠããããã§ããããããå®éã«èŠ³å¯ã§ãããšãã蚌æ ã¯èŠãŠããŸããã ãã¹ãããã£ã³ã»ã«ããåã«ãäžäœ40ããããå
±æãããã¢ããã¹ãããPractRandã§16TiBã«å°éããŸããã 40ãããã®è¡çªã«ããé害ã芳å¯ããå Žåãããã確èªããããã«ããã€ã®TiBããã¹ãããå¿
èŠããããŸãããïŒ
å¢åãå€æŽããŠããè¡çªã®ç¢ºçã«ã¯åœ±é¿ããªããšç¢ºä¿¡ããŠããŸãã ãPCGã¹ããªãŒã ãã®ã¡ãªããã«ã€ããŠã®ãã以äžã®è°è«ã¯ãããã¯ããå€ããŠããŸãã ãã®è°è«ããäœè ããç¹°ãè¿ãæ§ã§æã€èšãèš³ãšããŠäœ¿çšããããšã¯ç¹ã«æè¿ãããŠããããç§ãã¡ã®è¡åèŠç¯ãèžã¿ã«ãã£ãŠããŸãã æç¶ãããšããããšã¯ãããªãã®æèŠãªãã«é²ããªããã°ãªããªãããšãæå³ããŸãã ããããšãããããŸããã
@imnemeããã¯ã2ã®å€§ããªçŽ¯ä¹ã®åæ°ã§ãžã£ã³ããããŠããããã§ããåãå¢åã§PCG64
ã€ã³ã¹ã¿ã³ã¹ã®ãã¢ãäœæããäžäœã®n
ãå
±æãããšãããã2ã€ã®éã§èšç®ããè·é¢ã¯1 << n
åæ°ã§ãã ãã匷åãªDXSM
åºåé¢æ°ãããã®çç¶ã解決ããŠããããã«èŠããŸãã ã€ã³ã¯ãªã¡ã³ããå
±æããPCG64DXSM
ã€ã³ã¹ã¿ã³ã¹ã®ãã¢ãšãç¶æ
ã®äžäœ64ãããã2TiBãŸã§åé¡ãªããã¹ãããŸããã
OKãããã¯æ¥ããããããšã§ããããã¯50åãã«ã§ã¯ãªãã5åãã«ã§ããã 1æåã§å€§ããªéããçãŸããŸãã ãã¹ãããè©«ã³ããŸãã
ããããå ã«è¿°ã¹ãããã«ãããã¯ãŸã£ããåãéå§ç¶æ ã«éãã確çã§ãããçžé¢ãããµãã·ãŒã±ã³ã¹ã®éãªãã倧ãããªã確çã§ã¯ãããŸããã å人çã«ã¯ãçžé¢ãµãã·ãŒã±ã³ã¹ã®ãªãPRNGã䜿çšããããšã奜ã¿ãŸãããªããªãããããã¯ããããããããã§ãããããªããæ£ããèšãããã«ã決å®ã¯ããªãã ãã§ãã
ã¹ã¯ã©ã³ããªã³ã°é¢æ°ãä¿®æ£ããŠããã·ã³ã°ç¹æ§ãåäžãããããšã¯ãå®å šã«åççãªè§£æ±ºçã®ããã«æããŸãã
ç§ã®æçš¿ã¯ãPCGãšSplitMixã®æ§é ã®éããæ確ã«ããããšãç®çãšããŠããŸããã以åã®æçš¿ã§ã¯ãåæ§ã®åé¡ããããšäž»åŒµããŠãããããããã¯æ£ããèšè¿°ã§ã¯ãªããšæããŸãã SplitMixçšã«http://prng.di.unimi.it/corrpcgnumpy.cã®ãããªããã°ã©ã ãäœæããããšã¯ã§ããŸããã
@rkern ãããªãã¯å°ããŸããïŒ
@imnemeããã¯ã2ã®å€§ããªçŽ¯ä¹ã®åæ°ã§ãžã£ã³ããããŠããããã§ããåãå¢åã§
PCG64
ã€ã³ã¹ã¿ã³ã¹ã®ãã¢ãäœæããäžäœã®n
ãå ±æãããšãããã2ã€ã®éã§èšç®ããè·é¢ã¯1 << n
åæ°ã§ãã ãã匷åãªDXSM
åºåé¢æ°ãããã®çç¶ã解決ããŠããããã«èŠããŸãã ã€ã³ã¯ãªã¡ã³ããå ±æããPCG64DXSM
ã€ã³ã¹ã¿ã³ã¹ã®ãã¢ãšãç¶æ ã®äžäœ64ãããã2TiBãŸã§åé¡ãªããã¹ãããŸããã
æšå¹Žã®ãã£ã¹ã«ãã·ã§ã³ã¹ã¬ãããèŠã€ããŠãªã³ã¯ããŠããã ãããããšãããããŸãã ã¯ããSebastianoã圌ã®å¿çã§è¿°ã¹ãŠããããã«ã
ã¹ã¯ã©ã³ããªã³ã°é¢æ°ãä¿®æ£ããŠããã·ã³ã°ç¹æ§ãåäžãããããšã¯ãå®å šã«åççãªè§£æ±ºçã®ããã«æããŸãã
XSL-RRã¯ç©äºã®åŒ±ç¹ã«ãããŸãã å¯Ÿç §çã«ãPCGããŒããŒããã®å ã®RXS-Måºåæ©èœãšæ°ããDXSMåºåæ©èœã¯ã©ã¡ããã¹ã¯ã©ã³ãã«ã®æ¹æ³ã§ããå€ãã®ããšãè¡ãã®ã§ããã®çš®ã®åé¡ã¯ç€ºããŸããã DXSMïŒæšå¹Žã®ãã®ã³ãããã§PCGãœãŒã¹ã«è¿œå ãããïŒã¯ãXSL-RRããã匷åã«ãªãããã«ç¹å¥ã«èšèšãããŸããããåæ§ã®æéããã©ãŒãã³ã¹ãåããŠããŸãïŒRXS-Mãåç §ãé ãïŒã æšå¹ŽãDXSMãããªãããŒãã«ãã¹ãããŸããããå®è¡ã®67æ¥åŸã«é·æéã®åé»ãçºçãããµãŒããŒãåæ¢ãïŒUPSã®ããããªãŒãæ¶èããŸããïŒããã¹ãã®å®è¡ãçµäºããŸãããããã®æç¹ã§ãéåžžã®äž¡æ¹ã§ããªãè¯å¥œã«èšŒæãããŸããããã¹ãïŒ128 TBã®åºåããã¹ããããŸããïŒããã³2 ^ 48ã®ãžã£ã³ãïŒ64 TBã®åºåããã¹ããããŸãããå®è¡é床ãé ãããïŒã
DXSMãèšèšããªããŠããRXS-Mãåé¡ãåŠçãããšãããã1ã€ã®è³ªåã¯ã代ããã«åŒ±ãXSL-RRé åã䜿çšããçç±ã§ããåºåé¢æ°ã§åžžã«éåžžã«åŒ·åãªãããã¹ã¯ã©ã³ããªã³ã°ã䜿çšããªãã®ã¯ãªãã§ããã çãã¯ãåºæ¬çã«ã¯ãµã€ã¯ã«ã«åž°çãããšããããšã§ãã ã¹ããŒãã¯äººã«ãšã£ãŠéèŠãªã®ã§ãå¿ èŠä»¥äžã«ã¹ã¯ã©ã³ãã«ããããªãããã«ããŸãã
圌ã®ã¢ãããŒããšç§ã®ã¢ãããŒãã«ã¯å€ãã®å ±éç¹ããããããããã¯ã»ãã¹ãã£ã¢ãŒããããç¥ã£ãŠããåé¡ã§ãã ç§ãã¡ã¯ãããããææ°ã®çµ±èšçæ€å®ïŒç§ã®å Žåã¯LCGã圌ã®å Žåã¯Marsagliaã®XorShift LFSRïŒã«å€±æãããé·ãé確ç«ãããã¢ãããŒããæ¡çšããã¹ã¯ã©ã³ãã«åºåé¢æ°ãè¿œå ããŠãããå©çšããŸãã ç§ãã¡ã¯äž¡æ¹ãšããã®åºåé¢æ°ãå®äŸ¡ã«ããããåªããŠããŸãããåºåé¢æ°ã§ãã¹ã¯ããããšããŠããåºç€ãšãªããžã§ãã¬ãŒã¿ãŒã®æ¬ é¥ãæããã«ãªã£ãŠãããšãããå°ãèŠã€ããŸããã 圌ã®å Žåãããã¯ç·åœ¢æ§ã®åé¡ã§ãã
ããããç§ã倧ãã«åã°ããæè¿ã®ç 究ã§ã圌ã¯ãŸããåºåé¢æ°ã«ãã£ãŠååã«ãã¹ã¯ãããŠããªãããã³ã°éã¿ã®åé¡ïŒç§èªèº«ã®é·å¹Žã®æžå¿µãåæ ããŠããïŒãæã£ãŠããLFSRããŒã¹ã®èšèšã®æ°ã瀺ããŸããã 圌èªèº«ã®ãžã§ãã¬ãŒã¿ãŒã¯åœŒã®ãã¹ãã«åæ ŒããŠããã®ã§ãããã¯äœãã§ããã2018幎ã«åœŒã®æ°ããxoshiro PRNGãèŠãŠãããšããäžã«ãããžã§ãã¬ãŒã¿ãŒããã®ããã³ã°éã¿ã®åé¡ã圌ã®åºåé¢æ°ãééããããã«èŠããŸããã ãã以æ¥ã圌ã¯æ°ããåºåé¢æ°ã§xoshiroãæ¹èšããŸããããããã§ããŸãããããšãé¡ã£ãŠããŸãïŒåœŒã¯ä»ã«ãããã€ãå€æŽãå ããã®ã§ããã®ãã¹ãããã°ã©ã ã§åŒ·èª¿ãããŠããç¹°ãè¿ãã®åé¡ãä¿®æ£ãããã®ã§ã¯ãªãã§ããããïŒïŒã
圌ã®çžé¢ããã°ã©ã ã«ã€ããŠã¯ã2018幎ã«åœŒãããŸããŸãªåé¡ïŒäžèªç¶ãªã·ãŒããªã©ïŒã§æžããããã°ã©ã ãå«ãPCGã®æ¹è©ã圌ã®ãŠã§ããµã€ãã«æ²èŒãããšãã«ãç§ã¯åæ§ã®ããã°ã©ã ã®æãå«ããSplitMixã§çžé¢ã¹ããªãŒã ãäœæããcorrsplitmix2.c
ãå«ããä»ã®é·ã確ç«ãããPRNGã®å Žåã ã»ãã¹ãã£ã³ããããã§ããªããšèšã£ããšãã«äœãæå³ããã®ãã¯ããããããŸãããã圌ã®æ°ããããã°ã©ã ã圌ã®ãã®ãšå®è³ªçã«ç°ãªããã©ããã確èªããããã«åœŒã®ãã¹ãããã°ã©ã ã詳ãã調ã¹ãæ©äŒããªãã£ãããšãèªããŸãæ°å¹Žåã«æžããã
ç§ã®ç解äžè¶³ãèš±ããŠãã ãã-ãããããã®æ®µéã§èª°ãã«èŠçŽã®çµè«ãæ±ããããšã¯ã§ããŸããïŒ ããã©ã«ãã®PCGãå®å šã§ãªãçŸå®çãªç¶æ³ã¯ãããŸããïŒ ããã©ã«ããåãæ¿ããããã®åŒæ°ã¯äœã§ããïŒ
ç°¡åãªæ¹æ³ã¯ãé«ïŒè¶ é«ïŒïŒæ¬¡å ã®ã¢ããªã±ãŒã·ã§ã³ãšçžé¢ã·ãŒã±ã³ã¹ã®ç¢ºçã«é¢ããããã¥ã¡ã³ããè¿œå ããããšã§ãã
ããé£ãããã¹ã¯ãã¹ããªãŒã ãäžæããåºåé¢æ°ã眮ãæããããšã§ãã default_rng
ãã©ãã»ã©åŒ·åãªçŽæãããã®ãããããŸããã ããã¥ã¡ã³ãã¯ãããå€æŽãããå¯èœæ§ãããããšãèŠåããŠããªãããã§ãããããå€æŽããã«ã¯éæšå¥šãµã€ã¯ã«ãå¿
èŠã«ãªãå¯èœæ§ããããŸãã ããã«ã¯ãæ°ããåºåé¢æ°ãã¹ã¿ã³ãã¢ãã³ããããžã§ãã¬ãŒã¿ãŒãšããŠè¿œå ãïŒãŸãã¯PCG64ããæ§æå¯èœã§ãããè³¢æã§ãïŒãXXXX幎/ãªãªãŒã¹Y.ZZ以éã«å€æŽãããããšããŠãŒã¶ãŒã«èŠåããå¿
èŠããããŸãã
æãé£ããæ¹æ³ã¯ãæ°ããããã©ã«ãã®rngãèŠã€ããããšã§ãã åããŠã®ããšã¯ç°¡åã§ã¯ãªããéå»18ãæéãéãç¹å®ã®æ¹åã«åããããã«äœãå€ãã£ãŠããªããšæããŸãã
default_rng()
å€æŽã«ã€ããŠgh-16493ãéããŸãããããã®åé¡ã«é¢é£ããŠãããšã¯æããŸããã話ãåãå¿
èŠããããã©ããããããããŸããããããããã£ãšåã«ã«ãŒã«ãèšå®ããŠããã®ã§ãç§ã¯ããŸãããèŠããŠãããŠãã ããã
ç§ã¯ãã®è°è«ãå®å šã«ç解ããŠãããšã¯äž»åŒµããŠããŸããããç解ãã¹ãããšã2ã€ããããã§ãã
ç§ãã¡ã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
[...]ãšïŒmathïŒ
2^{127}
ã¹ããªãŒã ããµããŒãããŸã
æ°åãã©ãããæ¥ãŠããã®ãæ£ç¢ºã«ã¯ããããªãã®ã§ãç§ãã¡ã®åŽã§ã¯å°ãèªåŒµãããŠããããã«èãããŸãããå®å šã«æ£ãããšå°ã調æŽãããšèŠãªãããšãã§ããŸããïŒ ãŸãã¯ãè¿œå ã®è©³çŽ°ãæäŸããå€éšãªãœãŒã¹ã«ãªã³ã¯ããŸããïŒ
ä»ããè¡ãæãç°¡åãªæ¹æ³ã¯ã PCG64DXSM
BitGenerator
ãè¿œå ããããšã§ããããã¯ããå®äŸ¡ãªä¹æ°ããšãã匷åãªDXSM
åºåé¢æ°ãåããPCG64ã®ããªã¢ã³ãã§ãã ããã¯ãçŸåšPCG64
å®è£
ã«ããXSL-RRåºåé¢æ°ããã®ã¹ãããã¢ããã§ãããã©ã³ã¿ã€ã ããã©ãŒãã³ã¹ãæãªãããšãªãçµ±èšçã«åªããããã©ãŒãã³ã¹ãçºæ®ããããšã«èª°ããåæããŠãããšæããŸãã PCG64
ãç§ãã¡ãæäŸããBitGenerator
ã®ã¯ããããã§ã®ç°¡åãªã¢ããã°ã¬ãŒãã§ãã PCG64
ãšäžç·ã«è¿œå ããå¿
èŠããããšæããŸãã
ã¡ãªã¿ã«ã PCG64
ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãªãã·ã§ã³ã§ã¯ãªãã BitGenerator
ãšããååã®å¥ã®ãã¡ã€ã«ã«ããããšããå§ãããŸãã ãã®ãããªãªãã·ã§ã³ã¯ãããŸããŸãªã¢ã«ãŽãªãºã ãããªã¢ã³ããæäŸããããšãç®çãšããrandomgen
ã§åªããŠããŸããã numpy
å Žåã¯ãéžæããã°ã©ãã¢ã³ããŽãŒãã«ããå¿
èŠããããšæããŸããã§ããéãã
default_rng()
æäŸãããã®ã«å€æŽãå ããããã®ããªã·ãŒãå®éã«è§£æ±ºãããšã¯æããŸããã ç§ãææ¡ãããšãããã®æ©èœãGenerator()
ã³ã³ã¹ãã©ã¯ã¿ãŒã«å
¥ããããããããã奜ãã çç±ã®1ã€ã¯ãå¿
èŠã«å¿ããŠéæšå¥šã«ããŠå¥ã®ååã®é¢æ°ã«ç§»åã§ãããšããèããæã¡åºããŸããã ãã ããåœæã default_rng()
ã¯ãåºã«ãªãBitGenerator
å€ãã®è©³çŽ°ãå
¬éããå¿
èŠããããããããªããšèããŠããŸãããããã®åŸã¯åé¿ããŸããã PCG64DXSM
ã¯PCG64
ãšåãAPIïŒç¹ã«.jumped()
ïŒãå
¬éãããããæ°ããããã©ã«ããšããŠäœ¿çšãããšãããã¹ããªãŒã ãå€æŽããããšããå¯äžã®èæ
®äºé
ããããŸãã NEP 19ã®Generator
ã¡ãœããããã®ã¹ããªãŒã ã«å¯Ÿããä»ã®å€æŽãšåãã¿ã€ã ã©ã€ã³ã«åŸãã®ãåççã ãšæããŸãïŒã€ãŸãã X.Y.0
æ©èœãªãªãŒã¹ïŒã å¿
èŠã«å¿ããŠãããå°ãæ
éã«ãªãããšãéžæã§ããŸããæåã«ã PCG64DXSM
ã1.20.0
ãšããã¥ã¡ã³ãã§å©çšå¯èœãªBitGenerator
ãšããŠå
¬éããŸãïŒãã ãã warn()
ã¯å
¬éããŸããïŒã ããã€ãºãå€ãããŠå¹æããªãïŒ default_rng()
ã1.21.0
䜿çšããããã«å€æŽãããŸãã
æ°ããBGãè¿œå ããäžç°ãšããŠãPCG64ã®ã¡ã¢ãæŽæ°ããŠã¬ã€ããšããŠã®åœ¹å²ãéå§ããæ°ããããªã¢ã³ããåªå ããçç±ãæäŸãããšããã§ãããã
- ç§ãã¡ã«ã¯ååãªåé²ããããšç¢ºä¿¡ããŠããã®ã§ãããã«ã€ããŠãããŒããä¿¡é Œããå¿ èŠããããŸããä»ã®ãšãããç§ãã¡ã®ç¥ãéãã§ã¯åé¡ãªãããã«æããŸããïŒ ïŒã€ãŸããå®éã®è¡çªã®ç¢ºçã¯ãNumPyã䜿çšãããå¯èœæ§ã®ãããã®ããã倧ããç°å¢ã§ããããããæ¥ããããã»ã©äœãã®ã§ããããïŒå°æ¥ããã©ã«ããå€æŽããå¿ èŠããããã©ããã¯å¥ã®åé¡ã§ããïŒ
ããã¯ããããå°ãã°ãªããããŸãã ããã¯ãã¹ããªãŒã ã®æ°ãåã¹ããªãŒã ããååŸããããŒã¿ã®éãããã³èªçæ¥ã®è¡çªã«å¯Ÿãããªã¹ã¯èš±å®¹åºŠã«ãã£ãŠç°ãªããŸãã ç§ã¯ãŸã ãã®æ°åŠããããããã段èœã«ãŸãšããŠãããããããæšå¥šäºé ãäœæããããšã«æ £ããŠããŸããããã®ããããã®Githubã®åé¡ããã°ããåæ€èšããŠããŸããã ãã ãã_ä»_ä¿®æ£ããå¿ èŠãããã®ã¯ãã¢ãªã³ãã¡ã€ã¢ã®åé¡ã§ã¯ãªããšæããŸãã
åŸã§äœããæžããŸããããã®ã¹ã¬ããã§ãããèŠããšãç§ãã¡ã¯æšå¹Žè¡ã£ãå°é¢ãèªã¿çŽããŠããŸãã SebastianoãNumPyãPCGãåºè·ããããšãçºèŠãã以å€ã¯äœãå€ãã£ãŠããŸããã æšå¹Žã®NumPyããŒã ã®åæã¯ãã詳现ã§ããããã劥åœãªã·ããªãªãæ€èšããŸããã
ç§ã®å¥œã¿ã¯ãæ··ä¹±ãæžããããã«ãã§ããã ãæ©ãããã©ã«ããã¢ããã°ã¬ãŒãããããšã§ãã ã€ãŸããå»æ¢ãµã€ã¯ã«ãåŸ ããªãã§ãã ããã
@ imneme-ããããšã
ããããããã«ã€ããŠã®éå»ã®æçš¿ççºã¯ããã§ãã 確ãã«èªã䟡å€ããããšæããŸãã ããããã¹ã¬ãããäžã«ã¹ã¯ããŒã«ããŠããããã®åé¡ã«ã€ããŠè©±ããŠããã®ãèŠãããšãã§ããŸãã ããã¯PCG32ã«ã€ããŠã§ããã
ç§ã¯èšãããããšãé ã®äžã«æã£ãŠããŸãããã1幎åã®æçš¿ãèŠããšããããšä»ã®å Žæã®äž¡æ¹ã§ãã§ã«ãã¹ãŠãèšã£ãŠããŸãïŒç§ã®ããã°ïŒ2017ïŒã reddit ãç§ã®ããã°ïŒ2018ïŒ ãããã³NumPyãã£ã¹ã«ãã·ã§ã³ãªã©ã§ïŒ
ã¹ããªãŒã ãšãã®èªå·±çžäŒŒæ§ïŒ @rkernãã¹ããªãŒã äŸåãã¹ã¿ãŒãäœæããïŒã«ã€ããŠãç§ã¯æšå¹Žæ¬¡ã®ããã«æžããŠããŸãã
åè¿°ã®ç§ã®ããã°æçš¿ã§è¿°ã¹ãããã«ãPCGã®ã¹ããªãŒã ã«ã¯SplitMixã®ã¹ããªãŒã ãšå€ãã®å ±éç¹ããããŸãã
@mdickinsonã®ã°ã©ãã«é¢ããŠãã«ãŠã³ã¿ãŒããŒã¹ã®æå·åã®ãã®ãå«ãç¶æ å šäœãã·ãŒãã§ãã_every_ PRNGã®å Žåãåºåãäœããã®æ¹æ³ã§çžé¢ããŠããPRNGãããã·ãŒããèæ¡ã§ããŸãïŒãããè¡ãæãç°¡åãªæ¹æ³ïŒçãè·é¢ã«ããPRNGç¶æ ãäœæããããšã§ãããå€ãã®å Žåãããããã©ã®ããã«æ©èœããããç解ããããšã«åºã¥ããŠä»ã®ããšãè¡ãããšãã§ããŸãïŒã ãŸãããã«ã¹ããŒãã·ãŒããèš±å¯ããªãPRNGã¯ãã®åé¡ãåé¿ã§ããŸãããããããããšã§æ°ããåé¡ãçºçããã ãã§ãå¯èœãªç¶æ ã®ããäžéšã«ããå®éã«ã¢ã¯ã»ã¹ã§ããŸããã
ã¹ããªãŒã ãèããæ£ããæ¹æ³ã¯ãã·ãŒãããå¿ èŠãããããã©ã³ãã ãªç¶æ ã§ãã 1,2,3ã®ãããªå°ããªå€ã䜿çšããããšã¯ã_any_ PRNGã®ã·ãŒãç®çã§ã¯äžè¬çã«æªãèãã§ãïŒèª°ãããããã®ã·ãŒãã奜ãå Žåã察å¿ããåæã·ãŒã±ã³ã¹ãé倧è©äŸ¡ãããããïŒã
ã¹ããªãŒã ãšã¯ãŸã£ããåŒã°ããç¶æ ãšåŒã¶ããšãã§ããŸãã ããããã«ãµãªãŒã¢ãXorWowã§ããããš
counter
ã¯æ®ãã®ç¶æ ãšãŸã£ããçžäºäœçšãããLCGãšåæ§ã«ãåæå€ã®å€åã¯å®éã«ã¯è¿œå ãããå®æ°ã«ãªããŸããSplitMixãPCGãããã³XorWowã®ã¹ããªãŒã ã¯ããæããªãã¹ããªãŒã ãšåŒã°ãããã®ã§ãã ãããã¯ããžã§ãã¬ãŒã¿ã®äºçŽ°ãªåãã©ã¡ãŒã¿åãæ§æããŸãã ãã ããããã«ã¯äŸ¡å€ããããŸãã ã¹ããªãŒã ããªãå ŽåãPRNGã¯42ã®èå³æ·±ãå¯æ¥ãªç¹°ãè¿ããæã¡ã42ã¯ãã°ããé£ç¶ããŠæ°ååºçŸãã42ã«å¯ŸããŠã®ã¿ãããå®è¡ããä»ã®æ°ã¯å®è¡ããªããšä»®å®ããŸãã æããªããã ã®å¢åããŸãã¯ããã ã®xorãã¹ããªãŒã ã䜿çšãããšãå®éã«ã¯ãå¥åŠãªç¹°ãè¿ãã42ã«ããŒãã¯ã€ã€ãªã³ã°ããããšãåé¿ã§ããŸãã ãã¹ãŠã®æ°åã«ã¯ãå¥åŠãªç¹°ãè¿ãã§ããã¹ããªãŒã ããããŸãã ïŒãã®ããã Xoshiro 256ã®ã¯ããŒãºãªããŒãã®åé¡ã修埩ããããã«é©çšããä¿®æ£ã¯ãWeylã·ãŒã±ã³ã¹ã§æ··åããããšã§ããïŒ
ïŒç§ã¯ãã®åŸã§ãããæ·±ã¿ã«å ¥ã£ããã®ã³ã¡ã³ããšã§ããã®1 ãïŒ
éèŠãªãã€ã³ãã¯ãã»ãŒãã¹ãŠã®PRNGã®å Žåãå°ãã®æéãšãšãã«ã®ãŒã§ç çåŠçã·ãŒããèæ¡ã§ããããšã§ãã PCGã¯ããçããç«å Žã«ãããç¹ã«æäœãã®ç ç¶ãæã€PCGã®ãã£ãšããããèŠãç®ã®çš®ãŸãã楜ããã§ãã人ãããŸãïŒã€ãŸããSebastianoïŒã ãã®äœæ¥ã®çµæãšããŠãç§ã¯æ¯ãè¿ãã圌ã®PRNGãšä»ã®é·å¹Žã®PRNGã®äž¡æ¹ã«å¯ŸããŠåãããšãè¡ããŸããã
äžè¬ã«ãPRNGç¶æ
ããã¡ãã£ãšã©ã³ãã ãã«èŠãããã®ã§åæåããå¿
èŠããããŸãã ããšã人ã
ãä»ã®æ¹æ³ã§ãããããšããŠããããã¯ããªãæ®éçseed_seq
äœæããçç±ïŒã ãäžèªç¶ãªã·ãŒããå®è¡ããããã²ãŒã ããã¬ã€ãããå Žåã¯ã100åã®LFSRã®åæåã®ã³ã¬ã¯ã·ã§ã³ãäœæããããããã¹ãŠããŒãã©ã³ãã«å°éããããšãã1Ké¢ãã®ã¯é£ãããããŸããã äžèªç¶ãªåæåã¯ãã¹ãŠååã«ç¡å®³ã«èŠããŸãããåæã«ããã³ã°éã¿ã®ãã®å¥åŠãªäœäžã«ã¶ã€ãããŸãã
劥åœãªãšã³ããããŒã§åæåãããPCGãžã§ãã¬ãŒã¿ãŒã䜿çšããŠããå Žåã¯ãåé¡ãããŸããã 1ã2ã3ã®ãããªãžã£ã³ã¯ã§åæåããå ŽåãPRNGã§ã¯å®éã«
ããããDXSMã¯ç¢ºãã«åŒ·åã§ãã ç§ã¯ãããããè¯ãããç§ã¯ãããæãéããªãã£ãã ãããšæããŸãããå®éã«ã¯ãŠãŒã¶ãŒãå€å žçãªPCG64ã®å®è£ ã§åé¡ã«ééããããšã¯ãªããšããããšãç解ãã䟡å€ããããŸãã
PCG64ã®ã¹ããªãŒã ã«å¯Ÿããæ¹å€/é²åŸ¡ãïŒLCGå¢åãä»ããŠïŒçŸåšã®è°è«ããåãé¢ããããšæããŸãã LCGã®æ°åŠã®ããã«ç¹å®ã®äºéæ§ãé¢ä¿ããŠããŸãããããã¯æåã«ããã§æèµ·ãããäžå¿çãªåé¡ã§ã¯ãããŸããã ãŸããSebastianoã®å ã®æ¹è©ãããªãã®å¿çããŸãã¯å€ãã¡ã¬ã¹ã¬ããã«ååšããŠããããããèæ ®ãã¹ã詳现ãããã«ãããŸãã ãããããæ°åŠã«ãã£ãšæéãè²»ãããå°é家ã«ãšã£ãŠã¯ããã®ã€ãªããã¯ããæçœã§ãããå°ãªããšãå®éã®çµæã¯ä»ã§ã¯ããæ確ã«ãªã£ãŠããŸãã
éèŠãªãã€ã³ãã¯ãã»ãŒãã¹ãŠã®PRNGã®å Žåãå°ãã®æéãšãšãã«ã®ãŒã§ç çåŠçã·ãŒããèæ¡ã§ããããšã§ãã
確ãã«ãããããç§ã®ç®ã®åã§æ±ºå®ãäžãã®ã¯ããã€ããªã®ã§ããªã/ã§ããªããšããããšã§ã¯ãããŸããã æéã®PRNGããããŸãã«ãå€ãã®æ°å€ãåŒãåºããšãæçµçã«PractRandããããæ€èšããŸãã ãã®ãã€ããªãã¡ã¯ãã¯ããã®PRNGã¢ã«ãŽãªãºã ãç¡å¹ã«ããŸããã ãã®ãã€ããªããé¢ããŠãããã«ãŒã ã®æŠå¿µã確ç«ããããšã¯ãå ã®PCGããŒããŒã«ã€ããŠç§ãæ¬åœã«æè¬ããããšã®1ã€ã§ããã æµå¯Ÿçã«çæãããç ç¶ãèãããšããã®ç ç¶ãè¯å¥œãªãšã³ããããŒã·ãŒãããã©ã³ãã ã«çºçããå¯èœæ§ãããé »åºŠã調ã¹ãããšãã§ããŸãã ãããæ°å€åããŠããŠãŒã¶ãŒãžã®å®è·µçãªã¢ããã€ã¹ã«ããããšæããŸãã
äžäœ58ããããšåãå¢åãå
±æãã2ã€ã®ç¶æ
ïŒãã³ããã®äžã«é
眮ããŸãïŒãèãããšããããã®ç¶æ
ããPCG64 XSL-RRã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¿ãŒãªãŒããããšãçŽ32GiBã§PractRandã§å®éã«èŠ³å¯å¯èœãªé害ãçºçããŸãã ãããé¿ãããã®ã¯åœç¶ã ãšæããŸãã ããã§ã¯ãããããã³ãããŒã¯ãšããŠãé©åãªãšã³ããããŒã·ãŒãã§çºçããé »åºŠãèŠãŠã¿ãŸãããã 幞ããªããšã«ããã®æµå¯Ÿçãªã¹ããŒã ã¯ç¢ºçè«çåæã«é©ããŠããŸãïŒãã¹ãŠãããã»ã©å奜çã§ãããšã¯éããŸããïŒã n
ã€ã³ã¹ã¿ã³ã¹ã®å Žåãä»»æã®2ãåãäžäœ58ããããå
±æãã確çã¯n**2 / 2**58
ãäºéã«ãŠã³ãã®å Žåã¯2ã®å æ°ãäžããŸãã ãããã£ãŠã5åã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãã€ã³ã¿ãŒãªãŒããããå Žåã«PractRandã倱æãããããªãã¢ãªã³ã°ã1ã€ããå¯èœæ§ãé«ããªããŸãã 5åã¯ãããããããŸãïŒ ç§ã®å€æã§ã¯ãããã»ã©å€ãã®PCG64
ã€ã³ã¹ã¿ã³ã¹ãäœæããããšããnumpy
ããã°ã©ã ã¯ããããèŠãããªãã§ãããã numpy
ã¯ééã£ãããŒã«ã§ããå¯èœæ§ããããŸãã
ãŸããåŸç¶ã®æç»ãä»ã®åæç¶æ
ã®äžäœ58ãããã®è¡çªç¶æ
ã®ãããããšã亀差ãããåæç¶æ
ãåé¿ããããšãåççã ãšæããŸãã ç§ã¯ãŸã ãã®è«çãèããããšããŠããŸãããé·ãã¯äºæ¬¡çã§ã¯ãªãç·åœ¢çã«ç¢ºçã«åœ±é¿ãäžãããšæããŸãã ç§ãæ£ãããåã€ã³ã¹ã¿ã³ã¹ãã16 GiBãæç»ãããå ŽåïŒ 2**28
æç»ïŒãããã¯PractRandã®å€±æã瀺ããåãã¢ããæç»ããéã§ããçŽ2**15
ããäœæ¥ã§ããŸããã亀差ç¹ã芳枬ããå¯èœæ§ãéåžžã«é«ããªãåã®PCG64
ã䜿çšãããšãå®éã®numpy
ããã°ã©ã ã§åé¡ãçºçããå¯èœæ§ã¯äœããšæããŸãã ãã ããäžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯è¿ã¥ãå§ããå¯èœæ§ããããŸãïŒããšãã°ã倧èŠæš¡ãªåæ£åŒ·ååŠç¿ã®å®è¡ïŒã
ãã®ã€ã³ã¯ãªã¡ã³ããã³ãåãåºããŠå¯ŸåŠããŸãããã XSL-RRåºåé¢æ°ã§ã¯ãç¶æ
ã«å ããŠå¢åããšã³ããããŒã·ãŒãããŠãããã®ç¹å®ã®åæã¯å€æŽãããªããšèšã£ãŠãéèšã§ã¯ãããŸããã ãšã³ããããŒã·ãŒããããå¢åã®ä»»æã®ãã¢ã«å¯ŸããŠãå®éã«è¡çªããç¶æ
ã®æ°ã¯åãã§ããããã§ãã ãããã®ç¶æ
ãæå³çã«æ§ç¯ããããã®å
·äœçãªæé ã¯ãåãäžäœ58ãããã§ããã·ã³ã°ãããããè€éã«èŠããŸãããè¡çªããç¶æ
ã®æ°ã¯åãã§ããããã«èŠããããã確çã®èšç®ã¯åããŸãŸã§ãã ããã¯ãäžè¬çã«PCGã¹ããŒã ã«åºæã®ãã®ã§ã¯ãããŸããã DXSMåºåé¢æ°ã¯ååã«åŒ·åã§ãããããå¢åãå€æŽãããšïŒåçŽãª+2
ïŒãåºã«ãªãLCGã®ææªã®ç¶æ
ïŒè·é¢ã¡ããªãã¯ã0
äžããå ŽåïŒã«ãæµæããã®ã«ååã§ããããã«èŠããŸãã
æåŸã«ãç§ãã¡å
šå¡ãå®å
šã«äžèŽããŠããããã«èŠããããšãç¹°ãè¿ããŸãã PCG64DXSM
ã¯è¯ãèãã§ãã ä»ã«äœããªããšããŠãããã®æ¹åãããçµ±èšçç¹æ§ã¯ãç§ãææžåããããšãäœåãªããããŠãããšæããã¡ã³ã¿ã«ã¢ãã«ãåçŽåããŸãã
åãã¹ããªãŒã ã«ãžã§ãã¬ãŒã¿ãŒãããå Žåã«ã®ã¿åé¡ãçºçãããããã¹ããªãŒã ã¯äŸç¶ãšããŠããçšåºŠé¢é£æ§ããããŸãã
ããããã©ã®ãããªç¶æ³äžã§ããããã¯åãäžäœ58ããããæã¡ãåãã¹ããªãŒã äžã«ããã§ããããïŒ ãããçºçãããŠãŒã¹ã±ãŒã¹ã¯ãããŸããïŒ
ç§ãç¥ã£ãŠããããçŸå®çãªã±ãŒã¹ã®1ã€ã¯ãæšå¹ŽïŒ jumped
ã«ã€ããŠè©±ãããšãïŒã«è©±ãåã£ãã±ãŒã¹ã§ãã以åã«ãªã³ã¯ãããã®æçš¿ã§è©±ããŸããã
åãã¹ããªãŒã ã«ãžã§ãã¬ãŒã¿ãŒãããå Žåã«ã®ã¿åé¡ãçºçãããããã¹ããªãŒã ã¯äŸç¶ãšããŠããçšåºŠé¢é£æ§ããããŸãã
æ®å¿µãªãããXSL-RRã®å Žåã¯ããã§ã¯ãããŸããã 2ã€ã®PCG64
XSL-RRã€ã³ã¹ã¿ã³ã¹ã«ã€ããŠèããŠã¿ãŸãããã å¢åãä»»æã«ãšã³ããããŒã·ãŒãããç¶æ
ã®1ã€ããšã³ããããŒã·ãŒãããŸãã åãäžäœ58ãããç¶æ
ã®åãã€ã³ã¯ãªã¡ã³ãã®å€±æãšåãæ¹æ³ã§PractRandã«å€±æããä»ã®PCG64
ã€ã³ã¹ã¿ã³ã¹ã®2**70
äžè¯ç¶æ
ãæ§ç¯ã§ããŸãã åãã€ã³ã¯ãªã¡ã³ãã®å Žåãããå®è¡ãè€éã«ãªããŸãã ç°ãªãå¢åã§æåã®ç¶æ
ãšããŠäžäœ58ããããå
±æãã代ããã«ãæåã®ã€ã³ã¹ã¿ã³ã¹ãã0è·é¢ïŒLCGè·é¢æž¬å®ã«ããïŒã§ããç¶æ
ã®äžäœ58ããããå
±æããå¢åãèæ
®ããŸãã ç§ã¯æ§æç蚌æïŒPythonã³ãŒãïŒãæã£ãŠããŸãããä»å¯ãŠææ¥æé€ããªããã°ãªããŸããã
@rkern ãè¯ãç¹ã ç§ã¯èªããŸããç§ã¯ãããã©ã®ããã«éã°ããããèŠãããã«ãã®ã·ããªãªããã¹ãããŠããŸããã
éèŠãªãã€ã³ãã¯ãã»ãŒãã¹ãŠã®PRNGã®å Žåãå°ãã®æéãšãšãã«ã®ãŒã§ç çåŠçã·ãŒããèæ¡ã§ããããšã§ãã PCGã¯ããçããç«å Žã«ãããç¹ã«æäœãã®ç ç¶ãæã€PCGã®ãã£ãšããããèŠãç®ã®çš®ãŸãã楜ããã§ãã人ãããŸãïŒã€ãŸããSebastianoïŒã ãã®äœæ¥ã®çµæãšããŠãç§ã¯æ¯ãè¿ãã圌ã®PRNGãšä»ã®é·å¹Žã®PRNGã®äž¡æ¹ã«å¯ŸããŠåãããšãè¡ããŸããã
ãã§ã«è¿°ã¹ãããã«ãããã¯èª€ãã§ãã PCGå ã§ç°¡åã«èŠã€ããããšãã§ããããã«ãããšãã°xoshiro256 ++ããã®çžé¢ããéè€ããªãã·ãŒã±ã³ã¹ã®ãã¢ã®äŸãç§ã¯ç¥ããŸããã
ç¶æ å šäœããã°ããæ··åããPRNGã«ã¯ããã®åé¡ã¯ãããŸããã ããã«æçš¿ããäŸã®ããã«ãxoshiro256 ++ããçžäºã«é¢é£ãã2ã€ã®éè€ããªãã·ãŒã±ã³ã¹ãçæããããã°ã©ã ãæäŸã§ããå Žåã¯ãããããŠãã ããã
圌ã®çžé¢ããã°ã©ã ã«ã€ããŠã¯ã2018幎ã«åœŒãããŸããŸãªåé¡ïŒäžèªç¶ãªã·ãŒããªã©ïŒã§æžããããã°ã©ã ãå«ãPCGã®æ¹è©ã圌ã®ãŠã§ããµã€ãã«æ²èŒãããšãã«ãç§ã¯åæ§ã®ããã°ã©ã ã®æãå«ããSplitMixã§çžé¢ã¹ããªãŒã ãäœæãã
corrsplitmix2.c
ãå«ããä»ã®é·ã確ç«ãããPRNGã®å Žåã ã»ãã¹ãã£ã³ããããã§ããªããšèšã£ããšãã«äœãæå³ããã®ãã¯ããããããŸãããã圌ã®æ°ããããã°ã©ã ã圌ã®ãã®ãšå®è³ªçã«ç°ãªããã©ããã確èªããããã«åœŒã®ãã¹ãããã°ã©ã ã詳ãã調ã¹ãæ©äŒããªãã£ãããšãèªããŸãæ°å¹Žåã«æžããã
äžã§åŒçšããããã°ã©ã ã¯_ã¹ããªãŒã ãéžæããŸã_ã æããã«ãããæžãã®ã¯ç°¡åã§ãã
ããããããã¯PCGã®åé¡ãšã¯äœã®é¢ä¿ããããŸããã ç§ãæäŸããããã°ã©ã ã¯ã_user_ã«ã¹ããªãŒã ãéžæãããŠãããçžé¢é¢ä¿ã瀺ããŸãã
ç¹°ãè¿ãã«ãªããŸããã httpïŒ/ã®ããã«ä»ã®ãžã§ãã¬ãŒã¿ãŒã§çžé¢ã·ãŒã±ã³ã¹ãèŠã€ãããããŸãã
ãŠãŒã¶ãŒã«ã¹ããªãŒã ãä»»æã«éžæããããšãã¯ããã«åŒ·åãªçžé¢é¢ä¿ã瀺ãããŸãã
ãã§ã«è¿°ã¹ãããã«ãããã¯èª€ãã§ãã PCGå ã§ç°¡åã«èŠã€ããããšãã§ããããã«ãããšãã°xoshiro256 ++ããã®çžé¢ããéè€ããªãã·ãŒã±ã³ã¹ã®ãã¢ã®äŸãç§ã¯ç¥ããŸããã
ããã§ãäºããè¶ ããŠè©±ããŠããããã§ãã 以åã«äœæããããŸããŸãªçžé¢ããã°ã©ã ãªã©ã§ç€ºãããŠããããã«ãPRNGã«å¯ŸããŠçžé¢ã®ãããéè€ããªãã·ãŒã±ã³ã¹ãæãä»ãããšãã§ãããšã¯èšããŸããã§ããã Xoshiro **ã®
ãŸããç¶æ å šäœãæ··åããªãPRNGã«ã¯ãXorWowãæ°å€ã¬ã·ãã®ãžã§ãã¬ãŒã¿ãŒãªã©ãé·ãæŽå²ããããŸããSebastianoã®è°è«ã¯èŠç¹ãè¡šããŠããŸããã圌ã®è°è«ã¯ãMarsagliaãWeylãè¿œå ããããšã«ãã£ãŠXorWowã§XorShiftã_worse_ã«ãããšèšãã§ãããã·ãŒã±ã³ã¹ã¯ãåæ§ã®ãžã§ãã¬ãŒã¿ãŒãå€æ°äœæããããã§ãã
ããã§ãäºããè¶ ããŠè©±ããŠããããã§ãã 以åã«äœæããããŸããŸãªçžé¢ããã°ã©ã ãªã©ã§ç€ºãããŠããããã«ãPRNGã«å¯ŸããŠçžé¢ã®ãããéè€ããªãã·ãŒã±ã³ã¹ãæãä»ãããšãã§ãããšã¯èšããŸããã§ããã Xoshiro **ã®
æè¡çãªã¬ãã«ã§è°è«ãç¶ããããã«ããŠãã ããã ãç çåŠçãã«ã¯æ°åŠçãªæå³ã¯ãããŸããã
èªå·±çžé¢ããã§ãã¯ããããã®æè¡çã«æ£ããæ¹æ³ã¯ã2ã€ã®ã·ãŒããèŠã€ããŠ2ã€ã®éãªãåããªãã·ãŒã±ã³ã¹ãçæããããšã§ãïŒãã¹ãã®æéäžã¯éãªãåããŸãããååã«é ããŸã§è¡ããšãéãªãåãããšã¯é¿ããããŸããïŒãããããã€ã³ã¿ãŒãªãŒãããŠããããªãŒã«æž¡ããŸããã¹ãã®ã
ãªãŒããŒã©ãããã2ã€ã®ã·ãŒã±ã³ã¹ãæ€èšããå Žåãã·ãŒã±ã³ã¹ããªãŒããŒã©ããããåŸã«åãåºåã2åçºçãããããæå·åããããã®ã§ãã£ãŠãããã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã§çžé¢ããããé©åãªãã¹ãã§ãããæ€åºãããŸãã
éè€ããã·ãŒã±ã³ã¹ã䜿çšãããç çåŠçã·ãŒããã¯ããã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã«ãšã£ãŠç°¡åãªäœæ¥ã§ãïŒãç çåŠçããæå³ãããã®ã¯äœã§ãïŒã
ç¹°ãè¿ãã«ãªããŸãããä»ã®ãžã§ãã¬ãŒã¿ãŒã§PCGïŒãã¹ãã瀺ãããã«ã·ãŒã±ã³ã¹ããªãŒããŒã©ããããŠããªãïŒãšåæ§ã®çžé¢é¢ä¿ãèŠã€ãããšäž»åŒµããŠããã®ã§ãããšãã°xoshiro256 ++ãŸãã¯SFC64ããã®çžé¢é¢ä¿ã®ãããªãŒããŒã©ããããªãã·ãŒã±ã³ã¹ã®ãã¢ãæäŸã§ããŸããïŒ ïŒ
èªå·±çžé¢ããã§ãã¯ããããã®æè¡çã«æ£ããæ¹æ³ã¯ã2ã€ã®ã·ãŒããèŠã€ããŠ2ã€ã®éãªãåããªãã·ãŒã±ã³ã¹ãçæããããšã§ãïŒãã¹ãã®æéäžã¯éãªãåããŸãããååã«é ããŸã§è¡ããšãéãªãåãããšã¯é¿ããããŸããïŒãããããã€ã³ã¿ãŒãªãŒãããŠããããªãŒã«æž¡ããŸããã¹ãã®ã
ãã®çžé¢é¢ä¿ã®å®çŸ©ã«ã€ããŠã®æç®ãææããŠãç§ãããã«ã€ããŠãæè¡çã«æ£ããããŸãŸã§ããããšã確èªã§ããŸããïŒ
ã»ãã¹ãã£ã¢ãŒããããªãã¯ç§ãããªãã®æ¡ä»¶ã§èšå®ãããææŠã«çããããšãæãã§ããŸãã ããªããææããŠããã®ã¯ãèªå·±çžäŒŒæ§ãããLCGã®åºæã®ç¹æ§ã«é¢é£ããŠããŸãã æ··æ²ãšããPRNGãLFSRããŒã¹ã®åé¡ã§ã¯åãåé¡ã¯èŠã€ãããŸããã
ããããä»ã®PRNGã«ã€ããŠã¯ãä»ã®åŒ±ç¹ããããŸãã
LFSRã«ã¯ããŒãã©ã³ããæªãç¶æ ãããã³ã°éã¿ã®åé¡ãç·åœ¢æ§ããããxoshiroã§ã®è©Šã¿ã§åŠãã ããã«ãç¹°ãè¿ãã®å¥åŠãªåé¡ã®ãããªä»ã®å¥åŠãªããšããããŸãã
ã«ãªã¹PRNGã«ã¯ãçããµã€ã¯ã«ïŒãã ããã«ãŠã³ã¿ãŒããããã®ã¯ãããåé¿ããŸãâ Weylã·ãŒã±ã³ã¹FTWïŒïŒãšãã®åºæã®ãã€ã¢ã¹ã®ãªã¹ã¯ããããŸãã
ç§ãæžããããã«ãã·ãŒã±ã³ã¹ãéè€ããŠããå Žåããã¹ãã¯_åžžã«_倱æããŸãã _åžžã«å€±æãã_ãã¹ãã¯ãã¹ãã§ã¯ãªãããšãç解ããããã«ãæç®ã¯å¿ èŠãããŸããã
ç¹°ãè¿ãã«ãªããŸãããä»ã®ãžã§ãã¬ãŒã¿ãŒã§PCGïŒãã¹ãã瀺ãããã«ã·ãŒã±ã³ã¹ããªãŒããŒã©ããããŠããªãïŒãšåæ§ã®çžé¢é¢ä¿ãèŠã€ãããšäž»åŒµããŠããã®ã§ãããšãã°xoshiro256 ++ãŸãã¯SFC64ããã®çžé¢é¢ä¿ã®ãããªãŒããŒã©ããããªãã·ãŒã±ã³ã¹ã®ãã¢ãæäŸã§ããŸããïŒ ïŒ
ããªãã¯æ¬åœã«è³ªåãé¿ããŠããããã§ãã ããªãã®äž»åŒµã«ç¶ããŠãããããã°ããã®ãããªèšŒæ ãæäŸããããšã¯ããªãã«ãšã£ãŠéåžžã«ç°¡åã§ãããã
ä»ããè¡ãæãç°¡åãªæ¹æ³ã¯ã
PCG64DXSM
BitGenerator
ãè¿œå ããããšã§ããããã¯ããå®äŸ¡ãªä¹æ°ããšãã匷åãªDXSM
åºåé¢æ°ãåããPCG64ã®ããªã¢ã³ãã§ãã ããã¯ãçŸåšPCG64
å®è£ ã«ããXSL-RRåºåé¢æ°ããã®ã¹ãããã¢ããã§ãããã©ã³ã¿ã€ã ããã©ãŒãã³ã¹ãæãªãããšãªãçµ±èšçã«åªããããã©ãŒãã³ã¹ãçºæ®ããããšã«èª°ããåæããŠãããšæããŸããPCG64
ãç§ãã¡ãæäŸããBitGenerator
ã®ã¯ããããã§ã®ç°¡åãªã¢ããã°ã¬ãŒãã§ããPCG64
ãšäžç·ã«è¿œå ããå¿ èŠããããšæããŸãã
64ãããã®ãå®äŸ¡ãªä¹æ°ãã«ã¯èšŒæå¯èœãªæ¬ é¥ãããããšã«æ³šæããŠãã ããã ããã¯é·ãéç¥ãããŠããŸãïŒ
W.HörmannãšG.Derflingerãã«é©ããããŒã¿ãã«ä¹±æ°ãžã§ãã¬ãŒã¿ãŒ
æ£åŽæ³ãACMTransã æ°åŠã ãœãããŠã§ã¢ã 19ïŒ1993ïŒãnoã 4ã489â495ã
äžè¬ã«ãã¢ãžã¥ã©ã¹ã®å¹³æ¹æ ¹ãããå°ããä¹æ°ã«ã¯ãã¹ãã¯ãã«ã¹ã³ã¢f²ã«åºæã®å¶éããããŸãã
ãã®å¶éã¯ã65ãããã®ä¹ç®åšã䜿çšããããšã§ç°¡åã«å æã§ããŸãããã®ä¹ç®åšã¯ãã³ã³ãã€ã©ãè¿œå ã®ãè¿œå ãæäœã§å€æããã ãã§ããããããžã§ãã¬ãŒã¿ã®é床ãå€æŽããããšãããããŸããã
Guy Steeleãšç§ã¯ãã®åé¡ã«å°ãåãçµã¿ãããŸããŸãªãµã€ãºã®å®äŸ¡ãªä¹æ°ã®ã¹ãã¯ãã«ã¹ã³ã¢ã®è¡šãå ¬éããŸããïŒ https ïŒ
ããšãã°ãè«æã®è¡š7ãããf²ã¹ã³ã¢0.9919ã®0x1d605bbb58c8abbfdãåŸãããŸãã 64ãããä¹ç®åšã¯0.9306ãè¶ ããããšã¯ã§ããŸããïŒè«æã®å®ç4.1ïŒã
ããã¯ã¹ãšãã¹ãŠã®åŸãfâã¹ã³ã¢ã®æ¹åã¯çµ±èšçãªèŠ³ç¹ããå®å šã«èŠéããããå¯èœæ§ããããŸãã ããããè¿œå æäœãè¿œå ããã ãã§æãé¢é£æ§ã®é«ããã£ã¡ã³ã·ã§ã³ãå€§å¹ ã«æ¹åãããããšãèãããšãåªåãã䟡å€ããããšæããŸãïŒãŸããç§ãã¡ã¯èããŸãããŸãã¯ç§ãã¡ã¯è«æãæžããŠããªãã£ãã§ãããïŒã
ã»ãã¹ãã£ã¢ãŒããããªãã¯ç§ãããªãã®æ¡ä»¶ã§èšå®ãããææŠã«çããããšãæãã§ããŸãã ããªããææããŠããã®ã¯ãèªå·±çžäŒŒæ§ãããLCGã®åºæã®ç¹æ§ã«é¢é£ããŠããŸãã æ··æ²ãšããPRNGãLFSRããŒã¹ã®åé¡ã§ã¯åãåé¡ã¯èŠã€ãããŸããã
ãããŒãããã«çãã®ã«å°ãæéãããããŸããïŒ
LFSRã«ã¯ããŒãã©ã³ããæªãç¶æ ãããã³ã°éã¿ã®åé¡ãç·åœ¢æ§ããããxoshiroã§ã®è©Šã¿ã§åŠãã ããã«ãç¹°ãè¿ãã®å¥åŠãªåé¡ã®ãããªä»ã®å¥åŠãªããšããããŸãã
ç§ã¯å®å šã«åæããŸãâãããããªããããããã¹ã¯ã©ã³ãã«ããªããã°ãªããªãçç±ã§ãã LFSRãšF²ç·åœ¢ãžã§ãã¬ãŒã¿ãŒã¯ç°ãªããã®ã§ããããšã«æ³šæããŠãã ããã é¢é£ããŠããŸãããç°ãªããŸãã
ããªããŒãã«é¢ããå¥åŠãªåé¡ãã¯ããã€ãã®ããã«ãç§ãã³ã¡ã³ãã§ããªãéæè¡çãªçšèªã§ãã
ã«ãªã¹PRNGã«ã¯ãçããµã€ã¯ã«ïŒãã ããã«ãŠã³ã¿ãŒããããã®ã¯ãããåé¿ããŸãâ Weylã·ãŒã±ã³ã¹FTWïŒïŒãšãã®åºæã®ãã€ã¢ã¹ã®ãªã¹ã¯ããããŸãã
[æŽæ°ïŒæ¬åŒ§ã§å²ãŸããã«ãŠã³ã¿ãŒã®èŠ³å¯ãèŠéããã®ã§ãã³ã¡ã³ããæŽæ°ããŠããŸãã]
ã¯ããSFC64ã«ã¯ãã®ãããªåé¡ã¯ãããŸããïŒã«ãŠã³ã¿ãŒã䜿çšããŸãïŒã®ã§ãã«ããŽãªãŒå šäœã«äžè¬åããããšã¯ããŸããã 蚌æå¯èœãªãæãçããµã€ã¯ã«é·ãæã€æ éã«èšèšãããã«ãªã¹ãžã§ãã¬ãŒã¿ããããŸãã
ããªããŒãã«é¢ããå¥åŠãªåé¡ãã¯ããã€ãã®ããã«ãç§ãã³ã¡ã³ãã§ããªãéæè¡çãªçšèªã§ãã
é©åãªå°éçšèªã䜿çšããªãã£ãããã«ã³ã¡ã³ãã§ããªãã®ã¯å¥åŠã«æããŸãããã®ããã°ã©ã ãå®è¡ããŠãããé©åãªå°éçšèªã§åé¡ã説æããæåã®æ¹æ³ãæããŠãã ããããã®åŸãé©åãšæãããã³ã¡ã³ããæäŸããŠãã ããã ç§ã¯ããã«ã€ããŠåœŒãšé£çµ¡ãåãåã£ãã®ã§ãããªããšããããã»ãã©ãã¯ãã³ãæåã«æãã¿ã«åºããšãã«ãã®åé¡ã«ã€ããŠè©±ãåã£ãã§ããããšæ³åããã§ãããããããªããããã«ã€ããŠã³ã¡ã³ãããã®ãèŠãããšããããŸããã
numpy
ãªãPRNGã®è°è«ã¯ãããã¯ããå€ããŠããŸãã ãã®è°è«ãç¶ããããã«ããªãèªèº«ã®ãã©ãŒã©ã ã䜿ã£ãŠãã ããã ããããšãããããŸããã
@ rkern-ããã¯åºæºãšããŠå°ãå³ããããã§ãã ä»ã®å®è£ ã§å ±æãããŠããªãNumpyã®å®è£ ã«æ¬ é¥ãããå Žåã¯ãããã«ã€ããŠè°è«ããã®ã劥åœãšæãããŸãã
ç§ãèšåããŠãã亀æã¯ããã®åé¡ã§ç§ãã¡ã®ç®ã®åã«ãã決å®ãäžãã®ã«åœ¹ç«ã£ãŠããªãããšã確èªã§ããŸãã ãããé²ããŸã§ãéäžåãä¿ã€ããã«äŒè©±ãå¿ èŠã§ãã
ããåºãæèãç解ããããšã¯æçã ãšæããŸãã ã»ãã¹ãã£ã¢ãŒãã¯PCGã«ã€ããŠå°ãæ°ã«ãªã£ãŠããŠãäœå¹Žãã®éããã«å¯ŸããŠæãããããŠããŸããã ç§ã圌ã®PRNGãæ¹å€ããã®ã§ãæè¿ã¯ç§ãã¡ã®äž¡æ¹ãèŠãŠç®ã転ãããŠãããªãã¯ãäºãã«åããããæªãããšèšã人ããããããããŸããããå®éã«ã¯åœŒã䞻匵ããåŸã«ã®ã¿ããããŸããç§ã¯åœŒã®ããšã«ã€ããŠæ±ºããŠè©±ããªãããšã«ãã£ãŠäœããé ãããšããŠããŸããïŒå®éã«ã¯ãç§ã«ã¯æé/åŸæããããŸããã§ãã-å®éãç§ã¯ãããã倧äžå€«ã ãšæã£ãŠããŸããïŒã
圌ã®æ¹è©ã¯åœ¹ã«ç«ã¡ãŸãã圌ãç§ã®ä»äºã«ã€ããŠèããããšã«äººçã®å€ããè²»ããããšãéžãã ããšãå¬ããæããŸããã圌ã®ãã¹ãã¯æ¬è³ªçã«æµå¯Ÿçã§ããããšãèªèããããšãéèŠã§ãã 圌ã¯ãPCGã®æ§é ã«é¢ããç¥èã䜿çšããŠãRNGãã¹ã¿ãŒã«ââå ¥åããŠãã¹ãã«å€±æããå¯èœæ§ã®ããé 眮ãèæ¡ããŸãã
ãããã©ãã»ã©æãããããã«èŠããããèãããšãåæ§ã®æµå¯Ÿçã¢ãããŒããä»ã®å€ãã®ãžã§ãã¬ãŒã¿ãŒãããªãããããPCGã«é¢ããŠåœŒãæèµ·ããæžå¿µã®å€ããä»ã®ãžã§ãã¬ãŒã·ã§ã³ã¹ããŒã ã«ãåœãŠã¯ãŸãããšã瀺ãã®ã¯åççã§ãã XorWowã®ããã«ã以äžã§è¡ãããã«ãäŸãšããŠSplitMixããã䜿çšããŸãã ïŒç§ãã¡ã®èª°ããSplitMixã«äœããã®åœ¢ã§ç¹ã«æè³ããŠããããã§ã¯ãªããšæããŸããïŒ
ããšãã°ãSplitMixã«ã€ããŠã¯éåžžã«æãããããšããããŸããããã©ã«ãã®ã¹ããªãŒã å®æ°ã§ã¯ã35185çªç®ããšã®åºåãèŠããšãPRNGãã¹ãã¹ã€ãŒãã§å€±æããããšã瀺ããŠããŸãã ãããããïŒ ããã¯ãå
éšçã«ã¯ã«ãŠã³ã¿ãŒïŒWeylã·ãŒã±ã³ã¹ïŒïŒã0x9e3779b97f4a7c15
ïŒé»éæ¯Ïã«åºã¥ãïŒã ãã€ã³ã¯ãªã¡ã³ãããŠããããã§ããã35185 * 0x9e3779b97f4a7c15
= 0x86a100000c480245
ã 14ããããèšå®ãããäžå€®ã«äœããªã倧ããªåž¯ããããŸãã ãŸãã¯ã360998717çªç®ã®åºåããšã«èŠããšã 0x48620000800401
ã®å
éšç¶æ
ãžã®è¿œå ãšåçã«ãªããŸããããã¯ã8ãããããè¿œå ãããŠããããåºåé¢æ°ãå®å
šã«ãã¹ã¯ããã®ãé£ãããã®ã§ãã ã
SplitMixã«ã€ããŠæããç¶ããŠãèŠãŠèšãããšãã§ããŸãã1ã€ã¯å æ³å®æ°0x9e3779b97f4a7c15
ããã1ã€ã¯0xdaa66d2c7ddf743f
ã2ã€ã®ã¹ããªãŒã ãããå Žåããããã«ãã£ãŒããããšæ¬ é¥ãçºçããŸãã PRNGãã¹ãã¹ã€ãŒã!!! ããããããã¯2çªç®ã®ãã®ãä»ã®ãã®ã®ã¡ããã©3åã«ãªãããã«èæ¡ãããŠããããã§ãã
ãããŠæåŸã«ã誰ãããäž¡æ¹ã®ã¹ããªãŒã ãæäŸããã€ããã§ããããã§äœãæãããšãããŠãã ããïŒããšèšã£ãå ŽåãããããÏïŒ 0x243f6a8885a308d3
ïŒãš_e _ïŒ 0xb7e151628aed2a6b
ïŒã«åºã¥ããŠãããšããŸãããã ïŒã確ãã«ãããå°ãæããããŠãPiã¹ããªãŒã ãã6561221343çªç®ã®ã¢ã€ãã ããšã«ååŸããEã¹ããªãŒã ããã®6663276199çªç®ã®ã¢ã€ãã ããšã«æ··åããŠã2ã€ã®åäžã®ãã®ãçæããŸããã·ãŒã±ã³ã¹ã ãããŠ_ããã«æªã_ã次ã«ãã¹ããªãŒã aã®ãã¹ãŠã®ãžã£ã³ãã«ã€ããŠãåãåºåãäžããããã«ã¹ããªãŒã bã«äžèŽãããžã£ã³ããããããšã瀺ããŸãããããã£ãŠãå®éã«ã¯2 ^ 64ã®æ¹æ³ã§çžé¢ããŸã!!! ïŒãããŠãããã¯ä»»æã®2ã€ã®ã¹ããªãŒã ã«å¯ŸããŠå®è¡ã§ããŸããÏãš_e_ã«ã€ããŠç¹å¥ãªããšã¯äœããããŸããã§ãããïŒ
PCGã«æ»ããšãSebastianoã®ãã¹ãã¯ãäžèŽããåºåãã€ã³ã¿ãŒãªãŒããããããã«æ£ç¢ºã«äœçœ®åããããã2ã€ã®PCG64 XSHRRãžã§ãã¬ãŒã¿ãŒã«äŸåããŠããŸãã PRNGã®1ã€ãå°ãã ãé²ããŠãå®å šãªäœçœ®åãããå°ãã ãå£ããšãçããããã®ãæ€åºããã®ãéåžžã«é£ãããªããŸãã
ä»ã®æ¹åã§ã®åæ§ã®æµå¯Ÿçãã¹ãïŒSebastianoã«è² æ ããããïŒã¯ãPCG64 XSH RRããã®åºåã«ãããããçžé¢ããŠãããšãã圌ã®äž»åŒµãæºãããã®ãæäŸããããšã§ãããããããã©ã®ããã«èª¿æŽãããŠããããæ£ç¢ºã«äŒããŠããŸããïŒãããã¯ãã å³ã®äžè¬çãªè¿æïŒã 圌ã®ä»äºã¯ãããããçžé¢ããŠããããšã瀺ãããã®é 眮ãèŠã€ããããšã§ãã
å šäœãšããŠãç·æ¥ã®ç«çœãæ¶ç«ããããšã¯å®éã«ã¯åé¡ã§ã¯ãªããšæããŸãããäžæ¹ã§ãDXSMããŒãžã§ã³ã¯ããã®çš®ã®åé¡ãæ£ç¢ºã«è»œæžããããã«æšå¹Žäœæããããã®ãšããŠåªããŠããŸããããªããããã«åãæ¿ããŠãããããšãå¬ããæããŸãã
PS次ã®ã³ãŒãã䜿çšããŠããæ°ã«å ¥ãã®å®æ°ããéæ³ã®ã¯ã€ã«å æ³å®æ°ãäœæã§ããŸãã
WeylConst[r_,bits_] = BitOr[Floor[(r-Floor[r])*2^bits],1]
ããã¯æ°åŠã§ããPythonããŒãžã§ã³ã¯æŒç¿ãšããŠæ®ããŠãããŸãã
ããããããŸããŸãªå¢åã®äžäœãããè¡çªãæ§ç¯ããæ¹æ³ã§ãã
PCG64XSL-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
ãããªããããªã·ããã§ãé害ã¯32GiBã«å»¶é·ãããŸãã
ãªãã·ã§ã³ã®ããããžã§ãã¬ãŒã¿ãšããŠPCG64DXSMãè¿œå ããæçµçã«ã¯ããã©ã«ãã«ããå¿ èŠãããããã§ãã å®è£ ããããŸããïŒ
ããåºãæèãç解ããããšã¯æçã ãšæããŸãã ã»ãã¹ãã£ã¢ãŒãã¯PCGã«ã€ããŠå°ãæ°ã«ãªã£ãŠããŠãäœå¹Žãã®éããã«å¯ŸããŠæãããããŠããŸããã ç§ã圌ã®PRNGãæ¹å€ããã®ã§ãæè¿ã¯ç§ãã¡ã®äž¡æ¹ãèŠãŠç®ã転ãããŠãããªãã¯ãäºãã«åããããæªãããšèšã人ããããããããŸããããå®éã«ã¯åœŒã䞻匵ããåŸã«ã®ã¿ããããŸããç§ã¯åœŒã®ããšã«ã€ããŠæ±ºããŠè©±ããªãããšã«ãã£ãŠäœããé ãããšããŠããŸããïŒå®éã«ã¯ãç§ã«ã¯æé/åŸæããããŸããã§ãã-å®éãç§ã¯ãããã倧äžå€«ã ãšæã£ãŠããŸããïŒã
ãããã®èæ ®äºé ã¯å®å šã«äžé©åã ãšæããŸãã
ã¡ãªããã蚌æ ããªããä»ã®äººã®äœåïŒSplitMixãªã©ïŒãæ»æããããšã䞻匵ããŠããPCGã®æ··ä¹±ãNumpyã®ãžã§ãã¬ãŒã¿ãŒãæ¹åãããããšã¯ãããŸããã 代ããã«ãããåªããä¹æ°ããŸãã¯ããé©åã«èšèšãããã¹ã¯ã©ã³ãã©ãŒã圹ç«ã€å ŽåããããŸãã
ãŠãŒã¶ãŒãã¹ããªãŒã ãéžæã§ãããšãã«ãSplitMixã§çžé¢é¢ä¿ã瀺ããã¹ãããŸã åŸ ã£ãŠããŸãã æ確ã«ããããã«ãNumpyã®ãžã§ãã¬ãŒã¿ãŒã«ã€ããŠãç§ã¯ãã©ãŒã ã®ã¹ããŒãã¡ã³ãã蚌æããŸãã
âcâdâxâyçžé¢
ããã§ãcãdã¯å¢åïŒãã¹ããªãŒã ãïŒã§ãããxãyã¯åæç¶æ ã§ãã å®éã2 ^ 72幎ãããŸãã ã€ãŸããcãdãããã³xãã©ã®ããã«éžæããŠãã2 ^ 72yã®çžé¢é¢ä¿ã瀺ãããŸãã
SplitMixã«æäŸãããšããã察å¿ããã³ãŒãã¯ã
âcâdâxâyçžé¢
ã€ãŸããæµå¯Ÿçã«cãdãxãyãéžæãããšãçžé¢é¢ä¿ã瀺ãããšãã§ããŸãã
2ã€ã®ã¹ããŒãã¡ã³ãã®åŒ·ãã®éãã¯éåžžã«é©ç°çã§ãã 2ã€ã®ã¹ããŒãã¡ã³ããæ··åããããšããã®ã¯æ£ãããããŸããã
@vignaã¯ã @ mattipãš@rkernãããè¡åèŠç¯ã«ã€ããŠ2åèŠåãåããŠããŸãã ãä»ã®äººã®ä»äºãã¹ã©ãã·ã³ã°ããããã2ã€ã®ã¹ããŒãã¡ã³ããæ··åããããšããã®ã¯çŽç²ãªFUDããªã©ã®èšèã䜿çšããããšã¯ã§ããŸããã ãããæåŸã®èŠåãšèããŠãã ããã ããªãã®å£èª¿ãå€ããŠãã ããããããªããšç§ãã¡ã¯ããªããçŠæ¢ããŸãã æè¡çãªè°è«ã¯ãŸã æè¿ãããŠããŸããä»ã®ãã®ã¯ãã®æç¹ã§ã¯ãããŸããã
ãããã®åŒããã¥ãŒãã©ã«ãªåŒã«çœ®ãæããŠã¡ãã»ãŒãžãå€æŽããŸããã ç§ã¯ãŸã ãè°è«ã®å¥ã®åå è ãå人çã«æ»æããããšïŒãã»ãã¹ãã£ã¢ãŒãã¯PCGã«ã€ããŠå°ãäœããæã£ãŠããŠãäœå¹Žãã®éããã«å¯ŸããŠæãããããŠãããïŒã¯å®å šã«äžé©åã ãšæããŸãã ç§ã¯ããªãã®ããã§ã¯ãªãããšã«éåžžã«é©ããŠããŸãã
3åç®ã§æåŸã«ãSplitMixã«ã€ããŠã®è°è«ã¯ãã©ã¡ãã®æ¹åã§ããç§ãå°ããå©ããŠãããŸããã ãªããããå¿ èŠãªã³ã³ããã¹ããæäŸãããšæãã®ãããŸãã¯ä»ã®äººã«å¯Ÿå¿ããããåŸãªããšæããã®ãã¯ç解ã§ããŸãããããã§ã®æ±ºå®ã«åœ¹ç«ã€æ å ±ãæäŸããŠããªããšããã®ã¯çå®ã§ãã ããªãã¯äž¡æ¹ãšãããªãèªèº«ã®ãŠã§ããµã€ããæã£ãŠããŸãã ãããã䜿çšããŠãã ããã
ãããã®åŒããã¥ãŒãã©ã«ãªåŒã«çœ®ãæããŠã¡ãã»ãŒãžãå€æŽããŸããã
ããããšãããããŸããã
ç§ã¯ãŸã ãè°è«ã®å¥ã®åå è ãå人çã«æ»æããããšïŒãã»ãã¹ãã£ã¢ãŒãã¯PCGã«ã€ããŠå°ãäœããæã£ãŠããŠãäœå¹Žãã®éããã«å¯ŸããŠæãããããŠãããïŒã¯å®å šã«äžé©åã ãšæããŸãã ç§ã¯ããªãã®ããã§ã¯ãªãããšã«éåžžã«é©ããŠããŸãã
確ãã«ãããèŠãããªãã§ãã ãããããã®ã¡ãã»ãŒãžã®ããŒã³ã¯ããã»ã©æªãã¯ãããŸããã
@vignaãš@imnemeã®å»ºèšçãªäºå®ã«åºå·ããŠããã ããã°å¹žãã§ãã
OKã ãŒãããå§ããŸããããå©äŸ¿æ§ãšé床ã®ããã«ã2ã®çŽ¯ä¹ä¿æ°ãæã€LCGã«åºã¥ãããçš®ã®ã¹ããªãŒã ãåãããžã§ãã¬ãŒã¿ãŒãå¿ èŠã§ãã æç®ã¯ãLCGã®å æ³å®æ°ã«åºã¥ããŠã¹ããªãŒã ãäœæãããšãåé¡ãçºçããå¯èœæ§ãããããšã瀺åããŠããŸããïŒçŸåšã®ããã«ïŒããããå¿ èŠã§ãããšä»®å®ããŸãããã
128ãããã®ç¶æ ãšé©åãªä¹æ°ïŒå°ãªããšã65ãããïŒãåããLCGãååŸããããŸããŸãªã¢ããªã±ãŒã·ã§ã³ïŒããã·ã¥ãPRNGãªã©ïŒã§åŸ¹åºçã«ãã¹ããããSplitMixã®mixé¢æ°ã䜿çšããŠäžäœããããæ··ä¹±ãããŠã¿ãŸãããïŒåªããçµæããããããŸããïŒ
é床ã®éãã¯ãããããã ãšç¢ºä¿¡ããŠããŸãã ãããŠãçµæããã¹ãŠã®ãããã«äŸåãããšããïŒçµ±èšçãªïŒä¿èšŒããããŸãããããããã§ã®åé¡ã§ãã
ããã¯ãèªå·±çžé¢ã®åé¡ããããžã§ãã¬ãŒã¿ãŒã§ããã·ã³ã°é¢æ°ãæäœããããšããããããã巚人ã®è©ã®äžã«ç«ã€ãã¢ãããŒãã®ããã«æããŸãã
@imnemeç§ã䜿çšã§ããã®ã¯ãDXSMã«é¢ããããã°æçš¿ã§ãå€ãã¡ã¬ã€ã·ã¥ãŒã®ãã®çºè¡šã³ã¡ã³ãããããªã³ã¯ãç°¡åã§ãã ãã®ã³ã¡ã³ãã®å 容ãããã¯ããã«å€ãå¿ èŠã¯ãããŸããããããã§èšåãããã¹ãã®çŸåšã®ã¹ããŒã¿ã¹ãå«ãããšããã§ãããã ãã®éçºã«ã€ãªãã£ãã¡ã¬ã€ã·ã¥ãŒããã®è°è«ã®ããã€ããèŠçŽãããã®ã§ããã°ãããã¯ç¢ºãã«æçšã§ãããå®å šã«å¿ èŠãšããããã§ã¯ãããŸããã
@vigna
128ãããã®ç¶æ ãšé©åãªä¹æ°ïŒå°ãªããšã65ãããïŒãåããLCGãååŸããããŸããŸãªã¢ããªã±ãŒã·ã§ã³ïŒããã·ã¥ãPRNGãªã©ïŒã§åŸ¹åºçã«ãã¹ããããSplitMixã®mixé¢æ°ã䜿çšããŠäžäœããããæ··ä¹±ãããŠã¿ãŸãããïŒåªããçµæããããããŸããïŒ
ãããåå£ã«èãããå Žåã¯ãè©«ã³ããŸããïŒç¢ºãã«ææãããŸããïŒãããã¯èª å®ã§ããããŸããå®è£ ãåæããã³ãããŒã¯ãããã³PractRandã®çµæãWebãµã€ããŸãã¯arXivã§è¡šç€ºãããããšã楜ãã¿ã«ããŠããŸãã ç§ãã¡ã¯ããã§ã¯ïŒåççãªæ å ±ã«åºã¥ããïŒå®è·µè ã§ãããPRNGç 究è ã§ã¯ãªãããã®ææ¡ãå®è¡ããããã®ååãªèšåãæŽã£ãŠããŸããã ãã®æå³ã¯ããããŸãããå人çãªæéã«ä»ã®å¶çŽãããããšãèãããšãææ¡ããå®è£ ãåæã«è³ããŸã§åªåããåŸåã¯ãããŸããã ãã®ææ¡ãnumpyã«å¯ŸåŠããå Žåã¯ãPRNGç 究è ããã®äœæ¥ãè¡ãå¿ èŠããããŸãã ããªããæ¬åœã«ä»ã®èª°ãã«ãã®ææ¡ã«åãçµãã§ãããªããããªãã®ãŠã§ããµã€ãã䜿ã£ãŠãã ããã
NumPyã®ã©ã³ãã ãªGenerator
-> BitGenerator
-> SeedSequence
ã¢ãŒããã¯ãã£ã¯ããã©ã°ã€ã³å¯èœã§ããããšãæå³ãããŠããŸãã è°è«ã®äžã§ãBitGeneratorã®PRãéãããã«èª°ããå¿
èŠã«ãªããšãããŸã§æ¥ãŠãããšæããŸããããããã°ããã®å®çšçãªå±æ§ãçŸåšNumPyã«ãããã®ãšæ¯èŒã§ããŸãã ãããžã§ã¯ãã®äžéšã«ãªããšãåŒãç¶ããã¹ããè¡ãããšãã§ããããã©ã«ãã«ããããšã決å®ããå ŽåããããŸãã ãã®æ±ºå®ã¯ãç§ãæãã«ã
BitGenerator.spawn
ãšSeedSequence
ã䜿çšããŠãç§ãã¡ãæšé²ããèŠç¯çãªã€ã³ã¿ãŒãã§ãŒã¹ãä»ããããŸããŸãªã¿ã€ãã®ã¹ããªãŒã è¡çªã®ç¢ºçãå人çã«ã¯ã spawn
ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããã³ãŒããä»ããŠBitGenerators
ã®ã¡ãªããã«ã€ããŠè°è«ããããšãé¿ãããšãããã®è°è«ã¯ç§ã倱ããŸããã ãã¹ããã©ã¯ãã£ã¹ãšããŠå®£äŒããã®ã«ã¯çç±ããããä»åŸã®PRã®è°è«ãNumPyãŠãŒã¶ãŒã®ãã¹ããã©ã¯ãã£ã¹ãŸãã
ãããããããã§ã®çµè«ã®1ã€ã¯ã jumped
ãŸãã¯advance
ã䜿çšãããšã°ãããã©ã¯ãã£ã¹ã«åããå¯èœæ§ããããããã¡ãœãããšããŠspawn
ã®ã¿ãèš±å¯ããå¿
èŠããããšããããšãããããŸããã ããã«çŠç¹ãåœãŠãæ°ããåé¡ãŸãã¯NEPãçç£çã§ããå¯èœæ§ããããŸãã
泚æ@vignaãç§ãã¡ã«åœ±é¿ããããšãäžäœãããã®èªçæ¥ã®è¡çªã@mattip SeedSequence.spawn()
åæ§ã®ã€ã³ã¿ãŒãã§ã€ã¹ãã ç§ãè¡ã£ãè°è«ã®ã©ã®éšåããAPIã®é©åãªäœ¿çšã«é¢é£ããŠããã®ã§ãå®å¿ãã ããã
@rkernãæšå¥šããå®å šã«ç¬ç«ãããžã§ãã¬ãŒã¿ãŒã®ã¢ãããŒãã䜿çšããã«ã¯ãããã€ãã®#ifdefãããã¯ã䜿çšããŠpcg64.cã«çŽ8è¡ãè¿œå ããã ãã§æžã¿ãŸãã pyx / pxdã¯ããã以å€ã®ç¹ã§ã¯ãæ£ããå®çŸ©ïŒPCG_DXSM = 1ïŒãšæŽæ°ãããdocstringã§ã®ã¿æ§ç¯ãããŠãã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
ãã®æç¹ã§MurmurHash 3ãè¿œå ããããšãã§ããŸããããã®åŸåã匷ãã£ãã®ã§ãã
if
ã¹ããŒãã¡ã³ãã¯ã³ã³ãã€ã«ãããŸããïŒ ãããã«ãŒãå
ã«ãããã®åæ°ãå¿
èŠã ãšã¯æããŸããã
ç¹°ãè¿ããŸãããããã¯randomgen
ãšnumpy
ç®çã®éãã«åž°çããŸãã ãã©ã¡ãŒã¿åããããã¡ããªãäœæããããšã¯randomgen
æå³ããããŸããã numpy
ã§ã¯ãã¢ã¯ãã£ããªããã©ã«ãããã¬ã¬ã·ãŒBitGenerator
ã®å®è£
ã絡ãŸããããšã¯è¯ãèãã§ã¯ãªããšæããŸãBitGenerator
ã ã©ã¡ããäžæ¹ã®ããã©ãŒãã³ã¹ã®ããã«ã¡ã³ããã³ã¹ããªãã¡ã¯ã¿ãªã³ã°ãè¡ãå¿
èŠãããå Žåããã®åªåã¯æ¹åãããã®ã§ã¯ãªãæªåããã ãã§ãã
ããã§ãããŒãã«åæããŸãã 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()
䜿çšããŠåºåã«ããªå埩ç¶æ ã§ã¯ãªããåŸã®å埩ç¶æ ãšåãã³ãŒããã¹ãç¶æããããã«ãç°¡åãªããã§ããããšãè¡ã£ãŠããªãã®ã§ã#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ãã¹ãåžžã«å®äŸ¡ãªä¹æ°ã䜿çšããŠããããšãæå³ããŸãã
ããªããããã§äœãèšãããšããŠããã®ãããããŸããã
æ£èŠã®PCG64DXSMãäœã§ãããã¯äžæã§ãã ãããã®å Žåããåºåé¢æ°ã¯64ãããæŒç®ã®ã¿ã䜿çšããŸãã ã䜿ãã®ããŒãžã§ã³ã§ã¯ãå¥ã®å Žæã§64ãããä¹ç®åšã䜿çšããŠããã«é«éåãããã¹ãã§ã¯ãªããã¬ãè¿ããŸãã setseq_dxsm_128_64
ã¯ãæ¢åã®PCG64ã®èªç¶ãªæ¡åŒµã®ããã§ãåºåé¢æ°ã®ã¿ãå€æŽããŸãã
ãããªãã»ã©ã ããããCã§å®è£
ãããã®ãšã¯ç°ãªãC ++ãžã§ãã¬ãŒã¿ãŒã䜿çšããŸããã setseq_dxsm_128_64
ã§ã¯ãªããLCGå埩ã§ãå®äŸ¡ãªä¹æ°ãã䜿çšããcm_setseq_dxsm_128_64
ãšåçã®ãã®ãå®è£
ããŸããã LCGå埩ã§å€§ããªä¹æ°ã䜿çšããŸãã ãå®äŸ¡ãªä¹æ°ãã¯DXSMåºåé¢æ°å
ã§åå©çšãããŸãããããã¯çŽäº€èšèšè»žã§ãã
ãªãsetseq_dxsm_128_64ã奜ãŸãªãã®ã§ããïŒ
@imnemeã¯ãæçµçã«C ++ããŒãžã§ã³ã®å
¬åŒpcg64
ãã setseq_dxsm_128_64
ã§ã¯ãªãcm_setseq_dxsm_128_64
ãæãããã«å€æŽãã
äºåå埩ç¶æ ãåºåããããšããããã©ãŒãã³ã¹ãã³ãã®äžéšã§ãã
ããã€ãã®ã¿ã€ãã³ã°ã¯æ¬¡ã®ãšããã§ãã
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
ãšããŠã®æåãæšé²ããŸããã ãããã¯ãIMOã®numpy
ã®æãè¿ãåæ©ã§ãã
ãã©ã³ãã®ã¹ããã¯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ã®ç¹æ®ãªå®è£
ã䜿çšããŠãã2ã€ã®éã®#ifdefs
ã¯ã»ãã®ãããïŒç§ãæã£ãŠãããããå€ãïŒã§ãããšç§ã¯ãŸã èšããŸãã ããã«ãRSN MSãŠãŒã¶ãŒã¯clangïŒ13816ðã䜿çšã§ããããã«ãªããŸãã
ã³ãŒãã®éè€ã«ã€ããŠè°è«ããŠããŸããïŒ #ifdefs
é£èªåãããæ°è¡ã®ã³ãŒãã«ã€ããŠå¿é
ãããããããŸãšãŸãã®ãªãå®è£
ãå¿
èŠã§ã:)
ãPCG2.0ãïŒã§ããã°NumPyã®GitHubã®åé¡ã§ã¯ãªãå ŽæïŒãå®çŸ©ããå®å šã«æ確ãªã¹ããŒãã¡ã³ãã®å¿ èŠæ§ã匷調ããŠããŸããããããã¯ã»ãšãã©åè«ã§ããã
ããããšãã @ rkern etalã
@imnemeç§ã䜿çšã§ããã®ã¯ãDXSMã«é¢ããããã°æçš¿ã§ãå€ãã¡ã¬ã€ã·ã¥ãŒã®ãã®çºè¡šã³ã¡ã³ãããããªã³ã¯ãç°¡åã§ãã ãã®ã³ã¡ã³ãã®å 容ãããã¯ããã«å€ãå¿ èŠã¯ãããŸããããããã§èšåãããã¹ãã®çŸåšã®ã¹ããŒã¿ã¹ãå«ãããšããã§ãããã ãã®éçºã«ã€ãªãã£ãã¡ã¬ã€ã·ã¥ãŒããã®è°è«ã®ããã€ããèŠçŽãããã®ã§ããã°ãããã¯ç¢ºãã«æçšã§ãããå®å šã«å¿ èŠãšããããã§ã¯ãããŸããã
æéæ ãèããŠããŸããïŒ ç§ã¯ãã°ããã®éãããè¡ãã€ããã§ãããä»ã®ããšã«ãã£ãŠãããæŒãåºããŠãããããšãæå³ããŠããã®ã§ãå®éã«ææ¡ãããæéãæã€ããšã¯ç§ã«ãšã£ãŠæçšãªåæ©ã«ãªãã§ãããã ãã¶ãäžé±éïŒ äºïŒ
@rkernã¯@vignaãåŒçšããŸããã
128ãããã®ç¶æ ãšé©åãªä¹æ°ïŒå°ãªããšã65ãããïŒãåããLCGãååŸããããŸããŸãªã¢ããªã±ãŒã·ã§ã³ïŒããã·ã¥ãPRNGãªã©ïŒã§åŸ¹åºçã«ãã¹ããããSplitMixã®mixé¢æ°ã䜿çšããŠäžäœããããæ··ä¹±ãããŠã¿ãŸãããïŒåªããçµæããããããŸããïŒ
FWIWããã®ã¢ãããŒãã¯å ã®PCGããŒããŒã§èª¬æãããŠãããéåžžã«ãã䌌ãä¹ç®xorshiftããã·ã¥é¢æ°ã§ããæ¢è£œã®ããã·ã¥é¢æ°ãšããŠ_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ã®åé¡ã«ã€ããŠãããŸãå¿é ããŠããŸãããæšå¥šãããæé ã䜿çšããŠãåé¡ãçºçããå¯èœæ§ã¯ã»ãšãã©ãªãããã§ãã
@ imneme1é±éã¯çŽ æŽãããã§ãããã 2é±éã§ååã§ãããã ããããšãïŒ
ç§ãèªåèªèº«ã«åããããŠãã質åããããŸãããããã¯ãã話é¡ããå€ããŠããŸãã ããããžã§ãã¬ãŒã¿ãŒã§ã©ã³ãã ããããçæããå¿ èŠããããŸãããAFAICTã§ã¯ãã»ãšãã©ã®ãã¹ãã«ã¯æŽæ°ãå«ãŸããŸãã å®éã«ãããããã¹ãããéã«ãæ¢åã®ãã¹ãã¯ã©ã®çšåºŠããŸãæ©èœããŸããïŒ ãã®å°åã«è©³ãã人ããã®è³ªåã«çããŠãããããç§ã¯æãæè¬ããŠããŸãã
ãã¹ããããŠããã®ã¯ãããã¹ããªãŒã ã§ãã ãã¹ããœãããŠã§ã¢ã«ãåºåããPRNGã®èªç¶ãªã¯ãŒããµã€ãºãéç¥ããŸããããããã®æé©ãªæãç³ã¿ãå®è¡ããŠããããã®äžäœããããŸãã¯äžäœãããã§çºçããåŸåã®ãããšã©ãŒãæãå¹ççã«åŒãèµ·ããããšãã§ããããã«ããããã§ããæªãPRNGã®åèªã æè¿ç§ãã¡å šå¡ã䜿çšããåŸåã®ãããœãããŠã§ã¢ã¯PractRandã§ããããã®ãã¹ãã¯ããã«ç°¡åã«èªãã®ã«TestU01ã®è«æã§ãã ãã®ãŠãŒã¶ãŒã¬ã€ãã«ã¯ããã¹ãã®è©³çŽ°ãèšèŒãããŠããŸãã
ãããåå£ã«èãããå Žåã¯ãè©«ã³ããŸããïŒç¢ºãã«ææãããŸããïŒãããã¯èª å®ã§ããããŸããå®è£ ãåæããã³ãããŒã¯ãããã³PractRandã®çµæãWebãµã€ããŸãã¯arXivã§è¡šç€ºãããããšã楜ãã¿ã«ããŠããŸãã ç§ãã¡ã¯ããã§ã¯ïŒåççãªæ å ±ã«åºã¥ããïŒå®è·µè ã§ãããPRNGç 究è ã§ã¯ãªãããã®ææ¡ãå®è¡ããããã®ååãªèšåãæŽã£ãŠããŸããã ãã®æå³ã¯ããããŸãããå人çãªæéã«ä»ã®å¶çŽãããããšãèãããšãææ¡ããå®è£ ãåæã«è³ããŸã§åªåããåŸåã¯ãããŸããã ãã®ææ¡ãnumpyã«å¯ŸåŠããå Žåã¯ãPRNGç 究è ããã®äœæ¥ãè¡ãå¿ èŠããããŸãã ããªããæ¬åœã«ä»ã®èª°ãã«ãã®ææ¡ã«åãçµãã§ãããªããããªãã®ãŠã§ããµã€ãã䜿ã£ãŠãã ããã
ç§ã¯ããªãã®èŠç¹ãå®å šã«ç解ããããšãã§ããŸãã ã³ãŒããšãã³ãããŒã¯ã¯ãããŒãžã®äžéšã«ãããLCG128Mixãšããååã§æ°å¹ŽåããPCGïŒhttp://prng.di.unimi.it/pcg.phpïŒã®åé¡ã«ã€ããŠã³ã¡ã³ãããŠããŸãã ç§ã®ããŒããŠã§ã¢ãIntelïŒRïŒCoreïŒTMïŒi7-7700 CPU @ 3.60GHzãgcc9.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ãããã®ãã¹ãŠã®ãããã«äŸåãããšããçµ±èšçä¿èšŒããããŸããç¶æ ã
ä»ã®ãžã§ãã¬ãŒã¿ãŒã«å¯Ÿãããã³ãããŒã¯ããŸãã¯ä»ã®ã³ã³ãã€ã©ãŒã®äœ¿çšã念é ã«çœ®ããŠããå Žåã¯ããç¥ãããã ããã
ãã ããåãããã«èª å®ã«ãé¡ãããŸããæšæºã³ã³ããŒãã³ãã®ã¿ã䜿çšããã巚人ã®è©ã®äžã«ç«ã€ãèšèšãæ€èšããããšã«æ¬åœã«é¢å¿ãããå Žåã«éããŸãã ç§ã®æéã«ãå人çãªå¶çŽããããè²¢ç®ã§ããŠããããã§ãããèæ ®ãããæ©äŒã®ãªãçºé»æ©ã«æéãè²»ããããšã¯é¿ããããšæããŸãã
ãšããã§ãé¢é£ããä¹ç®åšã®å質ãæ¹åããæ¹æ³ã®ããå ·äœçãªå°ºåºŠãäžããããã«ãPCGDXSããã³ããã€ãã®ä»£æ¿ã§äœ¿çšãããŠããçŸåšã®64ãããä¹ç®åšã®f2ããf1ãŸã§ã®ã¹ãã¯ãã«ã¹ã³ã¢ãèšç®ããŸããã
ã¹ãã¯ãã«ã¹ã³ã¢ã¯ãä¹æ°ã®è¯ããå€æããããã®æšæºçãªæ¹æ³ã§ãã 0ã¯æªãã1ã¯åªããŠããŸãã åã¹ã³ã¢ã¯ãåºåã§ãã¢ãããªãã«ã4ã¿ãã«ãªã©ãã©ã®çšåºŠé©åã«åæ£ãããŠãããã瀺ããŸãã
TAoCPã®Knuthã瀺åããŠããããã«ããããã®7ã€ã®æ°å€ã¯ãå€å žçãªã¡ãžã£ãŒãæå°ããŸãã¯å éã¡ãžã£ãŒïŒæåã®ã¹ã³ã¢ã«å ããŠã2çªç®ã2ã§å²ã£ããã®ãªã©ïŒã§åéããŠãæåã®ã¹ã³ã¢ãããéèŠã«ããããšãã§ããŸãã ãããã³ãããã¯ãçŸåšã®ä¹æ°ã®æå°å€ãšå éã¡ãžã£ãŒã§ãã
0xda942042e4dd58b 0.633 0.778
ãããããã¯ããã«åªãã64ãããå®æ°ããããŸãã
0xff37f1f758180525 0.761 0.875
åºæ¬çã«åãé床ã§ïŒå°ãªããšãLCG128Mixã®å Žåã¯åãé床ã§ïŒã65ãããã«ç§»è¡ãããšãããé©åãªå éã¡ãžã£ãŒãåŸãããŸãã
0x1d605bbb58c8abbfd 0.761 0.899
ãã®çç±ã¯ã64ãããä¹æ°ã«ã¯fâã¹ã³ã¢ïŒâ€0.93ïŒã«åºæã®å¶éãããããã§ããããã¯ãã¯ããŒã¹ãæãé¢é£æ§ããããšææããŠããŸãã
0xda942042e4dd58b5 0.795
0xff37f1f758180525 0.928
0x1d605bbb58c8abbfd 0.992
ãããã£ãŠãæåã®ä¹æ°ã®ã¹ã³ã¢ã¯å¹³å¡ã§ãã 2çªç®ã®ä¹ç®åšã¯ã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ã®åªããããã©ã«ãã®prngã§ããããããè¡ãããã®ããææã§ãã¹ããããŠããªãæ¹æ³ããããããæéã®è©Šç·Žã«èãããããšã¯æããŸããã 以äžã®ãããããææ¡ããŸãã
ååæ··æ²ãšããSFC64ã¯ãçµ±èšçã«å¥å šãªãžã§ãã¬ãŒã¿ãŒã®äžã§æãé«éã§ãæå°æéãããªãé·ããã®ã®1ã€ã§ãã 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ãããã®ã«ãªã¹/æ§é åç¶æ
ã䜿çšããŠããããã©ã³ã¹ãåããŠããããã§ãã
/ç·šéïŒåºåé¢æ°ãã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ãã¹ãã§4 TBã«åæ ŒããŠããããããŸã§åé¡ãªãVignaã®ããã³ã°éã¿ãã¹ããç°¡åã«å®è¡ããŸããïŒãã ãããããã®ãã¹ãã«åæ ŒããŠããã»ãŒçã®ã©ã³ãã åºåãä¿èšŒãããããã§ã¯ãªããprngã«æ¬ é¥ããããã©ããã®ãã¹ãã§ãã ïŒã
泚ïŒãããã®çŽ50ïŒ ãèšå®ãããïŒäžæã®ïŒã©ã³ãã Weylå®æ°ã䜿çšããããšã¯ãçµ±èšçã«ã¯ããããå©ç¹ã§ãããããã«ãã¹ããŸãã¯åæããã ãã§ããããã©ãã»ã©éèŠã§ããããæããã«ãªããŸãã
/ç·šéïŒã¯ãªãŒã³ã¢ããã
@ tylo-work SFC64ã¯Philoxãšãšãã«ãã§ã«NumPyã«ãããããã¯ããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒã«é¢ãããã®ã§ãã
ããŠãã©ããå®è£ ãããŠããã®ãæ£ç¢ºã«ã¯ããããªãã£ãã®ã§ãããã¯ãããã®äžããå šäœçã«æãé©ãããã®ãéžæããããšã ãã§ããïŒ ååã«å ¬å¹³ã§ãããæ確ã«ããŠãããŠããããšãã
ææ¡ãããžã§ãã¬ãŒã¿ãŒãåºç¯å²ã«ãã¹ãããŠãä»ã®ãžã§ãã¬ãŒã¿ãŒãšã©ã®ããã«é£æºãããã確èªããŸãããããŸã§ã®ãšãããé床ãåºåå質ãã·ã³ãã«ã/ãµã€ãº/移æ€æ§ãããã³å€§èŠæš¡ãªäžŠå䜿çšã«é¢ããŠã¯éåžžã«èŠæ ããããŸãã ããããä»ã®äººãããããã¹ãããŠããããå¬ããã§ãã
NumPyã®ããŒãžã§ã³ã¯ã k=1
ãæã€æšæºã®ããªã¢ã³ãã§ãã
ããã©ã«ãã®PRNGã«ã€ããŠã®è°è«ãæåããåéããã€ããã¯ãªããšæããŸãã çŸåšã®PRNGã«ã¯éåžžã«å ·äœçãªåé¡ãããããã®ç¹å®ã®åé¡ã«å¯ŸåŠãããå©çšå¯èœãªå¯æ¥ã«é¢é£ããããªã¢ã³ããæ€èšããŠããŸãã ç§ãã¡ã®æžå¿µã®1ã€ã¯ãçŸåšã®ããã©ã«ãã®PRNGãããžã£ã³ãå¯èœæ§ãªã©ã®PRNGã®ç¹å®ã®æ©èœãå ¬éããŠããããšã§ããããã¯ãããã眮ãæããããªã¢ã³ããåŒãç¶ãå ¬éããå¿ èŠããããŸãã SFC64ïŒç§ãã¡ãŸãã¯ããªãã®ãã®ïŒã«ã¯ãã®æ©èœããããŸããã
@bashtageã¯ã SFC64ã®Weyl-streamããªã¢ã³ããè¿œå ããããã«
@ tylo-work䞊åå®è¡ã«èå³ãããå Žåã¯ãNumPyã®SeedSequenceå®è£ ã確èªããããšããå§ãããŸãã
ããã©ã«ãã®PRNGã«ã€ããŠã®è°è«ãæåããåéããã€ããã¯ãªããšæããŸãã çŸåšã®PRNGã«ã¯éåžžã«å ·äœçãªåé¡ãããããã®ç¹å®ã®åé¡ã«å¯ŸåŠãããå©çšå¯èœãªå¯æ¥ã«é¢é£ããããªã¢ã³ããæ€èšããŠããŸãã
PCG-DXSã®ãããªãã®ãå¿ èŠãªå Žåã¯ãå®æ°ãæ¹åããã ãã§ããã«æ¹åãè¡ãããšãã§ããŸãïŒãããŠéåžžã«ããããªé床äœäžïŒã ããšãã°ãPCG-DXSã¯ãåãäžäœ112ãããã®ç¶æ ãæã€2ã€ã®ã€ã³ã¿ãŒãªãŒããããçžé¢ãããµãã·ãŒã±ã³ã¹ã§ã2ã€ã®ç°ãªãã¿ã€ãã®ãã¹ãã«ããã«å€±æããŸãã
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ãããã®ä¹ç®åšã§ãã¹ãã¯ãã«ã¹ã³ã¢ãã¯ããã«åªããŠããŸãã 2çªç®ã®æ°å€ã¯ã64ãããã®åºå®å°æ°ç¹è¡šçŸã®é»éæ¯ã§ãããããã«ã¯åªããæ··åç¹æ§ãããããšãç¥ãããŠããŸãïŒä¹æ³ããã·ã¥ã«é¢ããKnuth TAoCPãåç §ïŒã ããšãã°ãããã·ã¥ã³ãŒããæ··åããããã«Eclipseã³ã¬ã¯ã·ã§ã³ã©ã€ãã©ãªã«ãã£ãŠäœ¿çšãããŸãã
ãã®çµæãåãéã®ããŒã¿ã«å¯ŸããŠ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ã¯ãåãã€ã³ã¿ãŒãªãŒããããçžé¢ãµãã·ãŒã±ã³ã¹ã®3ã€ã®ã¿ã€ãã®ãã¹ãã«å€±æããŸãã
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Ïãã®ã£ãããš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ãããä¹ç®åšã«ãã£ãŠåŒãèµ·ããããïŒãšãããŒããã2ã€ã®64ãããå®æ°ãããããã§ãã
ç§ã¯äžè¬çã«ãã®çš®ã®ãžã§ãã¬ãŒã¿ãŒãæšå¥šããŠããŸããããPCG65-DXSÏã¯çžé¢ãé ãç¹ã§PCG-DXSãããããªãåªããŠããŸãã
@Vigna ã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 **ã¯ãç§ã®ãã·ã³ã§ã¯ä»ã®2ã€ãã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ãªããžããªã«äœåãæçš¿ããããã«ãã1ã€æçš¿ããŠãããã«ãã人ã ãæåŸ ããããšããå§ãããŸãã ä»ã®çãããããã§è¿ä¿¡ããŠãã ããã ãååããããšãããããŸãã
@imneme @ rkern1.19ãªãªãŒã¹ã®æéãäžè¶³ããŠããŸãã
@rkern PCG64DXSMã¯1.19.0ã«ãªããªãããã§ãããä»é±æ«ã«ãªãªãŒã¹ããŸãã äžèšã®å€æŽããªã·ãŒ/ä»åŸã®å€æŽã«ã€ããŠã®ã¡ã¢ãæžããŠããã ããã°å¹žãã§ãã
ç³ãèš³ãããŸããããç§ã¯ä»ã®ããã€ãã®ç¡é¢ä¿ãªåé¡ãæ±ã£ãŠããŸããã ç§ãã¡ã®è°è«ã«åºã¥ããšãPCG64DXSMã¯ïŒå°ãªããšãä»ã®ãšããïŒæ°ããããã©ã«ãã§ã¯ãªãã代æ¿ãªãã·ã§ã³ãšããŠèšç»ãããŠãããããå°ããªé 延ã¯å€§ããªåé¡ã§ã¯ãªããšæããŸãã
1.20ãèµ·åããŠããã®ã§ããããåæ€èšããŠDXSMã«ç§»è¡ããæãæ¥ãŸãããïŒ
åå²ããåã«ç§»åããæéã¯ãŸã ãããŸãããæ¥é±ãããã以å
ã«éå§ããã®ãè¯ããããããŸããã @bashtage PCG64DXSM
æºåãã§ããŠãããšæããŸãããããã«ã¯äž»ã«ããã©ã«ãã¹ããªãŒã ã®ã¹ã€ãããåãæ¿ãã決å®ãå¿
èŠã§ããïŒ
èŠããšãããããã«å©çšã§ããã®ã§ããã°ã1.20ã§ãããå®è¡ããå¿ èŠãããããã«æããŸããã
IIRCããªã³ã¯ã§ãããªãã¡ã¬ã³ã¹ãåŸ ã£ãŠããŸããã ããããä¹±æ°ã®äººã ãå€æŽã«æºè¶³ããŠããå Žåã¯ãããã䜿çšããå¿ èŠããããŸãã Windowsçšã®ç¹å¥ãªã³ãŒããå¿ èŠã§ããïŒ
ããã¯ãç°ãªãå®æ°ãšç°ãªãã¹ã¯ã©ã³ããªã³ã°é¢æ°ã§ãã @rkernãWindowsã§ã®å ã®PCG64å®è£ ã®ããã«æžãããã®ã»ã©æ¬æ°ãªãã®ã¯ãããŸããã ã³ãŒããå ±æããã®ã§ã¯ãªããå®å šã«ã¹ã¿ã³ãã¢ãã³ã®PCG64DXSMã䜿çšããããšã«ãããšæããŸãïŒããã©ãŒãã³ã¹ã®ããïŒã
rkernã®WIPãã©ã³ãããå§ããã®ã¯ããããçã«ããªã£ãŠããŸãã
@rkernãæãã§ãããšæãããã°æçš¿ãæžããšèšã£ãã®ã§ãããä»ã®åé¡ã«ã@ rkernã¯ããã«åŒ·åãªåºåé åã奜ãã ã£ããšæããŸããã