BitGenerator
ãããã©ã«ããšããŠæå®ãããŸããæ°ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®æåã®ãªãªãŒã¹ã®åã«æ±ºå®ãäžãå¿ èŠããããŸãã ãªãªãŒã¹ããããšããã°ããã®éç§ãã¡ã®éžæã«åºå·ããã®ã§ãç§ãã¡ã¯ç§ãã¡ã®æ±ºå®ã«æºè¶³ããŠããããšã確èªããå¿ èŠããããŸãã
äžæ¹ãããã©ã«ãã®éžæã¯ããã®å€ãã®çµæãæã£ãŠããŸããã numpy.random.*
ã³ã³ãããšã³ã¹é¢æ°ã®åºç€ãšãªãããã©ã«ãã®BitGenerator
ã«ã€ããŠã¯è©±ããŠããŸããã NEP 19ã«ãããšããããã¯ã¬ã¬ã·ãŒRandomState
ãšã€ãªã¢ã¹ã®ãŸãŸã§ããããã®BitGenerator
ã¯MT19937
ã§ãã ããã©ã«ããçºçããå¯äžã®å Žæã¯ã Generator()
ãåŒæ°ãªãã§ã€ã³ã¹ã¿ã³ã¹åãããå Žåã§ãã ã€ãŸãããŠãŒã¶ãŒãä»»æã®ç¶æ
ã§Generator
ãèŠæ±ããå Žåããããããã®äžã§.seed()
ã¡ãœãããåŒã³åºããŸãã å®éã«å¿
èŠãªã·ãŒããããBitGenerator
ã䜿çšããŠæ瀺çã«ã€ã³ã¹ã¿ã³ã¹åããã®ã¯ã»ãŒåããããç°¡åãªã®ã§ãããã¯ããããããªããŸããªããšãããããŸããã ããã§ã®æ£åœãªéžæã¯ãå®éã«ã¯ããã©ã«ããæå®BitGenerator
ãæå®ããããã«èŠæ±ããããšãããããŸããã
ããã§ããã»ãšãã©ã®å Žåãã©ã®BitGenerator
人ã䜿çšãã¹ããã«ã€ããŠã®æšå¥šäºé
ããããŸããæšå¥šäºé
ã¯ããªãèªç±ã«å€æŽã§ããŸãããå Žæã«èªããæã£ãŠãã人ã¯ãããããæ¬ãããã°ããã¥ãŒããªã¢ã«ã§æãå€ãæžãããã§ãããã ã ãªã©ã
IMOãããã€ãã®äž»ãªãªãã·ã§ã³ããããŸãïŒç§ã®è§£èª¬ã§ã¯ãåæããªãã§ãã ãããïŒ13163ããã®é¢é£ãããã¹ãŠã®ã³ã¡ã³ãã移æ€ããããšã¯ããŠããŸããïŒïŒ
åžžã«Generator(ChosenBitGenerator(maybe_seed))
ãå¿
èŠã§ãã ããã¯å°ãäžèŠªåã§ãããåçŸæ§ã®ããã«ãžã§ãã¬ãŒã¿ãŒãé©åã«åæåããããã®éåžžã«äŸ¿å©ãªæ¹æ³ã§ãããããããã©ã«ããããå Žåã§ãããšã«ãããããè¡ãããšã«ãªããŸãã
MT19937
ããã¯æ§ãããªéžæã§ãã ããã¯ç¢ºãã«çŸç¶ããæªãã¯ãããŸããã ã¡ã«ã»ã³ããã€ã¹ã¿ãŒã¯äŸç¶ãšããŠãæšæºãã®éžæè¢ãšåºãèŠãªãããŠãããããPRNGã®ç¹å®ã®å質ã«é¢ä¿ãªãããéæšæºãã®éžæè¢ã«çåãåããå¯èœæ§ã®ãã人ã
ãè«æãã¬ãã¥ãŒããå¿
èŠãããåŠè¡ãŠãŒã¶ãŒã«åœ¹ç«ã€å¯èœæ§ããããŸãã ãIBMãéã£ãããšã§è§£éããã人ã¯ããŸãããã MT19937
ã®äž»ãªæ¬ ç¹ã¯ãç¶æ
ãéåžžã«å€§ãããããå©çšå¯èœãªä»£æ¿æ段ã®ããã€ããããé
ãããšãšãããã€ãã®çµ±èšçå質ãã¹ãã«å€±æããããšã§ãã å¥ã®PRNGãéžæããéã«ãããã§æèŠãè¿°ã¹ã_æ©äŒ_ïŒãã ãã_矩å_ãIMOã§ã¯ãªãïŒããããå¿
èŠã«å¿ããŠãæšæºãã移åããããšããŸãã
PCG64
ããã¯ãç§ãå人çã«æãé »ç¹ã«äœ¿çšãããã®ã§ããå¯èœæ§ããããŸãã äž»ãªæ¬ ç¹ã¯ã128ãããæŽæ°æŒç®ã䜿çšããããšã§ããããã¯ãã³ã³ãã€ã©ããã®ãããªæŽæ°åãæäŸããªãå ŽåãCã§ãšãã¥ã¬ãŒããããŸãã ãããåœãŠã¯ãŸã2ã€ã®äž»èŠãªãã©ãããã©ãŒã ã¯ã32ãããCPUãš64ãããMSVCã§ãããCPUããµããŒãããŠããå Žåã§ã128ãããæŽæ°ããµããŒãããŠããŸããã å人çã«ã¯ãããã©ãŒãã³ã¹ããŸããŸããŸãã«ãªã32ãããCPUã«éžæãä»»ããããšã¯ãå§ãããŸããã ãã ããMSVCã®ããã©ãŒãã³ã¹ã¯éèŠã§ããããã¯ãWindowsãã«ãã«ã¯ãã®ã³ã³ãã€ã©ãå¿ èŠã§ãããä»ã®Windowsã³ã³ãã€ã©ã¯å¿ èŠãªãããã§ãã ããããããã€ãã®ã¢ã»ã³ããª/ã³ã³ãã€ã©çµã¿èŸŒã¿é¢æ°ã§å¯ŸåŠã§ããŸããã誰ããããããäœæããå¿ èŠããããŸãã ãããè¡ãå¿ èŠãããã®ã¯MSVCã®ã¿ã§ãããšããäºå®ã«ãããã¢ã»ã³ããªã«çŽé¢ããŠããä»ã®å Žåãããããããããããå£åœãããè¯ããªããŸãã
Xoshiro256
å°åã§é«éãªPRNGã®ãã1ã€ã®ææ°ã®éžæè¢ã ããã€ãã®æ¢ç¥ã®çµ±èšäžã®çããããŸãããã»ãšãã©ã®çšéã§äž»èŠãªèŠå ã«ãªãå¯èœæ§ã¯äœãã§ãã ãããã®çã¯ç§ãããããé ãããããŸãããããããã¯ç§ãæžãããšã«ãªãã³ãŒãã®ããã®ç§ã®å人çãªéžæã§ãã
Intel Windowsã³ã³ãã€ã©ã¯128ãããæŽæ°ã«å¯ŸããŠäœãããŸããïŒ Windowsäžã®MT1993ãšæ¯èŒããŠãPCG64ã¯MSVCã§ã³ã³ãã€ã«ãããã®ãã©ããããé ãã§ããïŒ ãžã£ã³ãã¢ãããæ©èœãåºã䜿ãããã®ã§ã¯ãªãããšæãã®ã§ãããã©ã«ãã§æã£ãŠãããšãããããããŸããã
Intel Windowsã³ã³ãã€ã©ã¯128ãããæŽæ°ã«å¯ŸããŠäœãããŸããïŒ
å®å šã«ã¯ããããŸããã ICCãå¶çŽãåããããšæãABIã®åœ±é¿ããããã©ããã¯ããããŸããã çæãããã¢ã»ã³ããªã«ã€ããŠäœ¿çšã§ããã¢ã€ãã¢ãç¥ãããã ãã®å Žåã¯ãããã䟿å©ãªãªãœãŒã¹ã§ãïŒ https ïŒ
ãžã£ã³ãã¢ãããæ©èœãåºã䜿ãããã®ã§ã¯ãªãããšæãã®ã§ãããã©ã«ãã§æã£ãŠãããšãããããããŸããã
ããããèšå®å¯èœãªã¹ããªãŒã ãæå³ããŸããïŒ ããã¯è¯ãç¹ã§ãããéã«ã«ããã§ããªãã®ã§ã¯ãªãããšæããŸãã ããã©ã«ãã®éžæãå®éã«éåžžã«éèŠã§ããå Žåããããããããã®ããå®å
šãªæ©èœãåããPRNGã®ãããããéžæãããšã人ã
ã¯ãããã®ãé«åºŠãªãæ©èœãå¿
èŠã§ããããšãææžåããã«ãã©ã€ãã©ãªã³ãŒãã§ãããã®æ©èœãããåºç¯å²ã«äœ¿çšããŸãã ãæšæºãã§ãå©çšããã ããŸãã ããããå¥ã®ãŠãŒã¶ãŒãé床ããã®ä»ã®çç±ã§æ©èœã®å°ãªãBitGenerator
ã§ãã®ã©ã€ãã©ãªã䜿çšããããšãããšãã¬ã³ã¬ã®å£ã«ã¶ã€ãããŸãã No default
ãŸãã¯MT19937
äžçã§ã¯ãå³æžé€šã¯å¿
èŠãªé«åºŠãªæ©èœã«ã€ããŠèããææžåããå¯èœæ§ãé«ããªããŸãã
äžæ¹ã§ããã®äžæž¬ã®äºæ
ã«ãããèšå®å¯èœãªã¹ããªãŒã ã®ãªãBitGenerator
ããŸãæãŸãããªãããã«èŠããŸããç§ã¯ããã®æ¹åã§ãã¹ããã©ã¯ãã£ã¹ãšèŠãªããããã®ãé²ãããšããæŠå¿µã奜ãã§ãïŒçŽç²ã«å人çã«;ç§ã¯æããŸããïŒ NumPy-the-projectã«ãã®æŠå¿µãå
±æããã矩åïŒã ã³ãŒãã®éäžã§.seed()
ã䜿çšããŠãã人ã«èŠããããããã€ãã®æªçšãåé¿ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã ããããç¹°ãè¿ãã«ãªããŸãããããã©ã«ãããããšäººã
ã®è¡åã倧å¹
ã«å€ãããšããèãã«åºã¥ããŠããããããããã®æžå¿µã¯ãã¹ãŠããªã軜æžãããå¯èœæ§ããããŸãã
Windowsäžã®MT1993ãšæ¯èŒããŠãPCG64ã¯MSVCã§ã³ã³ãã€ã«ãããã®ãã©ããããé ãã§ããïŒ
@bashtageãïŒ13163ã«æçš¿ãããã³ãããŒã¯ã§ã¯ãPCG64ã¯MT19937ã®ã»ãŒååã®é床ã§ãããMSVCããã®ä»²éã®ããã©ãŒãã³ã¹ã«ã¯ããªãæåŸ å€ãã§ãã Linuxã§ã¯23ïŒ é«éã§ãã
Intel Windowsã³ã³ãã€ã©ã¯128ãããæŽæ°ã«å¯ŸããŠäœãããŸããïŒ
ClangãGCCãIntelã³ã³ãã€ã©ãªã©ã®ä»ã®ã³ã³ãã€ã©ã¯ã32ãããã·ã¹ãã ã§64ãããæŽæ°ãå®è£ ããã®ãšåãæ¹æ³ã§64ãããã·ã¹ãã ã«128ãããæŽæ°ãå®è£ ããŸãã æ°ããã¢ã€ãã¢ãå¿ èŠãšããªããã¹ãŠåããã¯ããã¯ã Microsoftã¯MSVCã«å¯ŸããŠãããããããè¡ããªãã£ãã®ã§ãã³ã³ãã€ã©ã«ãã£ãŠçŽæ¥ãµããŒãããã128ãããæŽæ°ã¯ãããŸããã
ãã®çµæãMSVCã®å ŽåãïŒ13163ã®PCG64ã®æ¢åã®å®è£ ã¯ãx86_64ã®_umul128ãªã©ã®Microsoftçµã¿èŸŒã¿é¢æ°ãåŒã³åºãããšã«ããã128ãããã®èšç®ãæåã§å®è£ ããŸãïŒããããã代ããã«_mulx_u64ãªã©ã®åçã§ããããŒã¿ãã«ãªIntelçµã¿èŸŒã¿é¢æ°ã䜿çšããããšãã§ããŸãïŒãããã«ãããGCCãClangãããã³Intelã³ã³ãã€ã©ãåç¬ã§è¡ãããšãã³ãŒãã£ã³ã°ããŸãã æ倧ã®åé¡ã¯ãMicrosoftã®ã³ã³ãã€ã©ããããã®çµã¿èŸŒã¿é¢æ°ãååã«æé©åããŠããªãå¯èœæ§ããããŸãïŒå°ãªããšãã€ã³ã©ã€ã³åãããŠããããšãé¡ã£ãŠããŸããïŒïŒã æäœæ¥ã§ã³ãŒãã£ã³ã°ãããã¢ã»ã³ãã©ã®æ¹ãé«éã«ãªãå¯èœæ§ã¯ãããŸãããé©åãªä¿®æ£ã¯ãã³ã³ãã€ã©ãããã»ã©æªéçã«è²§åŒ±ã§ã¯ãªãããšã§ãã
ãžã£ã³ãã¢ãããæ©èœãåºã䜿ãããã®ã§ã¯ãªãããšæãã®ã§ãããã©ã«ãã§æã£ãŠãããšãããããããŸããã
ãžã£ã³ãããŠããã£ãã®ã§ããããªãåºã䜿ãããã®ãæ°ã«ãªããŸãã ïŒå人çã«ã¯ã2ã€ã®PRNGãã©ãã ãé¢ããŠãããã瀺ãdistance
æ¬åœã«å¥œãã§ããããã¯PCGã®C ++ããŒãžã§ã³ã«ãããŸãããCããŒãžã§ã³ã«ã¯ãããŸãããè¿œå ããã®ã¯ç°¡åã§ããèå³ãïŒ
ãžã£ã³ãããŠããã£ãã®ã§ããããªãåºã䜿ãããã®ãæ°ã«ãªããŸãã
ããããçŸåšã®çšèªã«æ £ããŠããªãã ã€ãŸããã·ãã¥ã¬ãŒã·ã§ã³ã䞊è¡ããŠå®è¡ããããã«äœ¿çšã§ãããç°¡åã«ååŸã§ããç¬ç«ããã¹ããªãŒã ã§ãã 䞊ååã§ããã·ãã¥ã¬ãŒã·ã§ã³ã®åé¡ã®æ°ã¯ããããŸããããå€ãã®åé¡ããããæè¿ã®ãããã«æèŒãããã³ã¢ã®æ°ãèãããšãé床ã®äžå©ãç°¡åã«è£ãããšãã§ãããšæããŸãã
Microsoftã¯MSVCã«å¯ŸããŠãããããããè¡ããªãã£ãã®ã§ãã³ã³ãã€ã©ã«ãã£ãŠçŽæ¥ãµããŒãããã128ãããæŽæ°ã¯ãããŸããã
ãã®ãããç§ãã¡ã®è»èŒªãå·ã€ããã§ããããOTOHãWindowsã®å€ãã®äººã ã¯AnacondaãŸãã¯Enthoughtããããã±ãŒãžãå ¥æããŸããã©ã¡ããIntelã䜿çšããããã©ãŒãã³ã¹ãæ¬åœã«æ°ã«ãã人ã ã¯ããããLinuxãMacããŸãã¯ããããAIXã§ãã
ç·šéïŒãããŠãããããã€ã¯ããœãããæžå¿µããŠãããªãã圌ãã¯åé¡ã解決ããããã®å ±å¥šéãæäŸããããšãã§ããŸãã
FWIWããããéèŠãªé¢æ°ã®ããã«clang
ãçæããã¢ã»ã³ããªã§ããããã«ã¯ã uint128_t
ãuint64_t
ã®æ§é äœã«ã¢ã³ããã¯/åããã¯ããããã«å¿
èŠãªããããå«ãŸããŸããhttpsïŒ// godbolt.org/z/Gtp3os
ãšãŠããã£ãããã@ rkernã åãããšãããŠãMSVCãææžãã®128ãããã³ãŒãã§äœãããŠããã®ãã確èªã§ããå¯èœæ§ã¯ãããŸããïŒ
ãšãŠããã£ãããã@ rkernã åãããšãããŠãMSVCãææžãã®128ãããã³ãŒãã§äœãããŠããã®ãã確èªã§ããå¯èœæ§ã¯ãããŸããïŒ
ããã¯ããããšããããã§ã¯ãããŸããã ãhttpsïŒ//godbolt.org/z/a5L5Gzã
ãã£ãšã -O3
ãè¿œå ããã®ãå¿ããŸããããããã§ãéãã§ãïŒ https ïŒ
ããã»ã©æªãã¯ãããŸããã æé©åããªã³ã«ãªã£ãŠããªããããäœãã€ã³ã©ã€ã³åãããŸããã§ããã /Ox
ãè¿œå ããŸããïŒãã£ãšè¯ããªãã·ã§ã³ããããããããŸãããïŒïŒã ãŸããMSVCã¯Cå転ã€ãã£ãªã ãèŠã€ããããšãã§ããªããããçµã¿èŸŒã¿ã®å転çµã¿èŸŒã¿é¢æ°ïŒ _rotr64
ïŒã䜿çšããããã«ã³ãŒããä¿®æ£ããŸããã
ããã§ãäžçš®ã®åè»äºæ ã§ãã ããããå°ã泚æãæãã°ãPCG64ã³ãŒãã埮調æŽããŠãMSVCã§ã³ã³ãã€ã«ãã誰ã«ãšã£ãŠããŸã£ããæ¥ãããããªããã®ã«ããããšãã§ãããšèšã£ãŠãéèšã§ã¯ãããŸããã
ä»ã®ãã¹ãŠãããŒãžã§ããããã«ããããã«ãä»ã®ãšãããããã©ã«ããªãããéžæããŠã¿ãŸãããïŒ ããã«ãããäºææ§ãæãªãããšãªããåŸã§ïŒ1ã€ä»¥äžã®ãªãªãŒã¹ã®åŸã§ãïŒããã©ã«ããèªç±ã«æ±ºå®ã§ããŸãã
ã»ãšãã©ã®ãŠãŒã¶ãŒã¯ä¹±æ°ã®å°é家ã§ã¯ãªããããããã©ã«ããæäŸããå¿ èŠããããŸãã
ãä»ã圌ãã¯ããå€ãã®ã³ãŒããå ¥åããå¿ èŠãããããšããç¡äœæ³ãè¶ ããŠãäœããå€æŽãããšã©ããªããŸããïŒ BitGeneratorãããŒãã³ãŒãã£ã³ã°ãããŠããå ŽåïŒããã©ã«ããæäŸããªãã£ãããïŒãæŽç·ŽãããŠããªããã¹ãŠã®ãŠãŒã¶ãŒã¯ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠããããããŸãããã°åœŒãã®éžæã®ãã¥ã¢ã³ã¹ãç解ããå¿ èŠããããŸãïŒç§ãã¡ã¯èªåãã¡ã®éã§äœã«åæããããšããã§ããªãããšã«æ³šæããŠãã ããæé«ã§ãïŒã ãã ããããã©ã«ããæäŸãããšãæ°ããããã©ã«ããŸãã¯æ°ããããŒãžã§ã³ã¯ãããã¹ããªãŒã ãšäºææ§ããªãããããã¹ããäžæãããå¯èœæ§ããããŸãã
ãããã¹ããªãŒã ãåžžã«äžå®ã§ãããšããä»®å®ãšã NumPyéçºè ãäœãããŠããã®ããç¥ã£ãŠãããšããä»®å®ãšãããã©ã«ãå€ãæé«ã®ãã©ã³ãã§ããå¿ èŠããããšããä»®å®ãšã®éã§ãããšãããããã£ããšããŠããç§ã¯2çªç®ã®ä»®å®ã®åŽã§èª€ããç¯ããŸãæåãå£ããŸãã
ç·šéïŒã©ã®éçºè ã圌ããäœãããŠããããç¥ã£ãŠããã¹ãããæ確ã«ãã
ã»ãšãã©ã®ãŠãŒã¶ãŒã¯ä¹±æ°ã®å°é家ã§ã¯ãªããããããã©ã«ããæäŸããå¿ èŠããããŸãã
ãããšãå°ãªããšããããã©ã«ãããããã©ãããããã©ã«ããäœã§ãããã«é¢ä¿ãªããæšå¥šäºé ãææžåããããšã¯ç¢ºãã§ãã
ãä»ã圌ãã¯ããå€ãã®ã³ãŒããå ¥åããå¿ èŠãããããšããç¡äœæ³ãè¶ ããŠãäœããå€æŽãããšã©ããªããŸããïŒ
ã©ããªãäœãããèããŠããŸããïŒ ç§ã¯ããªãã®è°è«ã«åŸãããšãã§ããŸããã
ãä»ã圌ãã¯ããå€ãã®ã³ãŒããå ¥åããå¿ èŠãããããšããç¡äœæ³ãè¶ ããŠãäœããå€æŽãããšã©ããªããŸããïŒ
ã©ããªãäœãããèããŠããŸããïŒ ç§ã¯ããªãã®è°è«ã«åŸãããšãã§ããŸããã
@mattipã¯ãããã©ã«ãã®ããããžã§ãã¬ãŒã¿ã®å€æŽãæããŸãã
ãã®woudlã¯ããããæ¡çšãããŠãŒã¶ãŒãæãããcoudlã¯ã³ãŒãã®å€æŽãå¿ èŠãšããŸãã
ããšãã°ã
g = Generator()
g.bit_generator.seed(1234)
åºã«ãªãããããžã§ãã¬ãŒã¿ãå€æŽãããå Žåãããã¯ééã£ãŠããŸãã
ããªãããã£ãšæ£æ°ãªããšãããŠäœ¿ã£ããªã
Generator(BitGenerator(1234))
ãã®åŸãããªãã¯ãããèŠãªãã§ãããã
IMOãããã©ã«ãã®éžæãæ€èšãããšãã¯ãåºç€ãšãªãããããžã§ãã¬ãŒã¿ãŒã«èŽåœçãªæ¬ é¥ãèŠã€ããããIntelããã®ãããã«QUANTUM_NIãè¿œå ãããŸã§ä¿®æ£ããããšèããå¿ èŠããããŸããããã«ãããã©ã³ãã ãªããã©ãŒãã³ã¹ãOOMæ¹åãããŸãã
ç§ã¯ããã§ã¯å°ãéšå€è
ã ãšæããŸãããã©ã®PRNGãããã©ã«ãã®éžæã§ããããæ°žä¹
ã«ä¿®æ£ãããå€æŽãããªãããšãæåŸ
ããã®ã¯åççã§ã¯ãªããšæããŸãã ïŒããšãã°ãC ++ã§ã¯ã std::default_random_engine
ã¯å®è£
ã®è£éã§ããããªãªãŒã¹ããšã«å€æŽã§ããŸããïŒ
ãããã以åã®çµæãåçŸããã¡ã«ããºã ãå¿ èŠã§ãã ãããã£ãŠãç¹å®ã®å®è£ ãååšãããšããããå€æŽããããšã¯éåžžã«ã¯ãŒã«ã§ã¯ãããŸããïŒããšãã°ãMT19937 _is_ MT19937ãç°ãªãåºåãäžããããã«èª¿æŽããããšã¯ã§ããŸããïŒã [ãããŠããã§ã«ååšããå®è£ ãåé€ããã®ãã¯ãŒã«ã§ã¯ãããŸããã]
ããã©ã«ããå€æŽãããå Žåãå€ãçµæãåçŸãç¶ããã人ã¯ã以åã®ããã©ã«ããååã§å°ããå¿ èŠããããŸãã ïŒä»¥åã®ãªãªãŒã¹ã«å¯Ÿå¿ããããã©ã«ããéžæããã¡ã«ããºã ãæäŸããããšã§ããããè¡ãããšãã§ããŸããïŒ
ãšã¯èšããã®ã®ãããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒãå¥ã®ãã®ã«äº€æããããšãèš±å¯ãããŠããå Žåã§ããããã¯æ¬åœã«å³å¯ã«æ¹åããå¿
èŠããããŸããããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒã«ååšããæ©èœã¯ãã¹ãŠãå°æ¥ãã®æ©èœããµããŒããããšããã³ãããã¡ã³ããè¡šããŠããŸãã ããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒã«å¹ççãªadvance
ãããå ŽåãåŸã§ãããå®éã«åãé€ãããšã¯ã§ããŸããã ïŒãã®åé¡ãåé¿ããããã«ãããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒã®é«åºŠãªæ©èœãç¡å¹ã«ããå¯èœæ§ããããŸããïŒ
èŠçŽãããšãããã©ã«ããæ°žä¹ ã«å€æŽãããªãå¥çŽã«èªåèªèº«ãåºå®ããããšããã«ã䜿çšãåçŸå¯èœãªçµæãââããããããšãã§ããããšã確èªããæ¹æ³ããããŸãã ããã¯ãŸãããªããããéžæã®ããã®è³ãéãæžããã§ãããã
ïŒFWIWã¯ãããã¯ç§ãPCGã«äœããããã§ãããããã©ã«ãã®PCG 32ãããã®PRNGãçŸåšã®ããã«ã¢ã¯ã»ã¹XSH-RRã®å€çš®ã§ãã[ pcg_setseq_64_xsh_rr_32_random_r
Cã©ã€ãã©ãªãšã§pcg_engines::setseq_xsh_rr_64_32
Cã§ã¯ã©ã¹++ã©ã€ãã©ãª]ã§ãããååãšããŠãå°æ¥ãèŠæ®ããåçŸæ§ãæ¬åœã«å¿
èŠãªå Žåã¯ããšã€ãªã¢ã¹ã§ããpcg32_random_r
ãŸãã¯pcg32
ã䜿çšããã®ã§ã¯ãªããXSH-RRãæ瀺çã«æå®ããå¿
èŠããããŸããååãšããŠä»ã®ãã®ã«ã¢ããã°ã¬ãŒãã§ããŸãã ãïŒ
ããã¯æ¬åœã«æ°žé ã§ã¯ãããŸããïŒãã®ãããžã§ã¯ãå šäœã®90ïŒ ã¯ãçŽ14幎åã«è¡ãããæ¬ç©ã®ãæ¬ç©ã®ããããŠåèªããæ°žé ã®çŽæã«ãã£ãŠæšé²ãããŠããŸãïŒããããªããèšãããã«ãåãæ¿ãã«ã¯ïŒaïŒå€æŽãã説åŸåã®ããçç±ãšïŒbïŒæžäŸ¡ååŽãµã€ã¯ã«ãäžããããã«å°ãªããšãæ°å¹ŽããããŸãã
ä»æ¥ã¯ãããã§ããã ãæ£ããããããã«äžçæžåœåªåããæ¹ãã¯ããã«è¯ãã§ãã
ãã¡ãããçŠæ¢ãããŠããªãããšã®1ã€ã¯ããªãªãŒã¹åŸã«åãå€ãçæããlognãšããŠPRNGã³ãŒããæ¹åããããšã§ãã ããšãã°ãuint128ã䜿çšããPRNGã䜿çšããå ŽåãMSã«uint128ãµããŒããè¿œå ãââãããïŒãã¡ãããã£ã³ã¹ïŒãå°æ¥ã®ããŒãžã§ã³ã§Win64ã®ã¢ã»ã³ããªãè¿œå ããããšãã§ããŸãã
ããšãã°ã
g = Generator() g.bit_generator.seed(1234)
åºã«ãªãããããžã§ãã¬ãŒã¿ãå€æŽãããå Žåãããã¯ééã£ãŠããŸãã
ããã§ãã@ eric-wieserã䜿çšããŠããããã©ã«ããªãããªãã·ã§ã³ã«ã€ããŠè°è«ããŠããããã§ããããã¯ãæåã®ã¹ããŒãã¡ã³ããã»ãšãã©ã®ãŠãŒã¶ãŒã¯ä¹±æ°ã®å°é家ã§ã¯ãªãã®ã§ãããã©ã«ããæäŸããå¿ èŠããããŸãã ãã
ããã©ã«ããªããšãã¬ã³ããªãŒã®éã§ãå®å šã«ããã©ã«ããæ³å®ããŠãç§ã¯åžžã«åŸè ãéžæããŸãïŒ
ä»ïŒ
Generator() # OK
Generator(DefaultBitGenerator(seed)) # OK
Generator(seed) # error
_my_èšå®ïŒ
Generator(1234) == Generator(DefaultBitGenerator(1234)
Generator(*args**kwargs) == Generator(DefaultBitGenerator(*args, **kwargs))
ä»ã§ã¯ãããããŸããããšã¯æããŸããããRandomStateã®äœ¿çšã延é·ãã1ã€ã®æ¹æ³ã¯ãããããžã§ãã¬ãŒã¿ãŒãéžæããã®ã«ååãªå°é家ã§ãããšæãããŠãŒã¶ãŒã®ã¿ããããå©çšã§ããããã«ããããšã ãšæããŸãã
èŠçŽãããšãããã©ã«ããæ°žä¹ ã«å€æŽãããªãå¥çŽã«èªåèªèº«ãåºå®ããããšããã«ã䜿çšãåçŸå¯èœãªçµæãââããããããšãã§ããããšã確èªããæ¹æ³ããããŸãã ããã¯ãŸãããªããããéžæã®ããã®è³ãéãæžããã§ãããã
ã¯ãããããŸãã ãŠãŒã¶ãŒã¯ååã§BitGenerator
ãååŸãïŒããšãã°ã MT19937
ã PCG64
ãªã©ïŒãã·ãŒãã䜿çšããŠã€ã³ã¹ã¿ã³ã¹åã§ããŸãã BitGenerator
ãªããžã§ã¯ãã¯ãåäžãª[0..1)
float64
ãšæŽæ°ïŒããã³ããããæã€æ¥œãããžã£ã³ãã¢ããã/ã¹ããªãŒã æ©èœïŒãæç»ããããã®éãããã¡ãœããã»ããã䜿çšããŠãã³ã¢ã®åäžPRNGã¢ã«ãŽãªãºã ãå®è£
ããŸãã ã ç§ãã¡ã話ããŠããGenerator
ã¯ã©ã¹ã¯ãæäŸãããBitGenerator
ãªããžã§ã¯ããåãåãããããã©ããããŠããã¹ãŠã®äžåäžååžãã¬ãŠã¹ååžãã¬ã³ããäºé
åŒãªã©ãæäŸããŸãã BitGenerator
ã®å³å¯ãªã¹ããªãŒã äºææ§ä¿èšŒã ç§ãã¡ã¯ïŒãªãªãŒã¹ããããã«ïŒäœãåãé€ãããšã¯ãªããããããå€æŽããããšããããŸããã
ããã©ã«ãã«é¢ããäžå¿çãªè³ªåã¯ããåŒæ°ã®ãªãã³ãŒãg = Generator()
ã¯äœãããã®ãïŒãã§ãã çŸåšãPRã§ã¯ãä»»æã®ç¶æ
ã§Xoshiro256
BitGenerator
ãäœæããŸãïŒã€ãŸãã /dev/urandom
ãããªåªãããšã³ããããŒãœãŒã¹ããæœåºãããŸãïŒã ãããã©ã«ããªãããªãã·ã§ã³ã¯ãããããšã©ãŒã«ããããšã§ãã ãŠãŒã¶ãŒã¯ãå¿
èŠãªBitGenerator
ã«æ瀺çã«ååãä»ããå¿
èŠããããŸãã @ eric-wieserã®ãã€ã³ãã¯ããããã©ã«ããªããã¯ãæåã®ãªãªãŒã¹ã§ã¯ã«ããŽãªå¥ã«_safe_ãªãã·ã§ã³ã§ãããšããããšã§ãã ããã©ã«ããæäŸããæ°ãããªãªãŒã¹ã§ã¯ãæ¢åã®ããã©ã«ããå€æŽããã®ãšåãããã«åé¡ãçºçããããšã¯ãããŸããã
@rkern ãã·ãŒããå©çšå¯èœãªãšã³ããããŒããèªåçæãããåŒæ°ãªãã®å Žåã®ã¿ãæ°ã«
å¯Ÿç §çã«ã @ bashtageã¯ãã·ãŒããæäŸãããŠããããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒãæ°ã«ããŠããããã§ãã
@rkern ãã·ãŒããå©çšå¯èœãªãšã³ããããŒããèªåçæããã_åŒæ°ãªã_ã®å Žåã®ã¿ãæ°ã«ããå Žåã¯ãåºç€ãšãªããžã§ãã¬ãŒã¿ãŒãäœã§ãããã¯å®éã«ã¯ããã»ã©éèŠã§ã¯ãããŸãããçµæã¯åçŸã§ããªãããã1æéããšã«å€æŽãããå¯èœæ§ããããŸãïŒå®è¡ãç°ãªãã°ãã·ãŒããç°ãªããŸãïŒã
äœæåŸã BitGenerator
ãåã·ãŒãã§ããŸãã ãããã£ãŠã Generator()
æ©èœããå Žåãã·ãŒããããPRNGãå¿
èŠãªäººã¯ã @ bashtageã®äŸã®ããã«ã次ã®è¡ã«ã·ãŒãããã ãã§ãããšç§ã¯å®å
šã«äºæ³ããŠããŸãã
g = Generator()
g.bit_generator.seed(seed)
ããã¯ããé¢åã§ãããã®ãããã¿ã€ãã³ã°ã«é¢ããŠã¯ã»ãŒåãããã䟿å©ãªã®ã§ããšã«ããã»ãšãã©ã®äººãéåžžGenerator(PCG64(<seed>))
éžã¶ã ãããšç§ãæåã«ææ¡ããçç±ã§ãã ãã ãã @ bashtageã¯ãè¿œå ã®æ±ºå®ãè¡ãããšã«çŽé¢ãããšãã«ãããçšåºŠã®æµæãæ£ããèšé²ããŸãã
ã§ããããç§ãã¡ã®åã«ã¯ãã£ãšåºã質åããããšæããŸããããŠãŒã¶ãŒã«ãããã®1ã€ãã€ã³ã¹ã¿ã³ã¹åããŠã»ãããã¹ãŠã®æ¹æ³ã¯äœã§ããïŒãŸãããããã®æ¹æ³ã«ããã©ã«ãèšå®ãããå Žåããããã®ããã©ã«ãã¯ã©ãããã¹ãã§ããïŒã ããã€ãã®ãªãŒãã³ãã¶ã€ã³ã¹ããŒã¹ãããã @ bashtageã«ããGenerator(<seed>)
ãŸãã¯Generator(DefaultBitGenerator(<seed>))
ã®ææ¡ã¯ãŸã å¯èœã§ãã
@bashtageããã¥ã¡ã³ãã¯ã©ã®ããã圹ç«ã€ãšæããŸããïŒ ã€ãŸããäžçªäžã§ã PCG64
ãæšå¥šãããããã©ã«ãã®BitGenerator
ãã§ããããã¹ãŠã®äŸã§äžè²«ããŠGenerator(PCG64(seed))
ã䜿çšããå ŽåïŒä»ã®ã¢ã«ãŽãªãºã ãå
·äœçã«ç€ºããŠããªãå ŽåïŒïŒ
Generator(<seed>)
ãŸãã¯g=Generator();g.seed(<seed>)
è¶
ããGenerator(<seed>)
default_generator(<seed>)
_ function_ããããšç¢ºä¿¡ããŠãããããããŸããã 次ã«ãæ¬åœã«å€æŽããå¿
èŠããããäœããå£ããããªãå Žåã¯ãæ°ããé¢æ°ãè¿œå ããŠãå€ãé¢æ°ã«èŠåãè¿œå ããã ãã§æžã¿ãŸãã æåã®ãªãªãŒã¹ã§ã¯experimental
ãšããŒã¯ããããšããå§ãããŸããããã«ããã確åºããã³ãããã¡ã³ããè¡ãåã«ããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãå®éã«ç£èŠããæéãäžããããŸãã
å
éšç¶æ
ã®è©³çŽ°ãå
¬éããªãDefaultBitGenerator
ãªããžã§ã¯ããå®éã«äœæããã®
Generator
åŒæ°ãšããŠæŽæ°ã·ãŒããçŽæ¥ãµããŒãããæ¹ãã¯ããã«äœ¿ãããããšãã@bashtageã«åæããŸãïŒäŸïŒ np.random.Generator(1234)
ã ãã¡ãããããã¯DefaultBitGenerator
ãŸãã
Generator
ããã¥ã¡ã³ãã§ã¯ãNumPyã®éå»ã®åããŒãžã§ã³ã§ã®ããã©ã«ãã®ããããžã§ãã¬ãŒã¿ãŒã®å®å
šãªå±¥æŽãæäŸã§ããŸãã ããã¯åºæ¬çã«@imnemeã®ææ¡ã§ãããåçŸæ§ã®ç®çã«ã¯ååã ãšæããŸãã
ïŒä»¥åã®ã³ã¡ã³ãã«å¯Ÿãããã®ç·šéãèŠãã°ããã§ãïŒ
ãã£ãšã
-O3
ãè¿œå ããã®ãå¿ããŸããããããã§ãéãã§ãïŒ https ïŒ
MSVCã®å Žåã -O3
ã§ã¯ãªãã /O2
ãŸãã¯/Ox
ïŒãã ãã /O3
ã¯ãããŸããïŒïŒã
Generator
ããã¥ã¡ã³ãã§ã¯ãNumPyã®éå»ã®åããŒãžã§ã³ã§ã®ããã©ã«ãã®ããããžã§ãã¬ãŒã¿ãŒã®å®å šãªå±¥æŽãæäŸã§ããŸãã ããã¯åºæ¬çã«@imnemeã®ææ¡ã§ãããåçŸæ§ã®ç®çã«ã¯ååã ãšæããŸãã
å®éã«ã¯ããã¯ã«ã¹ã®protocol
åŒæ°ã®ãããªæ瀺çãªversion
åŒæ°ãGenerator
/ DefaultBitGenerator
ã«å«ããæ¹ãããã«è¯ãã§ãããã 次ã«ã np.random.Generator(123, version=1)
ãããªãã®ãèšè¿°ããŠããããŒãžã§ã³1ãã®ä¹±æ°ïŒãããäœã§ããïŒãå¿
èŠã§ããããšã瀺ãã np.random.Generator(123, version=np.random.HIGHEST_VERSION)
ïŒããã©ã«ãã®åäœïŒãææ°/æ倧ã®ããããžã§ãã¬ãŒã¿ãŒãå¿
èŠã§ããããšã瀺ããŸãã ïŒãããäœã§ããïŒã
ããããversion=0
ã¯NumPyããããŸã§äœ¿çšããŠããMT19937
ã§ããã version=1
ã¯ç§ãã¡ãéžãã æ°ããããã©ã«ãã§ããå¯èœæ§ããããŸãã
å éšç¶æ ã®è©³çŽ°ãå ¬éããªãDefaultBitGeneratorãªããžã§ã¯ããå®éã«äœæããã®ã¯ã©ãã§ããïŒ ããã¯ãä»ã®ããããžã§ãã¬ãŒã¿ãªããžã§ã¯ãã®1ã€ã®ãããã·ã«ãªããŸãããååãšããŠãçæãããæ°å€ã®ç¹å®ã®ã·ãŒã±ã³ã¹ãé€ããŠããããã®ãããããã©ããããããšãã§ããŸãã ããã«ããããŠãŒã¶ãŒãããã©ã«ãã®BitGeneratorã§äœãã§ãããã«ã€ããŠããã°ã©ã ã§æšæž¬ããããšãæããšã©ãŸãããªãããæ¹åãããã¢ã«ãŽãªãºã ã䜿çšã§ããããã«ãªãããšãé¡ã£ãŠããŸãã
ããŒãã ããã¯é åçã§ãã ç©äºãè€éã«ããããŠããã®ãŽãŒãã£ã¢ã³ãããã«å¥ã®ã«ãŒããè¿œå ããŠããããã«æããŸãïŒãããŠããã£ãšã¢ã¬ã¯ãµã³ããŒé¢šã®ã¹ãããŒã¯ãå©çšã§ããã¯ãã§ãïŒããããã«ã€ããŠç§ãèšããªããã°ãªããªãå¯äžã®æªãããšã§ãã ããã«ãããæ®ãã®æ±ºå®ã容æã«ãªããŸããçµ±èšçãªå質ãšããã©ãŒãã³ã¹ã«éäžã§ããŸãã
å®éã«ã¯ã
Generator
/DefaultBitGenerator
ãpickle
ãããªæ瀺çãªversion
åŒæ°ãå«ããæ¹ãããã§ãããã
ç§ã¯ããã®ãã¡ã³ã§ã¯ãããŸããã pickle
å Žåãšã¯ç°ãªãããããã«ã¯äœ¿çšã§ããæå³ã®ããååããããã¡ã«ããºã ã¯ãã§ã«å®è£
ãããŠããŸãã
ç§ã¯ããã®ãã¡ã³ã§ã¯ãããŸããã
pickle
å Žåãšã¯ç°ãªãããããã«ã¯äœ¿çšã§ããæå³ã®ããååããããã¡ã«ããºã ã¯ãã§ã«å®è£ ãããŠããŸãã
å žåçãªNumPyãŠãŒã¶ãŒã®èŠ³ç¹ãã次ã®ããšãèæ ®ããŠãã ããã
np.random.Generator(seed, version=0)
vs np.random.Generator(seed, version=1)
np.random.Generator(MT19937(seed))
vs np.random.Generator(PCG64(seed))
ã»ãšãã©ã®ãŠãŒã¶ãŒã¯ãRNGã¢ã«ãŽãªãºã ã®çžå¯Ÿçãªã¡ãªããã«ã€ããŠã»ãšãã©ç¥ããªããšèããã®ãå®å
šã ãšæããŸãã ãã ããããã¥ã¡ã³ããèªãŸãªããŠããã»ãšãã©ã®å Žåã version=0
version=1
ïŒæ°ããããã©ã«ãïŒã®æ¹ãversion=0
ãããåªããŠããã¯ãã ãšå®å
šã«æšæž¬ã§ããŸãã ã»ãšãã©ã®ãŠãŒã¶ãŒã«ãšã£ãŠãããã¯æ¬åœã«åœŒããç¥ãå¿
èŠããããã¹ãŠã§ãã
察ç
§çã«ã MT19937
ãPCG64
ãããªååã¯ãå®éã«ã¯å°é家ããŸãã¯ãã§ã«ããã¥ã¡ã³ããèªãã 人ã«ãšã£ãŠã®ã¿æå³ããããŸã:)ã
ããªãã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ã誰ã圌ãã_æãã§ããversion
ãéžæããŠããŸããã æ¢ç¥ã®ããŒãžã§ã³ã®çµæãè€è£œããããã«_å¿
èŠãª_ version
ã®ã¿ãéžæããŸãã 圌ãã¯åžžã«ãè€è£œãããçµæã§äœ¿çšãããç¹å®ã®å€ãæ¢ããŠããŸãïŒæé»çã«èš±å¯ãããããæé»çã«ïŒã è€æ°ã®å€ã®éã®é¢ä¿ã«ã€ããŠæšè«ããå¿
èŠã¯ãããŸããã
ãããŠããããã«ããããã®ã¬ãã«ã®ã¯ãã¹ãªãªãŒã¹ã®åçŸæ§ã¯ã NEP19ã§ç§ãã¡ãæŸæ£ãããã®ã§ãã ãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ããŒãžã§ã³ç®¡çã«å察ããè°è«ã¯ãããã§ãåæ§ã«åœãŠã¯ãŸããŸãã
ããã©ã«ãã«é¢ããããã€ãã®èãïŒ
dSFMT
ã¯ã MT19937
ãããåçŽã«é«éãªããŒãžã§ã³ã®ããã§ãïŒããã¥ã¡ã³ãã§ãSSE2ããã©ãã ãé«éã«åé€ãããã説æãããšããã§ãããïŒã ãšã«ãããããã¹ããªãŒã ã®åçŸæ§ãä¿èšŒãããã®ã§ã¯ãªãã®ã§ãå
éšç¶æ
ã®éãã¯ããŸãé¢çœããªããããã§ã®åå©ã®è°è«ããèšäºã®ã¬ãã¥ãŒäžã®ç掻ã楜ã«ãããã§ãã£ãŠãã dSFTM
ã¯MT19937
ãåªå
ãããã¹ãã§ããç³ãèš³ãããŸããããWindowsã§ã¯32ããããåŒãç¶ãéèŠã§ããhttpsïŒ //github.com/pypa/manylinux/issues/118#issuecomment-481404761ãåç §ããŠ
ããŒã¿åæã§ã®ãªãµã³ããªã³ã°ææ³ã®äœ¿çšæ¡å€§ã«åããŠå€§ããªè»¢ææãè¿ããŠãããããçµ±èšçç¹æ§ã«ã¯åå泚æããå¿ èŠããããšæããŸãã Pythonããã®åé¡ã«é¢ããŠå°ãããããªè©å€ãåŸãå Žåãããšããããããã©ã«ãã§ãã£ããšããŠããããã¯ããŒã¿åæã®ããã«Pythonãæ€èšããŠãã人ã ã«ããåã蟌ã¿ã®éå£ã«ãªãå¯èœæ§ããããŸãã é åãšã·ãã¥ã¬ãŒã·ã§ã³ãçå£ã«åãæ¢ããŠãã人ã ã«ãšã£ãŠPythonãæé©ãªããã±ãŒãžã§ãããšããããç§ã¯éåžžã«å¬ããæããŸãã
ããé«éãªæå 端ã§ã¯ãªãã¢ã«ãŽãªãºã ãæäŸããããšã¯åé¡ãªããšæããŸãããããã©ã«ãã§ã¯ãªãããããåé¿ããŠäžäœäºææ§ãç¶æã§ããç¯å²ã§æäŸããŸãã
ããã€ãã®ãã©ã¬ã³ãžãã¯ãšãã£ã¹ã«ãã·ã§ã³ã«ã€ããŠã¯ã https ïŒ ãã ããã
æç§æžã«ã¯ãé倧ãªãšã©ãŒãçºçãããããšãªããPRNGãçã®IIDU [0,1ïŒå€æ°ã«çœ®ãæããããšãã§ãããšæé»çãŸãã¯æ瀺çã«æ³å®ããæ¹æ³ãèšèŒãããŠããŸã[20ã7ã2ã16ã15]ã ããã§ã¯ãMATLABãPythonã®ã©ã³ãã ã¢ãžã¥ãŒã«ãRãSPSSãStataãªã©ãäžè¬çã«äœ¿çšãããå€ãã®çµ±èšããã±ãŒãžã®ã¢ã«ãŽãªãºã ã§ã¯ããã®ä»®å®ãæ£ãããªãããšã瀺ããŸãã
@ kellieotto ã @ pbstark-é åãšããŒãã¹ãã©ããã®å¯èœãªéãæè¯ã®åºç€ãäžããããã«ãããã§ã©ã®PRNGãéžæãã¹ããã«ã€ããŠæèŠããããŸããïŒ
ããŒã¿åæã§ã®ãªãµã³ããªã³ã°ææ³ã®äœ¿çšæ¡å€§ã«åããŠå€§ããªè»¢ææãè¿ããŠãããããçµ±èšçç¹æ§ã«ã€ããŠã¯å€ãã®æ³šæãæãå¿ èŠããããšæããŸãã
åæããŸããã ãããã®ããããã£ãå®éã®ãŠãŒã¹ã±ãŒã¹ã«é¢é£ããŠããéããããã¯éåžžã«éèŠã§ãã éåžžæèµ·ãããæžå¿µã¯åžžã«éåžžã«åŠè¡çã§ãã
ããã€ãã®ãã©ã¬ã³ãžãã¯ãšãã£ã¹ã«ãã·ã§ã³ã«ã€ããŠã¯ã https ïŒ ãã ããã
éåžžã«èå³æ·±ãèšäºã RãPython stdlibïŒcoãšã¯ç°ãªããNumPyã¯ãããæ£ããè¡ãå¯äžã®ã©ã€ãã©ãªïŒ9ããŒãžã®äžéšïŒã§ãããšçµè«ä»ããŠããŸãã
è«æãããããã«å
·äœçãªäŸãå
¥æããããšã¯éåžžã«æçšã§ãã çŸåšã®ããã©ã«ããžã§ãã¬ãŒã¿ãŒãããæç¹ã§æ
éããå Žåãããã¯ãã€ã§ããïŒ Rã®sample
é¢æ°ã®ãããªäŸã§ã¯ãçŽ17åã®ãµã³ãã«ãæç»ãããšãã«ã40ïŒ
ã®å¶æ°ãš60ïŒ
ã®å¥æ°ãçæããŸãã ããã§ã®ããŒãã¹ãã©ãã/ãªãµã³ããªã³ã°ã®åçç©ã¯äœã§ããïŒ
RïŒ3.6ïŒã®ææ°ãªãªãŒã¹ã§ã¯ãåãæšãŠãšã©ã³ãã ãããã®ã¢ãããŒããä¿®æ£ãããŠããŸãã
ã©ã³ãã ãªæŽæ°ãçæããŸãã ã¡ã«ã»ã³ããã€ã¹ã¿ãŒã¯ããã©ã«ãã®ãŸãŸã§ã
ãã ããPRNGã
@Kellieãªãããã[email protected]ãšç§ã¯ããã©ã«ãã®PRNGã§æããŸã
ç§åŠèšèªãšçµ±èšããã±ãŒãžã¯æå·åããå¿
èŠããããŸã
å®å
šïŒCS-PRNGãäŸïŒã«ãŠã³ã¿ãŒã¢ãŒãã®SHA256ïŒããã©ãŒã«ãããªãã·ã§ã³ä»ã
ããéããå質ã®äœããã®ã«æ»ãïŒäŸãã¡ã«ã»ã³ããã€ã¹ã¿ãŒïŒ
é床ãå¿
èŠãªå Žåã
Pythonçšã®CS-PRNGã«åãçµãã§ããŸããïŒ
https://github.com/statlab/cryptorandom
ããã©ãŒãã³ã¹ã¯ïŒãŸã ïŒçŽ æŽããããã®ã§ã¯ãããŸããã ããã«ããã¯ã¯åå€æã®ããã§ã
Pythonå
ã§ããã€ããªæååïŒããã·ã¥åºåïŒãæŽæ°ãšããŠãã£ã¹ãããŸãã ç§ãã¡ã¯
ããå€ãã®äœæ¥ãCã«ç§»ãå®è£
ã«åãââçµãã§ããŸãã
也æ¯ã
ãã£ãªãã
2019幎5æ27æ¥æææ¥åå6æ27åã©ã«ããŽããŒãº[email protected]
æžããŸããïŒ
ç§ãã¡ã¯çµ±èšçæ§è³ªã«å€ãã®æ³šæãæãã¹ãã ãšæããŸãã
ãªãµã³ããªã³ã°ææ³ã®ããå€ãã®äœ¿çšãžã®å€§ããªã·ããã®éçšã§
ããŒã¿è§£æåæããŸããã ãããã®ããããã£ãå®éã®äœ¿çšã«é¢é£ããŠããéã
å Žåãããã¯éåžžã«éèŠã§ãã éåžžæèµ·ãããæžå¿µã¯
åžžã«éåžžã«åŠè¡çã§ããããã€ãã®ãã©ã¬ã³ãžãã¯ãšãã£ã¹ã«ãã·ã§ã³ã«ã€ããŠã¯ã以äžãåç §ããŠãã ããã
https://arxiv.org/pdf/1810.10985.pdféåžžã«èå³æ·±ãèšäºã NumPyã¯çŽå¯äžã®ãã®ã§ãããšçµè«ä»ããŠããŸã
RãPython stdlibïŒcoãšã¯ç°ãªãããããæ£ããè¡ãã©ã€ãã©ãªïŒ9ããŒãžã®äžéšïŒãããå ·äœçãªäŸãååŸããããšã¯éåžžã«åœ¹ç«ã¡ãŸã
è«æã çŸåšã®ããã©ã«ããžã§ãã¬ãŒã¿ãŒãããæç¹ã§æ éããå Žåã
ããã¯ãã€ã§ããïŒ Rã®ãµã³ãã«é¢æ°ã®ãããªäŸã¯40ïŒ ãçæããŸã
çŽ17åã®ãµã³ãã«ãæç»ããå Žåãæ°å€ãš60ïŒ ã®å¥æ°ã äœã§ãã
ããã§åçã®ããŒãã¹ãã©ãã/ãªãµã³ããªã³ã°ïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWJEIA4CTLLHVGZVKBLPXPOUFA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWJW445QDPGZDGXMPA3PXPOUFANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
ããã©ãŒãã³ã¹ã¯ããŠãŒã¶ãŒããŒã¹ã®ããªãã®éšåã«ãšã£ãŠéèŠã§ãã ãžã§ãã¬ãŒã¿ã®çµ±èšçç¹æ§ã¯ãããäžéšã®ãŠãŒã¶ãŒã«ã®ã¿éèŠã§ãã å«ãŸããŠãããã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã¯ãéåžžã®ãŠãŒã¹ã±ãŒã¹ã§ã¯åé¡ãããŸããã ãããã£ãŠãããã©ã«ããšããŠæéã®ãã®ãéžæããããã®+1
ãŸãããæéããéžæããæ¹æ³ã¯ãããŸããã @bashtageã¯ãïŒ13163ã®çŸåšã®ã³ãŒãã§
ãŸããé床ãæ°ã«ãããŠãŒã¶ãŒã®ãããªãã®å²åããã©ãã ã倧ããã®ã ãããã Pythonèªäœã¯ãå¹³åããŠCããââãçŽ50åé ããªããŸãã NumPyãŠãŒã¶ãŒããŒã¹ã®ã©ã®éšåãPyPyã§å®è¡ããŠããŸããïŒ4åã®é床ããŒã¹ããåŸãããŸãïŒïŒ 確ãã«ããã€ããããŸãããããã»ã©å€ãã¯ãªããšæããŸãã
ãããŠãäžèšã§æŠèª¬ãããã¹ãŠã®å€åæ§ãèãããšãé床ãæ°ã«ãããã®ãéèŠãªéšåãã«ã€ããŠãããã©ã«ãã®PRNGãã¢ããªã±ãŒã·ã§ã³ã§æãéãå®è¡ããããšããããªãã®èšèã誰ãåãå ¥ããã®ã§ããããã è³¢æãªããšïŒãããéåžžã«æ¥œãããã»ãšãã©ã®ãŠãŒã¶ãŒã®æã®å±ãç¯å²ã«ãããŸãïŒã¯ãå©çšå¯èœãªããŸããŸãªPRNGã®ãã³ãããŒã¯ãè¡ããã©ããæãéããã確èªããããšã§ãã
å¯Ÿç §çã«ã圌ãã¯ããã¥ã¡ã³ãã«æããããèŠã€ãããããããŸããããããªããææããããã«ãç¹å®ã®PRNGã®çµ±èšçå質ãç解ããããšã¯ãã»ãšãã©ã®ãŠãŒã¶ãŒã®ã¬ãŒããŒã§ã¯ãããŸããïŒãããŠå°é家ã«ãšã£ãŠããææŠçã§ãïŒã ã»ãšãã©ã®äººã¯ããã€/æ°ã«ãããã¹ããã©ããããç¥ããŸããã ããã¯ç¶æ§äž»çŸ©ã®å Žã§ãããšç§ã¯äž»åŒµããŸããã»ãšãã©ã®ãŠãŒã¶ãŒãäœããæ°ã«ããªããšããäºå®ã¯ãã¡ã³ããããããæ°ã«ããªããšããæå³ã§ã¯ãããŸããã
å«ãŸããŠãããã¹ãŠã®PRNGãã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã§åé¡ãªãããšã¯äºå®ã§ãããããã¯ããªãäœãåºæºã§ãã Unixã·ã¹ãã ã«ã¯ãçµ±èšçã«ã²ã©ãCã©ã€ãã©ãªPRNGãå€æ°ä»å±ããŠããŸãããäžçããã®è»žããå€ããããšãªããäœå¹Žã«ãããã£ãŠåºã䜿çšãããŠããŸããã
çµ±èšçããããã£ä»¥å€ã«ãããŠãŒã¶ãŒãèªåã§æ¬²ãããšã¯æããªããããããªãããç§ã欲ãããšæããããããªãããããã£ããããŸãã å人çã«ã¯ãPRNGã®ãããã€ããŒãšããŠãäºçŽ°ãªäºæž¬å¯èœæ§ãé¿ããããšæã£ãŠããŸãã誰ããPRNGããã®ããã€ãã®åºåãèŠãŠãå°æ¥ã®ãã¹ãŠã®åºåãã©ããªãããèšãããšãã§ããããã«ããããããŸããã NumPyã䜿çšãããã»ãšãã©ã®ã³ã³ããã¹ãã§ã¯ãäºæž¬å¯èœæ§ã¯åé¡ã§ã¯ãããŸãããã·ãŒã±ã³ã¹ãç°¡åã«äºæž¬ã§ããããšã§æ©æµãåããæµã¯ååšããŸããã ãããã誰ããNumPyã®PRNGã䜿çšããã®ã¯ãçµ±èšãè¡ãããã«NumPyãå¿ èŠãªããã§ã¯ãªãã以åã«PRNGãèŠã€ããå Žæã ããã§ãã ãã®ã³ãŒãã¯ãPRNGãäºæž¬ã§ããããšã§æ©æµãåããå®éã®æµã«çŽé¢ããå¯èœæ§ããããŸãã ãã®ç°åžžå€ã®ç¶æ³ã«å¯ŸããŠãã£ãããšä¿éºããããããã«å€é¡ã®æ¯æãïŒããšãã°ãé床ã®å€§å¹ ãªäœäžïŒãããããšã¯äŸ¡å€ããããŸããããé©åºŠãªä¿éºã¯ããã ãã®äŸ¡å€ããããããããŸããã
ããã€ãã®ãã©ã¬ã³ãžãã¯ãšãã£ã¹ã«ãã·ã§ã³ã«ã€ããŠã¯ã https ïŒ ãã ããã
æç§æžã«ã¯ãé倧ãªãšã©ãŒãçºçãããããšãªããPRNGãçã®IIDU [0,1ïŒå€æ°ã«çœ®ãæããããšãã§ãããšæé»çãŸãã¯æ瀺çã«æ³å®ããæ¹æ³ãèšèŒãããŠããŸã[20ã7ã2ã16ã15]ã ããã§ã¯ãMATLABãPythonã®ã©ã³ãã ã¢ãžã¥ãŒã«ãRãSPSSãStataãªã©ãäžè¬çã«äœ¿çšãããå€ãã®çµ±èšããã±ãŒãžã®ã¢ã«ãŽãªãºã ã§ã¯ããã®ä»®å®ãæ£ãããªãããšã瀺ããŸãã
FWIWããã€ã¢ã¹ã®ãªãç¯å²ã®æ°å€ãå¹ççã«çæããããšã«ã€ããŠã®@lemireã«ããçŽ æŽãããè«æããããŸãã ç§ã¯ããããèªåã®èšäºã§ãããã€ãã®ãã³ãããŒã¯ã調æ»ããŠå®è¡ããããã®åºçºç¹ãšããŠäœ¿çšããŸããã ïŒ64ããããçæããå ŽåãLemireã®æ¹æ³ã§ã¯128ãããã®ä¹ç®ã䜿çšããŠã64ãããã®é ãé€ç®ãåé¿ããŸããMSVCãŠãŒã¶ãŒã«çºçããå¯èœæ§ã®ããããç¥ãããåé¡ã¯ãã¹ãŠãããŸããïŒ
@pbstark @kellieotto arXivã«æ²èŒããããšããèå³ãæã£ãŠããªãã®è«æãèªã¿ãŸããã ç§ã¯BIDSã®äœäººãã®å人ã蚪ããŠããŸããããããŠåœŒãã¯ããªãã®ä»äºã«ã€ããŠèšåããŸããã ãã£ã¹ã«ãã·ã§ã³ã»ã¯ã·ã§ã³ã§ã¯ãMT19937ã®ããããŸã§ã®ãšãããOïŒ10 ^ 5ïŒã¬ããªã±ãŒã·ã§ã³ã§æ€åºãããã®ã«ååãªå€§ããã®äžè²«ãããã€ã¢ã¹ãæã€çµ±èšã¯èŠã€ãããŸããã§ããããšè¿°ã¹ãŠããŸãã ããèŠã€ããŸãããïŒ PCG64ã®ãããª128ãããç¶æ ã®PRNGã®å ·äœçãªäŸãèŠã€ããŸãããïŒ ããã¯ãå°ãªããšãæ±çšã®ããã©ã«ããéžæããç®çã§ããã®èæ ®äºé ãä»ã®èæ ®äºé ïŒIMOïŒãäžåãå§ããå¯èœæ§ããããå®çšçãªé¢é£æ§ã®åŠ¥åœãªãããå€ã§ããããã«æãããŸãã
æ°ããPRNGãã¬ãŒã ã¯ãŒã¯ïŒ13163ã®åªããæ©èœã¯ããã©ã°ã€ã³ããã ãã§èª°ã§ãç¬èªã®BitGenerator
ãæäŸã§ããããšã§ããNumpyã§äœ¿çšããããã«Numpyã§ããå¿
èŠã¯ãããŸãããã³ãŒãã cryptorandom
ãCã§BitGenerator
ãšããŠå®è£
ããããšãæ€èšããããšããå§ãããŸããããããã°ãä»ã®ãªãã·ã§ã³ãšçŽæ¥æ¯èŒã§ããŸãã
å人çã«ã¯ãã¹ããŒããæ¬åœã«æ°ã«ãã人ã¯ãå¿
èŠã«å¿ããŠããã«äžæ©åé²ããããšãæåŸ
ããŠããŸãïŒããã§ã¯ããã»ã©å€ãã¯ãããŸããïŒã å®å
šãªããã©ã«ããæäŸããå¿
èŠããããŸããçŸåšã®ç§ã®æšæž¬ã§ã¯ãããã¯æå·åãé€ããã¹ãŠã®ç®çã§å®å
šãªããã©ã«ããæå³ããŸãïŒããããããã¥ã¡ã³ãã«èŠåãããã¯ãã§ãïŒã å€ãã®ãŠãŒã¶ãŒã¯é床ãæ°ã«ãããŠããŸãããççŽã«èšã£ãŠãç§ãé床ãé«ãããããããšãèºèºããŠããã®ã¯ãã®ããã§ãã
NumpyãããŸããã£ããã®èšäºã¯é¢çœããã§ããïŒãããããããæ£ããããããã«Robertã«è³èŸãéããŸãïŒïŒãå®éã«ã¯ããããžã§ãã¬ãŒã¿ã§ã¯ãªããµã³ãã©ãŒã§ãã
@pbstark numpy / randomgenãšäºææ§ã®ããBitGeneratorãšããŠãããå®è£ ããããšæããããããŸãããïŒ ããã¯ãããããäž¡æ¹ã®ãããã¹ããŒãã¢ããããããå€ãã®æçšãªåœ¢æ ã§å¹ åºãèŠèŽè ãå©çšã§ããããã«ããæãç°¡åãªæ¹æ³ããããŸãã ããªããšã±ãªãŒã»ãªããããã¯ããŒã¯ã¬ãŒã«ããããã§ãã®ã§ããããå®çŸããããã«ãã°ããäŒãããšãã§ããŸããïŒ ïŒãã ã®ç³ãåºã§ãããæåã«èªåã§ã³ãŒãã詳ãã調ã¹ãå¿ èŠããããŸãïŒã
ãã®_RandomSamplingïŒPractice Makes Imperfect_çŽã«é¢ããŠã¯ãè¯ãèªã¿ç©ã§ããã1å åã®ã³ã¢ã1ããç§ããã1ã€ã®æ°å€ã100幎éçæããå Žåãçæãããæ°å€ã¯2 ^ 102æªæºã«ãªãããšãèŠããŠãã䟡å€ããããŸãã
ç°¡åã«äºæž¬ã§ããPRNGïŒã¡ã«ã»ã³ããã€ã¹ã¿ãŒã®ãããªå€§ããªç¶æ 空éãæã€ãã®ã§ãïŒã®å Žåãç¹å®ã®åºåã·ãŒã±ã³ã¹ãçæã§ãããã©ãããå®éã«ç¥ãããšãã§ããŸãïŒååšããå Žåã¯ãããçæããã·ãŒããèŠã€ããååšããªãå Žåã¯ç©æ¬²ãããã«æããŸãïŒ ïŒããä»ã®èªæã§ã¯ãªãäºæž¬å¯èœãªPRNGã®å Žåãã©ã®åºåã·ãŒã±ã³ã¹ãçæãããªãããã©ã®åºåã·ãŒã±ã³ã¹ãååšããããïŒç°¡åã«ïŒç¥ãããšã¯ã§ããŸããããååã«ãŸãã§ãããããæ€çŽ¢ã®æéäžã«ããããèŠã€ããããšã¯ã»ãšãã©ãããŸããã ïŒãåç¥ãããããŸãããã2 ^ 80ã®åºåå ã«_TwelthNight_ãå«ãzipãã¡ã€ã«ãåãåºãããšãããã£ãŠããPRNGããããŸããã幞éãç¥ããŸããïŒ
æ¬åœã«cryptoprngãå¿
èŠãªå Žåã¯ãææ°ã®ããŒããŠã§ã¢ã§ã®å¯äžã®éžæè¢ã¯
å°çšã®åœä»€ããããããAESã @lemireã«ã¯å®è£
ããããŸã
ããhttps://github.com/lemire/testingRNG/blob/master/source/aesctr.hãã®
noncryptoãžã§ãã¬ãŒã¿ãŒãšåããããé«éã§ãã è¡ãããšãã§ããChaCha20ããããŸã
SIMDã§é«éã ãã ããã©ã¡ããå€ãããŒããŠã§ã¢ã§ã¯éåžžã«é
ããªããŸãã ThreeFryãš
Philoxã¯ãã§ã«å«ãŸããŠãããcryptoliteã«ãŠã³ã¿ãŒprngã§ãã
IMOæå·ã¯ãè²»çšäŸ¿çã®ç¹ã§é倧è©äŸ¡ãããŠããŸãã ç§ã¯äœãç¥ããªã
å±±ã®PRNGåé¡ã«ããéèŠãªæ€å
10e6ã®åºçãããè«æã®é åºã§äœ¿çšãããŸãã ç§ãèŠãå¯äžã®ã¢ããªã±ãŒã·ã§ã³
PRNGãæ¬åœã«åé¡ã ã£ãã®ã¯ãæéãããã ã£ãå Žåã§ãã
çºé»æ©ãå
šãµã€ã¯ã«ãå®äºããããšã¯å°ããã ããã§ãå¯äž
å¹æã¯ãäž»ãªãã®ãè€è£œããç 究ã®ãµã³ãã«ãµã€ãºãæžããããšã§ãã
çµæã¯ãããé·ãæéã®ã·ã¹ãã ã§åå®è¡ãããŸãã
æã2019幎5æ27æ¥ã«ã¯ãååŸ07æ50åãããŒãã»ã«ãŒã³ã®[email protected]ã¯æžããŸããïŒ
@pbstark https://github.com/pbstark @kellieotto
https://github.com/kellieottoèå³ãæã£ãŠããªãã®è«æãèªã¿ãŸãã
arXivã«çŸããŸããã ç§ã¯BIDSã§äœäººãã®å人ã蚪ããŠããŸããããããŠåœŒãã¯æã£ãŠããŸãã
ããªãã®ä»äºã«èšåããŸããã ãã£ã¹ã«ãã·ã§ã³ã»ã¯ã·ã§ã³ã§ã¯ãããããŸã§ã®ãšããã
ã§æ€åºãããã®ã«ååãªå€§ããã®äžè²«ãããã€ã¢ã¹ãæã€çµ±èšãèŠã€ããŸãã
MT19937ã®OïŒ10 ^ 5ïŒè€è£œãããã1ã€èŠã€ããŸãããïŒ
PCG64ã®ãããª128ãããç¶æ ã®PRNGã®å ·äœäŸã¯ïŒ ããã¯ç§ã«ã¯æããŸã
ãã®èæ ®äºé ãå®çšçãªé¢é£æ§ã®åççãªãããå€ã§ãã
å°ãªããšãéžæããç®çã§ãä»ã®äººïŒIMOïŒãäžåãå§ããå¯èœæ§ããããŸã
æ±çšã®ããã©ã«ããæ°ããPRNGãã¬ãŒã ã¯ãŒã¯ïŒ13163ã®åªããæ©èœ
https://github.com/numpy/numpy/pull/13163ã¯ã誰ã§ãã§ãããšããããšã§ã
ãã©ã°ã€ã³ããã ãã®ç¬èªã®BitGeneratorãæäŸããŸãã
人ã ãnumpyã³ãŒãã§ããã䜿çšããã«ã¯ãnumpyã§ããå¿ èŠããããŸãã ç§ã¯...ããã ãã
Cã§ã®BitGeneratorãšããŠã®cryptorandomã®å®è£ ãæ€èšããããšããå§ãããŸã
ãã®ãããä»ã®ãªãã·ã§ã³ãšçŽæ¥æ¯èŒããããšãã§ããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRO5PKW4MRFSBGUFUNTPXQUOLA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABKTSRMRIHC4OYDR52HLTHDPXQUOLANCNFSM4HPX3CHA
ã
ãŸããé床ãæ°ã«ãããŠãŒã¶ãŒã®ãããªãã®å²åããã©ãã ã倧ããã®ã ãããã Pythonèªäœã®å¹³åã¯CãããçŽ50åé ãã§ããNumPyãŠãŒã¶ãŒããŒã¹ã®ã©ã®éšåãPyPyã§Pythonãå®è¡ããŠããŸããïŒ4åã®é床åäžãåŸãããŸãïŒïŒ 確ãã«ããã€ããããŸãããããã»ã©å€ãã¯ãªããšæããŸãã
ããªãã¯éåžžã®ãŠãŒã¶ãŒã§ã¯ãªããšæããŸãïŒïŒNumPyã¯ã»ãšãã©Cã§ãããCã§èªåã®ããšãããã®ãšåããããé«éã§ãïŒãŸããã»ãšãã©ã®å Žåé«éã§ãïŒã ãŸããPyPyã¯ç§åŠçãªã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ãã補åã§ã¯ãªãããããã®å Žåãäœéã§ãïŒNumPyã䜿çšããCPython APIã®äœ¿çšã«å¶éãããŠãããããJITã®ã¡ãªããã享åã§ããŸããïŒã
ãããã«ãããããã¯ãããã¯ããå€ããŠããŸãã ãã®é床ã®åé¡ã䞻匵ããããšã¯ç©è°ãéžããã®ã§ã¯ãããŸããã
@imnemeæçæŽæ°ã«ã¯lemiresã¡ãœããã䜿çšããŠããŸãã ãã以æ¥
ã¬ã¬ã·ãŒãæžäŸ¡ååŽã®ãªãæ°ããªã¹ã¿ãŒã
è¯ãã¢ã«ãŽãªãºã ã
æã2019幎5æ27æ¥ã«ã¯ã19æ46 imneme [email protected]ã¯æžããŸããïŒ
ããã€ãã®ãã©ã¬ã³ãžãã¯ãšãã£ã¹ã«ãã·ã§ã³ã«ã€ããŠã¯ã以äžãåç §ããŠãã ããã
https://arxiv.org/pdf/1810.10985.pdfæç§æžã¯ãPRNGãã§ããããšãæé»çãŸãã¯æ瀺çã«æ³å®ããæ¹æ³ãæäŸããŸã
ææãå°å ¥ããã«çã®IIDU [0,1ïŒå€æ°ã®ä»£ããã«äœ¿çšãã
ãšã©ãŒ[20ã7ã2ã16ã15]ã ããã§ã¯ããã®ä»®å®ã
MATLABãå«ãå€ãã®äžè¬çã«äœ¿çšãããçµ±èšããã±ãŒãžã®ã¢ã«ãŽãªãºã
Pythonã®ã©ã³ãã ã¢ãžã¥ãŒã«ãRãSPSSãããã³StataãFWIWã@ lemireã«ããçŽ æµãªè«æhttps://arxiv.org/abs/1805.10941ããããŸã
ç¯å²å ã®æ°å€ãå¹ççã«çæããããã®https://github.com/lemire
ãã€ã¢ã¹ãªãã ç§ã¯ãããããã€ããæ¢çŽ¢ããŠå®è¡ããããã®åºçºç¹ãšããŠäœ¿çšããŸãã
ç§èªèº«ã®èšäºã®ãã³ãããŒã¯ã
http://www.pcg-random.org/posts/bounded-rands.html ã ïŒçæããå Žå
64ããããLemireã®æ¹æ³ã§ã¯ãäœéãåé¿ããããã«128ãããã®ä¹ç®ã䜿çšããŸã
64ãããé€ç®ãMSVCã§çºçããå¯èœæ§ã®ãããã¹ãŠã®ããç¥ãããåé¡
ãŠãŒã¶ãŒãïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKNAQAK4WIXG5SVLO3PXQUA3A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABKTSRKV3KYKRLNMBKNU4JLPXQUA3ANCNFSM4HPX3CHA
ã
_safe_ããã©ã«ããæäŸããå¿ èŠããããŸããçŸåšã®ç§ã®æšæž¬ã§ã¯ãããã¯æå·åãé€ããã¹ãŠã®ç®çã§å®å šãªããã©ã«ããæå³ãããšããããšã§ãã
ããã«ã€ããŠè°è«ããã®ã¯é£ããã§ãã ç§ã®è³ªåã¯-äœãå®å šã§ããïŒ ããŸããŸãªããããã£ãæã€ããŸããŸãªçšåºŠã®æºã©ã³ãã æ§ããããŸãã ãããŸã§ã®ãšãããå ·äœçãªäŸãæããŠãã人ã¯èª°ãããŸãããããã§ã¯ãä»ã®åé¡ãPRãã¹ã¬ããã®ãããã§ããããŸããã æœè±¡çãªçµ±èšçç¹æ§ã«ã€ããŠè©±ãã ãã§ã¯åœ¹ã«ç«ã¡ãŸããã
ç§ã®æèŠã§ã¯ãPCG64ãé©åãªããã©ã«ãã«ãªãã§ãããã Windowsã§ã®é床ã®äžå©ãªç¹ã¯ãAnacondaetãã䜿çšããŠãã人ã ã«ã¯æããã§ã¯ãããŸããã alããããã³ããæç¹ã§ä¿®æ£ãããå¯èœæ§ããããŸãã 䞊åå®è¡ã¯Pythonã®æ°ããæ©èœã§ãããããèšå®å¯èœãªã¹ããªãŒã ãæã€ããšãæãŸããããããã£ã ãšæããŸãã
Visual Studioã§ã®PCG64ã®é床ããã«ãã£ã¯ãäžæã§ããªããã®ã§ããããšã«éåžžã«æççã§ãã
ããã¯ã©ããã§æ³šææ·±ãè©äŸ¡ãããŸãããïŒ
ãã®é床ã®åé¡ã䞻匵ããããšã¯ç©è°ãéžããã®ã§ã¯ãããŸããã
ç§ã®è³ªåã¯-äœãå®å šã§ããïŒ
ããžãã¯ãäžè²«ããŠé©çšããŸãïŒãäœãéãããïŒ ã©ã®numpyããã°ã©ã ãå®éã«BitGenerator
ã®ããã©ãŒãã³ã¹ãé倧ãªããã«ããã¯ãšããŠæã£ãŠããã®ããç§ã«ã¯ããããããŸããã 2åã®é床ã®BitGenerator
ã䜿çšããå Žåãå®å
šãªèšç®ã§5ïŒ
ã®é床åäžãåŸãããŸããïŒ ããããããã§ããªãã§ãããã Python-not-being-as-fast-as-Cã¯åé¡ã§ã¯ãããŸããã å®éã«åœ¹ç«ã€PRNGãå€çšããããã°ã©ã ã§ããã BitGenerator
èšå€§ãªæéãè²»ãããªããšããã ãã§ãã ãããããå©çšå¯èœãªéžæè¢ã®ããããã§ååã§ãã
Visual Studioã§ã®PCG64ã®é床ããã«ãã£ã¯ãäžæã§ããªããã®ã§ããããšã«éåžžã«æççã§ãã
ã¢ããã¹ã¬ããclang
PCG64ãã¢ã»ã³ããªã«ã³ã³ãã€ã«ããŠ64ãããMSVCãçãããšãã§ããæ¹æ³ã瀺ããŸãããããã£ãŠã64ãããWindowsäžã®MSVCãå
æã§ããªãåé¡ã§ãããšã¯æããŸããã
ããªãããŒãªã®ã¯ã32ãããã·ã¹ãã äžã®PCG64ã§ããã32ãããWindowsã ãããŸã å®éã«éèŠã§ããå¯èœæ§ããããŸãã ãã®å Žåãããã¯32ãããISAã«å¶éããããšãããMSVCã«ã€ããŠã§ã¯ãããŸããã
@Kellie Ottoboni [email protected]ãšç§ãææããã®ã¯ã
é©åºŠãªãµã€ãºã®åé¡ã®å Žåã§ããMTã®ç¶æ
空éã¯å°ããããŠè¿äŒŒã§ããŸãã
åäžãªé åïŒn <2100ïŒãŸãã¯åäžãªã©ã³ãã ãµã³ãã«ïŒn = 4e8ãk = 1000ïŒã
ããã¯ãããŒãã¹ãã©ããããé åãã¹ããMCMCãŸã§ãã¹ãŠã«åœ±é¿ããŸãã
æå³ããååžãšå®éã®ååžã®éã
ååžã¯ä»»æã«å€§ããããããšãã§ããŸãïŒç·å€åè·é¢ãè¿ã¥ããŠããŸã
2ïŒã ããã¯å€§ãããŠæ·±å»ã§ãã
ã®ãçµ±èšãé¢æ°ã§MTãç Žãåªåã¯ããŠããŸããã
æ°å¹Žã ç§ã¯ãããç Žãäœç³»çãªæ¹æ³ããããšããªã確信ããŠããŸã
ïŒååžè·é¢ãéåžžã«å€§ããããïŒã
也æ¯ã
ãã£ãªãã
12æ26åPMãããŒãã»ã«ãŒã³ã®æã2019幎5æ27æ¥ã«ã¯[email protected]
æžããŸããïŒ
ãã®é床ã®åé¡ã䞻匵ããããšã¯ç©è°ãéžããã®ã§ã¯ãããŸããã
ç§ã®è³ªåã¯-äœãå®å šã§ããïŒ
ããžãã¯ãäžè²«ããŠé©çšããŸãïŒãäœãéãããïŒ ããèãããªã
ã©ã®numpyããã°ã©ã ãå®éã«BitGeneratorã®ããã©ãŒãã³ã¹ãæã£ãŠããã
é倧ãªããã«ããã¯ã 2åã®é床ã®BitGeneratorã䜿çšãããšã
å®å šãªèšç®ã§5ïŒ ã®ã¹ããŒãã¢ãããåŸãããŸããïŒ ããããããã§ããªãã§ãããã
Python-not-being-as-fast-as-Cã¯åé¡ã§ã¯ãããŸããã ããã ãã§ã
å®éã«åœ¹ç«ã€PRNGãå€çšããããã°ã©ã ã¯ã倧éã®è²»çšããããŸããã
BitGeneratorã§ã®æéã ããããå©çšå¯èœãªéžæè¢ã®ããããã
ååãâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWKSMPAG3GFUCUFRXCDPXQYVRA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOOR
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWIDCPAJJ6DJ3RO332LPXQYVRANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
@pbstarkç§ãèŠããã®ã¯ãMTãŸãã¯128ãããPRNGã倱æãã cryptorandom
ãæ©èœããåé¡ã®å
·äœçãªå®è£
ã§ãïŒäººçºçã§ããå¯èœæ§ããããŸãããããŸã工倫ãããŠããŸããïŒã ãªãµã³ããªã³ã°æ¹æ³ã128ãããPRNGã§èª€ã£ãæšè«ãè¡ãã cryptorandom
æ£ããæšè«ãè¡ãããŒã¿ã»ãããææã§ããŸããïŒ
PCG64ã«ç§»è¡ãããšãåé¡ã®ãµã€ãºã®äžéãæªåããŸãã
ãã®ç¶æ
空éã¯MTã®ãããããããã«å°ããããã§ãã ãã¡ãããããã¯å¯èœã§ã
ããã§ããã®ãµãã°ã«ãŒãããµã³ããªã³ã°ããå¯èœæ§ããããšããç¹ã§ããããè¯ããã©ã³ãã æ§ãçæããŸãã
MTãããåçã«çœ®æ矀ã ããããããã¯åã«æ
éããªããã°ãªããŸãã
500ã¯10ãéžæãã21ããåã«ïŒã
也æ¯ã
ãã£ãªãã
12:30ãããŒãã»ã«ãŒã³ã®æã2019幎5æ27æ¥ã«ã¯[email protected]
æžããŸããïŒ
VisualStudioã§ã®PCG64ã®é床ããã«ãã£ã«éåžžã«æççã§ã
æãåããªããã®ãã¢ããã¹ã¬ããclangãPCG64ãã¢ã»ã³ããªã«ã³ã³ãã€ã«ããŠçãããšãã§ããæ¹æ³ã瀺ããŸã
64ãããMSVCã®å Žåã64ãããWindowsã®MSVCã¯
ä¹ãè¶ããããªãåé¡ãããªãããŒãããããªãã®ã¯ã32ãããã·ã¹ãã äžã®PCG64ã§ããã®ãã¡32ãããã®ã¿ã§ãã
Windowsã¯ãŸã ç§ãã¡ã«ãšã£ãŠå®éçã«éèŠãããããŸããã ãã®å Žåã¯å°ãªãã§ã
32ãããISAã«å¶éãããããMSVCã«ã€ããŠã§ããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWJFCINQCYGFCI7ULI3PXQZGLA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWK6QTB65Z4TJU76XKTPXQZGLANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
ãããã«ãããPRNGã«ã€ããŠååã«ç解ããŠããªãã®ã§ãæåã«çµ±èšçç¹æ§ã«çŠç¹ãåœãŠãããšæããŸãïŒçãããã¹ãŠéåžžã«åªããŠããå Žåã¯ãåé¡ãããŸããïŒã ç§ãä»çåã«æãããšã®1ã€ã¯ãk次å ã®åçšåºŠååžã§ãã çŸåšãMTãšæ¯èŒããŠããã§ããŸãæ©èœããPCGãªã©ã®ããªã¢ã³ãã䜿çšããŠããŸããïŒ ïŒéç·åœ¢ãã€ããã¯ã¹ããæ¥ãã®ã§ãå°ãç·åŒµããŸãããPRNGã®æŠèŠãååã«ãªãã次ã®2æ¥ã§ç解ã§ããŸãã...
æå 端ã®ããã©ãŒãã³ã¹ãæ°ã«ããWindows32ããããŠãŒã¶ãŒããããããããšã¯æããŸããã 64ãããã«åãæ¿ããã®ã«ããã»ã©åŽåã¯ããããŸããã
ç§ãèŠããã§ãã
ç§ãã¡ã¯ãæ°åŠã«åºã¥ããŠãå€ãã®å€§ããªåé¡ãããã«éããªãããšãç¥ã£ãŠããŸãã
ãããããŸã äŸã瀺ãããšã¯ã§ããŸããã
äºé²ååã¯ãç§ãã¡ãç¥ã£ãŠããã®ã§ã
åé¡ããããããããé²ãæ¹æ³ïŒCS-PRNGïŒãç¥ã£ãŠããå Žåã¯ã
ããã¯ããã©ã«ãã§ããããŠãŒã¶ãŒãããããããšãéžæããå Žåã¯ããŠãŒã¶ãŒãæ
éã«ãªããªãããã«ããŸãã
12:39ãããŒãã»ã«ãŒã³ã®æã2019幎5æ27æ¥ã«ã¯[email protected]
æžããŸããïŒ
@pbstarkhttps ïŒ//github.com/pbstarkç§ãèŠããã®ã¯å ·äœçãªãã®ã§ã
åé¡ã®å®è£ ïŒäººçºçã§ããå¯èœæ§ããããŸãããããŸã工倫ãããŠããŸããïŒ
ã©ã®MTãŸãã¯128ãããPRNGã倱æããcryptorandomãæ©èœãããã ããªãã¯ã§ãã
ãªãµã³ããªã³ã°æ¹æ³ãééã£ãŠããããŒã¿ã»ãããææãã
128ãããPRNGã«ããæšè«ãšcryptorandomã«ããæ£ããæšè«ïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWODTUIPNMVOJB6QP3DPXQ2FPA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWITAGQFZDQSIFNEHETPXQ2FPANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
k-åçšåºŠååžå®çã¯ãå
šäœã«ãããPRNGåºåã®ã¢ã³ãµã³ãã«ããããã£ã§ãã
PRNGã®æéã ããã¯è¯ãããšã§ãããä»ã®ããšã«ã€ããŠã¯äœãèšããŸãã
åºåã®ã·ãªã¢ã«çžé¢ãªã©ãã©ã³ãã æ§ã®å€±æã®çš®é¡ã
ããã¯æ¯èŒçäœãããŒã§ãã
12:48ã»ãã¹ãã£ã³ã»ãã«ã¯ã§æã2019幎5æ27æ¥ã«ã¯[email protected]
æžããŸããïŒ
ç§ã¯PRNGã«ã€ããŠååã«ç¥ããªãã®ã§ããããã«ããå®éã«ééãéãããšãã§ããŸãã
æåã«çµ±èšçç¹æ§ã«çŠç¹ãåœãŠãïŒçããããã§ããå ŽåïŒ
ãããã¯ãã¹ãŠéåžžã«è¯ãã§ããçŽ æŽãããã§ãïŒã ç§ãä»çåã«æãããšã®1ã€ã¯
k次å ã®åçšåºŠååžã çŸåšãPCGãªã©ã®ããªã¢ã³ãã䜿çšããŠããŸãã
MTãšæ¯èŒããŠããã§ã¯ããŸããããŸããïŒ ïŒéç·åœ¢ãã€ããã¯ã¹ããæ¥ãŠããã
å°ãç·åŒµããŸãããPRNGã®æŠèŠãååã§ã¯ãªãã
次ã®2æ¥ã§ãããååŸããŸãã...â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWPOBTPYHC3XBINQYA3PXQ3HZA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWOEB7KR2YJZWHRRAHLPXQ3HZANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
@pbstark MTã¯ãPCGïŒããã³ä»ã®ãžã§ãã¬ãŒã¿ãŒïŒãåæ Œããããã€ãã®çµ±èšçæ€å®ã«å€±æããŸãã
@rkern
MSVCã§roråœä»€ãçæãããå Žåã¯ãã_ rotr64ãçµã¿èŸŒã¿é¢æ°ã䜿çšããå¿ èŠããããšæããŸãã
ãŸããæé©åã®ããã«ã/ O2ããã©ã°ã奜ããããããŸããã
ãããèŠããšãPCG64ã䜿çšãããå Žåã¯ãã¢ã»ã³ããªã§äœæããã®ãå®éã«æåãããããŸããã
@pbstarkã®å Žåãæªç¥ã®ã·ãŒãã§åæåãããPCG-64ããã®åºåã次ã«ç€ºããŸãïŒå®éãã¹ããªãŒã ã«ã€ããŠã説æããŸãã 0x559107ab8002ccda3b8daf9dbe4ed480
ïŒã
64bit: 0x21fdab3336e3627d 0x593e5ada8c20b97e 0x4c6dce7b21370ffc
0xe78feafb1a3e4536 0x35a7d7bed633b42f 0x70147a46c2a396a0
Coins: TTTHHTTTHHTHTTTTHTHHTTTTTHTTHHTTHHTHHTHHHHHHHHTTHHTTHHTHHHHHTHTHH
Rolls: 5 3 5 2 5 3 1 6 6 5 4 4 5 5 5 6 2 3 5 3 2 3 2 5 6 2 4 6 2 3 4 6 3
Cards: 5h 3h 3c 8d 9h 7s Kh Ah 5d Kc Tc 6h 7h 8s Ac 5c Ad Td 8c Qd 2h As
8h 2d 3s 5s 4d 6d 2s Jd 3d 4h Ks 6s Qc Js Th 9d 9c Ts Jh 4c 2c 9s
6c 4s 7c 7d Jc Qs Kd Qh
ããã§ãã©ã³ãã ã«éžæãããã·ãŒãã䜿çšããŠå¥ã®pcgãžã§ãã¬ãŒã¿ãŒãåæåãããšããŸãã è°è«ã®ããã«ã 0xb124fedbf31ce435ff0151f8a07496d3
éžã³ãŸãããã ãã®æ¢ç¥ã®åºåãæ€åºããåã«ãããã€ã®åºåãçæããå¿
èŠããããŸããïŒ äžã§äœ¿çšããã·ãŒããç¥ã£ãŠããã®ã§ãïŒPCGã®è·é¢é¢æ°ãä»ããŠïŒçŽ2.5Ã10 ^ 38ïŒãŸãã¯çŽ2 ^ 127.5ïŒã®åºåã«çããããšãã§ããŸãã åèãŸã§ã«ã10 ^ 38ããç§ã¯å®å®ã®å¹Žéœ¢ã®2300ååã§ãã
ãããã£ãŠãPCG-64ã«ã¯å®éã«ããã«ããã·ãŒã±ã³ã¹ããããŸãããå®éã«ã¯ãã©ããèŠãã°ããããæããªãéããå®éã«ã¯ãããèŠã€ããããšã¯ã§ããŸããã ïŒãããŠãã¹ããªãŒã ãå€æŽãããšãããã«å€ãã®å¯èœæ§ããããŸããïŒ
éåžžã®PCGã§ã¯ãã·ã§ã€ã¯ã¹ãã¢ãã¬ã€ãåºåããå¯èœæ§ã¯å®éã«ã¯ãŒãã§ãã PCGæ¡åŒµçæã¹ããŒã ã¯ãå®éã«ã¯ã·ã§ã€ã¯ã¹ãã¢ãã¬ã€ãåºåã§ããŸãããèæ¡ãããŠããªãã·ããªãªã§åºåãããå¯èœæ§ã¯éåžžã«å°ãããããæ¬è³ªçã«ãŒãã§ãã ç§ã®ç®ã«ã¯ãå®éçãªåœ±é¿ããŸã£ãããªãããããã£ã«ã¯ã»ãšãã©äŸ¡å€ããããŸããã
ïŒãŸããæå·çã«å®å šãªPRNGã¯ãk次å çã«çåé ãããããšãä¿èšŒãããŠãããããã¹ãŠã®å¯èœãªã·ãŒã±ã³ã¹ãçæã§ããPRNGãå¿ èŠãªäººã«ãšã£ãŠã¯ç¹å¹è¬ã§ããããŸãããPRNGããå¿ èŠãªãããæ°ãããå€ãã®ããããå¿ èŠãªç¬éã·ãŒãããŠãã®ç¶æ ãšããŠæ ŒçŽããå Žåãçæã§ããªããããã·ãŒã±ã³ã¹ãå¿ ç¶çã«ããã€ããããŸãïŒèšŒæïŒé³©ã®ç©Žã®åçã«ããïŒããŸããã·ãŒããšåãåºåéã«å¶éãããšãäœãã§ããã®ã§ãããããæ¬åœã«æ¢ããŠããã®ã¯ããã·ã¥é¢æ°ããŸãã¯ã·ãŒãå ¥åãPRNGã§ã¯ãªãæ¬åœã«ã©ã³ãã ã§ããå Žåã¯IDé¢æ°ã ãã§ããïŒ
奜å¥å¿ããã aesctr.h
ã䜿çšããŠAESã«ãŠã³ã¿ãŒããããžã§ãã¬ãŒã¿ãŒãã©ããããŸãããæéã¯ã©ã³ãã å€ãããã®nsåäœã§ãã
+---------------------+--------------+----------+--------------+
| | Xoshiro256 | PCG64 | AESCounter |
|---------------------+--------------+----------+--------------+
| 32-bit Unsigned Int | 3.40804 | 3.59984 | 5.2432 |
| Uniform | 3.71296 | 4.372 | 4.93744 |
| 64-bit Unsigned Int | 3.97516 | 4.55628 | 5.76628 |
| Exponential | 4.60288 | 5.63736 | 6.72288 |
| Normal | 8.10372 | 10.1101 | 12.1082 |
+---------------------+--------------+----------+--------------+
ããã§ããŸããã@ bashtageã
èŠããŠããã¹ãããã€ãã®ããšã¯ãç¹å®ã®AESåœä»€ã¯ã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªããã¢ã¯ãã£ãã«äœ¿çšããããã¹ãŠã®CPUã«ååšããããã§ã¯ãªããããïŒé ãïŒãã©ãŒã«ããã¯ãã¹ãå¿ èŠã§ãããšããããšã§ãã
ãŸããããã¯å°ããªã³ãŽãšãªã¬ã³ãžã®æ¯èŒã§ãã ç¹æ®ãªåœä»€ã䜿çšããããšã«å ããŠãAESã³ãŒãã¯ã«ãŒãå±éãããã®é床ã®ãã£ã³ã¯ãååŸããŠããŸãâå®éã«ã¯ãããã¯ã§æ°å€ãçæããŠããããããèªã¿åããŸãã å±éãããšãPRNGãé«éåãããå¯èœæ§ããããŸãã FWIWã @ lemireã«ã¯ãå®éã«ã¯AVXåœä»€ã䜿çšããŠè€æ°ã®åºåãäžåºŠã«çæ
å°ãªããšã1ã€ã®ã³ã³ã»ã³ãµã¹ãã€ã³ããèŠçŽã§ãããã©ãããèŠãŠã¿ãŸããããã©ã®BitGenerator
ã¢ã«ãŽãªãºã ã䜿çšãããã«ã€ããŠãnumpyãæèŠãè¿°ã¹ã1ã€ã®BitGenerator
ãä»ã®ã¢ã«ãŽãªãºã ããã宣äŒããå¿
èŠãããããšã«åæããŸãã
ãã®ã³ã³ã»ã³ãµã¹ã«äžèŽããä»ã®ãªãã·ã§ã³ã®ããã€ããæã€å¯èœæ§ã®ããåé¡ã®ããã€ããåé¿ãããããã©ã«ããªãããªãã·ã§ã³ãã¹ã±ããããããšããã1ã€çªãåºããŠãã ããã çœåŒåããªãå Žåã¯ãé»ããŸãã
ãããã©ã«ããªãããªãã·ã§ã³ãæ¬åœã«æå³ããã®ã¯ããå¿åã®ããã©ã«ããªããã§ããã ã·ãŒããããGenerator
ãååŸããæã䟿å©ãªæ¹æ³ããæå®ããPRNGã«ååãä»ããæ¹æ³ã«ãªãããã«ãAPIãèšèšããæ¹æ³ã¯ãŸã ãããŸãã ããšãã°ã BitGenerator
ã¢ã«ãŽãªãºã ã®å
šç¯å²ã_å«ãŸãªã_ãšããŸãããã numpyãããªãæå°éã«æããå®æ床ãscipy
ããã®ä»ã®ãµãŒãããŒãã£ã©ã€ãã©ãªã«ä»»ããããã«ããŠããŸããããã§ããããããšããå§ãããŸãã çŸåšã®ã¢ãŒããã¯ãã£ã®åªããŠããç¹ã¯ããããã®BitGenerator
ãä»ã®ã©ã€ãã©ãªã«ç§»åã§ããããšã§ãã ã€ãŸããåŸæ¥ã®RandomState
ãšã人ã
ã䜿çšããããšã奜ã1ã€ã®BitGenerator
ããµããŒãããããã«MT19937
ã®ã¿ãæäŸãããšããŸãã è°è«ã®ããã«ããããXoshiro256
ã ãšããŸãããã Generator.__init__()
ã³ã³ã¹ãã©ã¯ã¿ãŒã«BitGenerator
å¿
èŠã«ãªãããã«ããŸãããã ãããããŸããã®é¢æ°ãå®çŸ©ããŠã¿ãŸãããnp.random.xoshiro256_gen(seed)
æ»ã£ãŠããããšãGenerator(Xoshiro256(seed))
ã«ããŒã®äžã«ã ã·ãŒããããGenerator
ãååŸããæ¹æ³ãšããŠããã®äŸ¿å©ãªæ©èœãææžåããŸãã
ããã§ãããã€ãã®ãªãªãŒã¹ãæ©éãããŸãã PCG64
ã ThreeFry
ãªã©ãrandom-tng
ãŸãã¯scipy
ãŸãã¯ãã®ä»ã®ããã±ãŒãžã«ããã·ã¥ãããã®ãã¡ã®1ã€ã人æ°ã«ãªã£ããšããŸããè¿œå æ©èœãŸãã¯æ°ããçµ±èšäžã®æ¬ é¥ã¯Xoshiro256
ãŸãã ã©ã®BitGenerator
人ã
ã䜿çšãã¹ããã«ã€ããŠã®numpyã®æèŠãPCG64
ã«æŽæ°ããããšã«ããŸããã 次ã«ã PCG64
BitGenerator
ã¯ã©ã¹ãè¿œå ãã np.random.pcg64_gen(seed)
é¢æ°ãè¿œå ããŸãã np.random.xoshiro256_gen(seed)
ã«éæšå¥šã®èŠåãè¿œå ããŠãæšå¥šãããã¢ã«ãŽãªãºã ã§ã¯ãªããªã£ãããšã瀺ããŸããæ°ããã³ãŒãã§ã¯np.random.pcg64_gen(seed)
ã䜿çšããããšããå§ãããŸããã Xoshiro256
ã¢ã«ãŽãªãºã ã䜿çšããã«åŒãç¶ã䜿çšããããšããå§ãããŸããèŠåãæ瀺çã«Generator(Xoshiro256(seed))
䜿çšããå¿
èŠããããŸãã
ããã«ããããå¿åãAPIã§çºçããåé¡ã®äžéšïŒã€ãŸãã Generator(seed)
ã Generator(DefaultBitGenerator(seed))
ã np.random.default_gen(seed)
ïŒãåé¿ã§ãããšæããŸãã ãã¯ãåªå
ãããªããªã£ãã¢ã«ãŽãªãºã ãæ°žç¶çã«ãµããŒãã§ããŸãã æèŠãå€æŽãããšãã«ãæèŠã®ãããåªå
ãã³ã³ã¹ãã©ã¯ã¿ãŒã«å¥ã®ããšããããå¿
èŠã¯ãããŸããã ããŒãžã§ã³çªå·ã§ã¯ãªãæ¬åã䜿çšããŠåºå¥ãããããã³ãŒããæŽæ°ããŠå€ãçµæãåçŸããæ¹æ³ãåžžã«ç¥ã£ãŠããŸãïŒäœããã®çç±ã§ç¡å®³ãªèŠåã«èããããªãå ŽåïŒã åºæã®ãªãã³ãŒããèšé²ãããnumpyã®ãªãªãŒã¹çªå·ãååŸããŠããã®æŽæ°ãè¡ãããšãã§ããŸãã åæã«ãã¢ã«ãŽãªãºã ã®æ°ãæå°éã«æããã©ã€ãã©ãªãæäœããããã®æãç°¡åãªæ¹æ³ããã¹ããã©ã¯ãã£ã¹ã«ããããšã§ãnumpyã®æèŠãå¹æçã«è¡šçŸããããšãã§ããŸãã
ããã¯ã©ã®ããã«èãããŸããïŒ æåã®ãªãªãŒã¹ã§ã¯ããã®BitGenerator
ã確å®ã«éžæããããã«ãŸã å€ãã®åªåãæãå¿
èŠããããŸãã ããã¯ãŸã éèŠã§ãã
æå 端ã®ããã©ãŒãã³ã¹ãæ°ã«ããWindows32ããããŠãŒã¶ãŒããããããããšã¯æããŸããã 64ãããã«åãæ¿ããã®ã«ããã»ã©åŽåã¯ããããŸããã
åæããã Win32ã§ã®PCG64
ã®åé¡ã¯åã«ããã©ãŒãã³ã¹ïŒãããŠããããããçšåºŠã®åªåã§æ¹åã§ããåé¡ïŒã§ãããããããããããã«ãŒã§ã¯ãªãããšã«åæããŸããïŒ
MSVCã§roråœä»€ãçæãããå Žåã¯ãã_ rotr64ãçµã¿èŸŒã¿é¢æ°ã䜿çšããå¿ èŠããããšæããŸãã
ãŸããæé©åã®ããã«ã/ O2ããã©ã°ã奜ããããããŸããã
ããããšãïŒ @imnemeã¯ç§ã®ããã«ããããã¹ãŠã®å€±æãææããŸããã :-)
@sebergèŠæå¿ã«ã€ãªãã£ããããªãã®åéããã®åŒçšã¯ãããŸããïŒ ããšãã°ãMT19937ã®k = 623ã®åçšåºŠååžå®çããããå°ããªPRNGãåŒãèµ·ããéç·åœ¢ãã€ããã¯ã¹ã·ãã¥ã¬ãŒã·ã§ã³ã®åé¡ãä¿®æ£ããããšã瀺ããè«æã§ããïŒ ãããåèã«ããŠãããå
·äœçãªä¿èšŒãæäŸã§ãããããããŸããã _äžè¬_ã§ã¯ãåçšåºŠååžå®çã«é¢ããç§ã®èŠè§£ã¯ãäžè¬ã«ãPRNGã®åçšåºŠååžãPRNGã®ç¶æ
ãµã€ãºã§èš±å¯ãããŠããæ倧å€ã«è¿ã¥ããããšãããã®ã§ãã _practice_ã§ãPRNGãä»ã®ç¹ã§ç®çã«ååãªå€§ããã§ããå ŽåïŒPractRandãééãããæç»ããäºå®ã®ãµã³ãã«æ°ã®2ä¹ãããåšæã倧ãããªã©ïŒãå¿é
ããçç±ã¯ããŸããããŸãããæ£ç¢ºãªk
ã ä»ã®äººã¯ç°ãªãæèŠãæã£ãŠãããããããŸããããããŠå€åããªãã®åéã§ç§ãç¥ããªãç¹å®ã®åé¡ããããããããŸããã ãã®å Žåã¯ãå©çšå¯èœãªç¹å®ã®ãœãªã¥ãŒã·ã§ã³ããããŸãïŒ
奜å¥å¿ããã
aesctr.h
ã䜿çšããŠAESã«ãŠã³ã¿ãŒããããžã§ãã¬ãŒã¿ãŒãã©ããããŸãã
ç§ã¯ééã£ãŠããå¯èœæ§ããããŸãããããã@pbstarkã®æžå¿µã«åœ¹ç«ã€ãšã¯æããŸããã AES-CTRã¯CS-RNGã§ããããã¹ãŠã®CS-RNGã«ãããªãã®k
ãã¹ãŠã®å¯èœãªk!
é åã«ïŒçè«çã«ïŒå°éã§ããããã«ããããã«å¿
èŠãªé·ãæéãããããã§ã¯ãããŸããã ã«ãŠã³ã¿ãŒã¯ãŸã 128ãããã®æ°å€ã§ãããããŒã«ãªãŒããŒãããšãæéã®çµããã«å°éããŸãã @pbstarkã¯ãéåžžã«å€§èŠæš¡ãª
äžè¬ã«ãåçšåºŠååžå®çã«é¢ããç§ã®èŠè§£ã¯ãPRNGã®åçšåºŠååžããPRNGã®ç¶æ ãµã€ãºã§èš±å¯ãããŠããæ倧å€ã«è¿ã¥ããããšãããã®ã§ãã
æ倧ã®åçšåºŠååžãæãŸããç¹æ§ã§ãããšèãã人ãããŸãããããã¯æ¬ é¥ãšèŠãªãããšãã§ããŸãïŒãããŠãå€ãã®ããšãè¿°ã¹ãŠããè«æãããã«ãããŸãïŒã _k_-bit PRNGãããããã¹ãŠã®_k_-bitã·ãŒã±ã³ã¹ã1åã ãçºçããå Žåãèªçæ¥ã®åé¡ã«éåããããšã«ãªããŸããããã¯ãçŽ2 ^ïŒk / 2ïŒã®åºååŸã«åºåãç¹°ãè¿ããããšäºæ³ãããããšã瀺ããŠããŸãã ïŒç§ã¯ãããã®ã¢ã€ãã¢ã«åºã¥ããŠèªçæ¥ã®åé¡ã®çµ±èšçæ€å®ãäœæããŸããã64ãããåºåã®64ãããç¶æ ã®PRNGã§ããSplitMixãš32ãããåºåã®64ãããã®Xoroshiro64 +ã§ãçµ±èšçã«åŠ¥åœã§ãªãç¹°ãè¿ãããªãããšãæ£ããæ€åºã
èå³æ·±ãããšã«ã64ãããã®ç¹°ãè¿ãããªãïŒãŸãã¯ç¹°ãè¿ããå€ããã-ãã¢ãœã³ååžãäºæ³ãããïŒããã«PRNGã«å€±æããçµ±èšçæ€å®ãäœæããããšã¯éåžžã«å®çšçã§ãããéã«ãçç¥ãããŠããå€ãããããªãå Žåã¯ããã¹ãŠã®64ãããå€ã®36.8ïŒ ã®çç¥ãæ€åºããŸãã
æããã«ã_k_ã倧ãããªãã«ã€ããŠãæåŸ ãããªãç¹°ãè¿ãã®æ¬ é¥ããã¹ãããããšã¯å®çšçã§ã¯ãªããªããŸãããç¶æ ã®ãµã€ãºïŒããã³æéïŒã倧ãããªãã«ã€ããŠããµã€ãºãè¿œå ãããããšã¯ãããã瀺ãããšã®äž¡æ¹ãå®çšçã§ãªãããšãæå³ããŸããæ倧ã«çåé ãããPRNGã¯ãç¹°ãè¿ãã«å€±æããããã«æ¬ é¥ããããåæ§ã«éå®çšçã§ãããéæ倧ã«çåé ãããPRNGã¯ãããã€ãã®_k_ãããã·ãŒã±ã³ã¹ãç¹°ãè¿ãïŒçµ±èšçã«ãã£ãšããããæ¹æ³ã§ïŒãä»ã®ã·ãŒã±ã³ã¹ãå®å šã«çç¥ããããã«æ¬ é¥ããããŸãã ã©ã¡ãã®å ŽåããPRNGã¯å€§ããããŠã2ã€ãåºå¥ã§ããŸããã
ç§ãèŠããã§ãã ç§ãã¡ã¯ãæ°åŠã«åºã¥ããŠãå€ãã®å€§ããªåé¡ãããã«éããªãããšãç¥ã£ãŠããŸããããŸã äŸã瀺ãããšã¯ã§ããŸããã äºé²ååã¯ã倧ããªåé¡ãããããšãç¥ã£ãŠãããããããé²ãæ¹æ³ïŒCS-PRNGïŒãç¥ã£ãŠããã®ã§ãããã©ã«ãã§ãããå®è¡ãããŠãŒã¶ãŒãéžæããå Žåã«æ³šæãæããªãããã«ããããšãã§ããŸãã
ç§ã¯ãã®è°è«ãšèšŒæ ã«çŽåŸããŠããªããšèšããããåŸãŸããã ãã®ãããNumpyãŠãŒã¶ãŒã®åã«ç«ã€ã®ã¯æ°ãé²ãŸãªãã®ã§ããã®çç±ã§åãæ¿ããå¿ èŠããããšäŒããŸãã ç§ã¯ãã®å£°æãæè·ããæºåãã§ããŠããªãã®ã§ããããã®äŸãæ±ããŠããŸãã ãããã¯èª¬åŸåããããããªããç§ãã¡ã«å§ããŠãããã®ç«å Žãæè·ããæºåãããŠãããã§ãããã
æéã®PRNGãçã®RNGã«éããªãç¹æ§ã¯ãããããããŸãã ãããŠãçè«çã«ã¯ãçã®RNGã®ããããã£ã«äŸåããŠå®è¡ãããèšç®ããããããããŸãïŒãŸãã¯ãå°ãªããšããããããã©ãã ãç·©åã§ããããå³å¯ã«èšŒæããŠããŸããïŒã ãããããããã®æ¬ ç¹ã®å€ãã¯ãå®è¡ããå®éã®èšç®ã®çµæã«ããããããã§ãå®éã«ã¯ç®ç«ããªã圱é¿ããäžããŸããã ãããã®éåã¯ãåŠå®çãªãã®ã§ã¯ãªãããªãŒã«ãªã¢ããã·ã³ã°ããŽãŒ/ããŒãŽãŒã®ãããªãã®ã§ãã ãããã«ã¯å¹æéããããç§ãã¡ã¯å€ããå°ãªããå¹æã蚱容ããããšãã§ããŸãã
ãã¡ããã説åŸåã®ããããšã«ãç¹å®ã®ãµã€ãºã®PRNGã¯ãäžéšã®k
ã«å¯ŸããŠãã¹ãŠã®k!
é åãåçã«çæã§ããªãããšã瀺ããŠããŸãã ç§ãèŠéããŠããã¹ãããã¯ããããã®é åããã¹ãŠçæã§ããªãããšããå®è¡ãããå
·äœçãªèšç®ã«ã©ã®ããã«åœ±é¿ããããšããããšã§ãã PractRand
ãŸãã¯TestU01ã«è¿œå ããŠãåé¡ã人ââã
ã«ç€ºãããšããå§ããããã¹ãããããŸããã
@imnemeã®PCGããŒããŒããéåžžã«æçã§ããããšãããã£ãåæã©ã€ã³ã®1ã€ã¯ãåPRNGã®è€æ°ã®ããå°ããªç¶æ ã®ããŒãžã§ã³ãå°ãåºããããããTestU01ã«å€±æãå§ããå Žæãæ£ç¢ºã«ç¢ºèªããããšã§ããã ããã«ããããX PRNGãåæ ŒããŸãã¯ã倱æããšèšãã ãã§ãªããPRNGã¢ãŒããã¯ãã£ãéåžžæ¯èŒããæ¹æ³ãåŸãããŸãã ãŸãã䜿çšäžã®ç¶æ ãµã€ãºïŒå€æ°ã®GiBã®ãµã³ãã«ã§TestU01ã«åæ ŒïŒã§ã®ãããã«ãŒã ã®éãèŠç©ããããšãã§ããŸãã 8ãããPRNGã®åé¡ãå®èšŒããããã«å®è¡ã§ããå ·äœçãªèšç®ã¯ãããŸããïŒ 16ãããPRNGïŒ æ¬¡ã«ããã®æ°ãããã¹ãã§ãTestU01 / PractRandãçŸåšè¡ããããæ©ãPRNGã«é¢ããæ å ±ãåŸããããã©ããã確èªã§ããŸãã ãããŠãããã¯éåžžã«åœ¹ã«ç«ã¡ãŸãã
äžæ¹ãPractRandã®çŸåšã®äžé£ã®ãã¹ãã®å°ããªPRNGã®é害ç¹ãããããããã®é åã«åºã¥ããŠé害ã瀺ãããã«PRNGããåŒãåºãããããŒã¿ãå¿ èŠãªå Žåããã®åé¡ã¯å®çšçã§ã¯ãªããšçµè«ä»ããŸããæžå¿µäºé ã§ãããé åã®åé¡ãç§ã®èšç®ã«å®éçãªåœ±é¿ãäžãããã©ããã®é©åãªãããã·ãšããŠãpassesPractRandãã䜿çšã§ããŸãã
ããããå®è¡ããŠåé¡ã人ã ã«ç€ºãããšãã§ããããã°ã©ã ãæå ã«ãããŸã§ãããã«åºã¥ããŠCS-PRNGãæšé²ããããšã«æµæããããŸãã ç§ã¯ãã®éžæã説åŸåãæã£ãŠèª¬æããããšã¯ã§ããŸããã
32ã¢ã€ãã ãã·ã£ããã«ãããšãã«ãããèŠæ±ãã人ã®ããã«ããã¹ãŠ32ïŒ ã·ã£ããã«ïŒã€ãŸãããããã®ãã¹ãŠã®263130836933693530167218012160000000ïŒã¯ããããã®32ããã®ã©ã³ãã ãµã³ãã«ã®ã¿ãæäŸããPRNGã§ã¯ãªããçæå¯èœã§ããå¿ èŠããããŸãã ã·ã£ããã«ãç§ã¯å®éã«ããªããèšå€§ãªæ°ãèŠæ±ããããšããŠãããªããããªãã¯ãã ååã«å€§ããèããŠããªãã ãã ãšèšãã§ãããã
ãããã£ãŠãç§ã¯ïŒé¡ãåãããŠïŒãããã®ã·ã£ããã«ãåºãŠããé åºãäºåã«æ±ºå®ãããã¹ãã§ã¯ãªããšäž»åŒµããŸãïŒ æããã«ã32åãã¹ãŠãåºåããããã«èŠæ±ããå¿ èŠããããŸãã å¯èœãªãã¹ãŠã®é åºã§ã·ã£ããã«ããŸãâïŒ32ïŒïŒïŒ å¿ èŠãªãã®ã§ãïŒ ãã¡ãããããã«ã¯ç¶æ ã«3.8Ã10 ^ 18ãšã¯ãµãã€ããå¿ èŠã§ãããåæåããã«ã¯åæ§ã®éã®ãšã³ããããŒãå¿ èŠã§ããããã¹ãŠãããã«ããããšãç¥ã£ãŠãã䟡å€ã¯ç¢ºãã«ãããŸãã
...
np.random.xoshiro256_gen(seed)
ã«éæšå¥šã®èŠåãè¿œå ããŠãæšå¥šãããã¢ã«ãŽãªãºã ã§ã¯ãªããªã£ãããšã瀺ããŸããæ°ããã³ãŒãã§ã¯np.random.pcg64_gen(seed)
ã䜿çšããããšããå§ãããŸãããèŠåãªãã§Xoshiro256ã¢ã«ãŽãªãºã ãåŒãç¶ã䜿çšããããšããå§ãããŸããæ瀺çã«Generator(Xoshiro256(seed))
䜿çšããå¿ èŠããããŸã
ããã§ããéæšå¥šãšãæ¬åœã«ç¥ããããªãå¥åŠãªååã®äž¡æ¹ã§ãŠãŒã¶ãŒãæ©ãŸããŠããŸãã
NEPã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
ããã©ã«ããæŽæ°ããååãªçç±ãããå Žåã¯ããããå®è¡ããŠãã¢ã«ãŽãªãºã ãæ瀺çã«æå®ããªãã£ããŠãŒã¶ãŒã®ãããããšã®åçŸæ§ãå£ãããšããããè¯ããªãã·ã§ã³ã§ãïŒãããŠããªãã以åã«äž»åŒµããŠãããã®ïŒã
ãããã©ã«ããªãããªãã·ã§ã³ãæ¬åœã«æå³ããã®ã¯ããå¿åã®ããã©ã«ããªããã§ããã
ã§ã¯ããŠãŒã¶ãŒã䜿çšããŠããPRNGã®ååãç¥ããããšããã®ã¯ããªãã®ãã€ã³ãã§ããïŒ
ããããŠãŒã¶ãŒã®èŠ³ç¹ããèŠãŠãã ããã ããããnp.random.rand
ïŒcoããnp.random.RandomState()
ãããã¡ãœããã䜿çšããã®ã¯ååã«å°é£ã§ãã ä»åºŠã¯ããè¯ãã·ã¹ãã ã玹ä»ããŸãã圌ããç®ã«ããã®ã¯np.random.xoshiro256_gen()
ã§ããïŒ ããã¯ã䜿ããããã®ç¹ã§å€§ããªååž°ã«ãªããŸãã
ã§ã¯ããŠãŒã¶ãŒã䜿çšããŠããPRNGã®ååãç¥ããããšããã®ã¯ããªãã®ãã€ã³ãã§ããïŒ
ããããããã¯äººã
ãåé¿ããŠããdefault_generator(seed)
ãããªãæå®ããã移åã¿ãŒã²ãããAPIãæã€åé¡ã軜æžããããšã§ãïŒããšãã°ã @ shoyerã®version
åŒæ°ïŒã
ã¹ããªãŒã ã®äºææ§ãç¶æããããšïŒNEP 19ã¯ãããåŠèªããŸãïŒã¯ãAPIã®ç Žæã®äºæ¬¡çãªãã®ã§ãã ç°ãªãBitGenerator
ã¯ãæ©èœã»ããã«å¿ããŠç°ãªãæå¹ãªAPIãæã¡ãŸãïŒäž»ã«ãèšå®å¯èœãªã¹ããªãŒã ããžã£ã³ãã¢ãããã§ãããPRNGã®ãã©ã¡ãŒã¿ãŒåã®çšåºŠã«å¿ããŠãä»ã®APIããããŸãïŒã ãããã£ãŠãããã©ã«ãã®PRNGéžæãå€æŽãããšãåºåãããå€ãå€æŽããã ãã§ãªããå®éã«ã³ãŒããç ŽæããŸãïŒã€ãŸããå®è¡ãããªããªã£ãããæ£ããå®è¡ãããªããªã£ããããŸãïŒã
ããšãã°ãæåã«PCG64
ãŸãã 128ãããã®ç¶æ
ã2 ^ 127ã®èšå®å¯èœãªã¹ããªãŒã ãããããžã£ã³ãã¢ããããå®è£
ããŸãã çŽ æŽãããããã«æ©èœã ãããã£ãŠã人ã
ã¯default_generator(seed, stream=whatever)
æžãå§ããŸãã ããŠãå°æ¥ã®äœæ¥ã§ãä»ã®äœãã«åãæ¿ããããªããããªå€§ããªçµ±èšäžã®æ¬ é¥ãèŠã€ãã£ããšããŸãããã ããã©ã«ããšããŠããã¢ãŒããã次ã®PRNGã¯ã128ããã以äžã®ç¶æ
ïŒç°¡åã§ããæ±çšã®ããã©ã«ããšããŠãããããå°ãããã®ã¯ãå§ãããŸããïŒããžã£ã³ãã¢ãããïŒããŒãïŒïŒã> = 2 ^ 127ã®èšå®å¯èœãªã¹ããªãŒã ïŒwhooãå°å¹ŽïŒïŒãã³ãŒãã«ãã§ã«ååšããdefault_generator()
ã®äœ¿çšãå£ããªãããã«ã ä»ãç§ãã¡ã¯ãã®ã©ãã§ãããšäžç·ã«æ®ããããšãã§ãããããããŸããã
@shoyerã¯ãããã©ã«ãã®BitGenerator
åžžã«æå³çã«æå°å
¬åæ¯ã®æ©èœã«éå®ããããšãã§ãããããããªããšææ¡ããŸããã ããã¯ããŸãããã§ãããïŒ ãããã @ charrisã
ä»åºŠã¯ããè¯ãã·ã¹ãã ã玹ä»ããŸãã圌ããç®ã«ããã®ã¯
np.random.xoshiro256_gen()
ã§ããïŒ ããã¯ã䜿ããããã®ç¹ã§å€§ããªååž°ã«ãªããŸãã
å¥åŠãªååãåé¡ã§ããå Žåã¯ãããªã·ãŒãåãã§ããéããããããããããäžè¬çãªååã䜿çšã§ããŸãïŒæ°ããé¢æ°ãè¿œå ããå€ãé¢æ°ã«ã€ããŠèŠåãéå§ããŸãïŒã ç§ã¯ãããšåçã ãšæããŸãã ãããé »ç¹ã«è¡ãã¹ãã§ã¯ãããŸããã
ã©ãã§ããã䜿çšããŠversion
ã¡ã«ããºã ãåé¿ããããšã«ããå Žåããåé¡ãããŸããã
ãããã©ã«ããã«ã€ããŠã®ç§ã®èŠè§£ã¯ã Generator()
ãåžžã«æ©èœããããã«ãå®è£
ã®è©³çŽ°ãšããŠæ®ãããšãã§ãããšãããã®ã§ãã åžžã«åçŸå¯èœãªçµæïŒãžã§ãã¬ãŒã¿ãŒã®å€æŽãŸã§ïŒãååŸããå¯äžã®æ¹æ³ã¯ãæ§æGenerator(BitGenerator(kwarg1=1,kwargs2=b,...))
ã䜿çšããããšã§ããããšã«æ³šæããŠããããç解ããŸãã
ç¶æ ãžã®ã¢ã¯ã»ã¹ã«ã¯ãã¯ã«ã¹ãå¿ èŠã§ãããããå®è£ ã®è©³çŽ°ãå®éã«é衚瀺ã«ããããšã¯å®çšçã§ã¯ãããŸããã
å¥ã®æ¹æ³ã¯ãä»ã®é¢æ°ãšåãããã«æ±ããäžè¬ã«ã©ã³ãã çæãè¡ããå€æŽãå¿ èŠãªå Žåã¯æšæºã®éæšå¥šãµã€ã¯ã«ãå®è¡ããããšã§ãã ããã¯ãç©äºãæ£ããè¡ããŠãŒã¶ãŒã«åœ±é¿ãäžããããšã¯ãããŸãããããã¥ã¡ã³ãã«ååãªèŠåãããã°ãå°ãªããšã倧èŠæš¡ãªãããžã§ã¯ãã§ã¯ãããã«å¯ŸããŠé©åãªãããçãåŸãããšãã§ããå¯èœæ§ããããŸãã ããã§ç§ãææ¡ããŠããã®ã¯ãæ°ããAPIã«ã€ããŠèãããšãã«ãã¹ããªãŒã ã®äºææ§ã®ä¿èšŒãè¡ãããããšãå¿ããããšãã§ãããšããããšã§ãã
ïŒ13650ã§@bashtageã¯ãç§ãã¢ã¯ã»ã¹çŠæ¢Generator().bit_generator
ãŸã ãžã®çŽæ¥ã¢ã¯ã»ã¹ããªããšé
žæŽããšãã§ããŸãããã«state
ã ãããã«æžãçŽãããtest_pickle
ããPython Thread
å
šäœã§äœ¿çšã§ããããã«æž¡ããŸãã
ç§ã®è³ªåã¯-äœãå®å šã§ããïŒ ããŸããŸãªããããã£ãæã€ããŸããŸãªçšåºŠã®æºã©ã³ãã æ§ããããŸãã ãããŸã§ã®ãšãããå ·äœçãªäŸãæããŠãã人ã¯èª°ãããŸãããããã§ã¯ãä»ã®åé¡ãPRãã¹ã¬ããã®ãããã§ããããŸããã
äžéšã®_N_ïŒ 512ã1024ïŒã®ã
ã¢ã«ãŽãªãºã ã®åºæ°ã©ã³ãã³ã°ãå¯èœã«ããçµ±èšå質ã®ããæŽç·Žããããã¥ãŒãå¿
èŠãªå Žåã¯ã @ imnemeã®PCGããŒããŒã®ã»ã¯ã·ã§ã³3ããå§ãããŸãããã®ããŒããŒã§ã¯ãã¢ã«ãŽãªãºã ã®çž®å°ç¶æ
ããªã¢ã³ãã®ãããã¡ã€ã«ã䜿çšããŠããã®æ¹æ³ãç解ããŠããŸããåå®å
šãªã¢ã«ãŽãªãºã ã«ã¯å€ãã®ããããã«ãŒã ãããããŸãã ããã¯ãæå·æè¡è
ãããŸããŸãªæå·ã¢ã«ãŽãªãºã ãåæããæ¹æ³ãšéåžžã«ãã䌌ãŠããŸãã æ€èšäžã®å®è¡å¯èœãªãªãã·ã§ã³ã¯ããå£ããŠããªãããšããããŒã¹ã©ã€ã³åºæºã«åæ Œããå¿
èŠããããŸãããããã¯åè£è
ã®ã©ã³ã¯ä»ãã«ã¯åœ¹ç«ã¡ãŸããã 代ããã«ã圌ãã¯ç«¶åã¢ã«ãŽãªãºã ã®çž®å°ããŒãžã§ã³ãæ§ç¯ãããããç Žãåã«ããªããã©ãã ãåæžããªããã°ãªããªããã確èªããŸãã Nã©ãŠã³ãã®å®å
šã¢ã«ãŽãªãºã ãN-1ã§ç Žãããå Žåããããã«ãŒã ã¯ã»ãšãã©ãªããæå·åŠè
ã¯ãããããããåé¿ããã§ãããã åæ§ã«ã128ãããã®BitGenerator
ãPractRandãééãããããã®120ãããããŒãžã§ã³ã倱æããå Žåãããããããªãå±éºã§ãã
@mattipããã¯åççãªããã§ãã ã©ããã§èª°ãã
import gc
state = [o for o in gc.get_objects() if 'Xoshiro256' in str(o)][0].state
圌ãããããæ·±ãæãäžãããã®ãªããããã¯åé¡ãããŸããã å°é家以å€ã®ãŠãŒã¶ãŒãæ¯æŽãããã ãã§ã
ãããã«æžãçŽããã
test_pickle
ããPythonThread
å šäœã§äœ¿çšã§ããããã«æž¡ããŸãã
ããã¯æªè§£æ±ºã®åé¡ïŒïŒ9650ïŒã§ããããšã«æ³šæããŠãã ãããçæ³çã«ã¯ã Generator()
ãåã¹ã¬ããã«åã·ãŒããããŸãã IIRCããã¯Python> = 3.7ã§ã®ã¿å®çšçã§ã
ãããã©ã«ããã«ã€ããŠã®ç§ã®èŠè§£ã¯ã
Generator()
ãåžžã«æ©èœããããã«ãå®è£ ã®è©³çŽ°ãšããŠæ®ãããšãã§ãããšãããã®ã§ãã åžžã«åçŸå¯èœãªçµæïŒãžã§ãã¬ãŒã¿ãŒã®å€æŽãŸã§ïŒãååŸããå¯äžã®æ¹æ³ã¯ãæ§æGenerator(BitGenerator(kwarg1=1,kwargs2=b,...))
ã䜿çšããããšã§ããããšã«æ³šæããŠããããç解ããŸãã
åºå¥ããå¿ èŠã®ããåçŸæ§ã«ã¯2çš®é¡ãããŸãã 1ã€ã¯ãåãã·ãŒãã䜿çšããŠããã°ã©ã ã2åå®è¡ããåãçµæãåŸãããããšã§ãã ãããç§ãã¡ããµããŒãããå¿ èŠããããã®ã§ãã ãã1ã€ã¯ãå°ãªããšãå³å¯ãªæå³ã§ãç§ãã¡ãåŠèªããnumpyã®ããŒãžã§ã³éã§ã®åçŸæ§ã§ãã
åŒæ°ã®ãªãGenerator()
ãã€ãŸããnumpyãæšå¥šããä»»æã«ã·ãŒããããPRNGãæããŠãã ãããã¯äž»ãªäœ¿çšäŸã§ã¯ãããŸããã å€ãã®ãµããŒãã¯å¿
èŠãããŸããã ãnumpyã_this_seedã§æšå¥šããPRNGãæããŠãã ãããã¯ããªãã·ã§ã³ã«ã€ããŠèª¬æããŠãããã®ã§ãã ã·ãŒããããPRNGãååŸããæ¹æ³ã«ã€ããŠãnumpyãæèŠãè¡šæããæ¹æ³ãå¿
èŠã§ãããã®æ¹æ³ã¯ããŠãŒã¶ãŒã«ãšã£ãŠç°¡åã§äŸ¿å©ã§ããå¿
èŠããããŸãïŒããã§ãªãå ŽåããŠãŒã¶ãŒã¯äœ¿çšããŸããïŒã ç§ã¯ã¢ã«ãŽãªãºã ã«ååãä»ããã®ã奜ãã§ããïŒãã䟿å©ãªé¢æ°ã䜿çšããŸããïŒã @ rgommersã¯ãããäžæ©é ããããšèããŠãããç§ã¯ããã«åæ
ããŠããŸãã
åŒæ°ã®ãªãGeneratorïŒïŒãã€ãŸããnumpyãæšå¥šããä»»æã«ã·ãŒããããPRNGãæããŠãã ãããã¯äž»ãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸããã å€ãã®ãµããŒãã¯å¿ èŠãããŸããã ãnumpyããã®ã·ãŒãã§æšå¥šããPRNGãæããŠãã ãããã¯ããªãã·ã§ã³ã«ã€ããŠè©±ãåã£ãŠãããã®ã§ãã ã·ãŒããããPRNGãååŸããæ¹æ³ã«ã€ããŠãnumpyãæèŠãè¡šæããæ¹æ³ãå¿ èŠã§ãããã®æ¹æ³ã¯ããŠãŒã¶ãŒã«ãšã£ãŠç°¡åã§äŸ¿å©ã§ããå¿ èŠããããŸãïŒããã§ãªãå ŽåããŠãŒã¶ãŒã¯äœ¿çšããŸããïŒã ç§ã¯ã¢ã«ãŽãªãºã ã«ååãä»ããã®ã奜ãã§ããïŒãã䟿å©ãªé¢æ°ã䜿çšããŸããïŒã @ rgommersã¯ãããäžæ©é ããããšèããŠãããç§ã¯ããã«åæ ããŠããŸãã
ç§ã¯ããŠãŒã¶ãŒãå®éã«è¯ãã·ãŒããæäŸããããã®èšåãæŽã£ãŠããªããšäž»åŒµããŸãã ããšãã°ãã¡ã«ã»ã³ããã€ã¹ã¿ãŒãã·ãŒãããæ£ããæ¹æ³ãç¥ã£ãŠãããŠãŒã¶ãŒã¯äœäººããŸããïŒ æã£ãã»ã©ç°¡åã§ã¯ãããŸããã624åã®ã©ã³ãã ãª32ãããæŽæ°ïŒ19937ãããã®ç¶æ ãæäŸããããïŒãäŸçµŠããŠããªãå Žåã¯ãééã£ãŠããŸãã
ãããã£ãŠãå®éã«ã¯ããŠãŒã¶ãŒãåçŸå¯èœãªçµæãââåŸãæ£ããæ¹æ³ã¯ãPRNGãäœæãïŒã·ãŒããæäŸããã«ãèªåçã«é©åã«ã·ãŒããããããã«ããïŒãããããã¯ã«ã¹ã«ããããšã§ãã
è°è«ãæ£ããæ¹æ³ã«ã€ããŠã®ã¿ã§ããå Žåãç§ã¯
Generator(BitGenerator(**kwargs))
ããã¯ã«ãã£ãŠã®ã¿äœ¿çšããããã
è€è£œãæ°ã«ããåæèã®ãŠãŒã¶ãŒã
Generator()
䜿çšãããããã©ã«ã
èæ
®ãããéžæãšåããããå€ã解éãããã®ã§ãããã
ã·ãŒãããããã©ãŒã ã䜿çšããå Žåã®æšå¥šäºé
ã
ãã1ã€æšãŠãã ãã§ãã¯ã©ã¹ã¡ãœããGenerator.seeded(seed[,
bit_generator]) where bit generator is a string. This would allow the
pattern of switching from one value to None to warn if the default was
going to change, like lstsq. I would also only support a limited pallatte
of but generators initially (i.e. 1). Doesn't make it easy to expose
advanced features I suppose. In a perfect world it would use kwarg only to
allow any keyword argument to be used which avoids most depreciation
problems. Of course, this doesn't really need to be a class function, just
seed`ã
ç«ã2019幎5æ28æ¥ã«ã¯ãååŸ4æ38åãããŒãã»ã«ãŒã³ã®[email protected]ã¯æžããŸããïŒ
ãããã©ã«ããã«ã€ããŠã®ç§ã®èŠè§£ã¯ããããå®è£ ãšããŠæ®ãããšãã§ãããšããããšã§ã
詳现ãGeneratorïŒïŒãåžžã«æ©èœããããã«ããŸãã ç§ã¯ããã
åžžã«åçŸå¯èœãªçµæãââåŸãå¯äžã®æ¹æ³ã§ããããšã«æ³šæããŠãã ããã
ïŒãžã§ãã¬ãŒã¿ãŒã®å€æŽãŸã§ïŒæ§æã䜿çšããããšã§ã
GeneratorïŒBitGeneratorïŒkwarg1 = 1ãkwargs2 = bã...ïŒïŒåºå¥ããå¿ èŠã®ããåçŸæ§ã«ã¯2çš®é¡ãããŸãã 1ã€ã¯
åãã·ãŒãã§ããã°ã©ã ã2åå®è¡ãããšãåãçµæãåŸãããŸãã
ãããç§ãã¡ããµããŒãããå¿ èŠããããã®ã§ãã ãã1ã€ã¯ãå šäœã®åçŸæ§ã§ãã
å°ãªããšãå³å¯ãªæå³ã§ãç§ãã¡ãåŠèªããnumpyã®ããŒãžã§ã³ãåŒæ°ã®ãªãGeneratorïŒïŒãã€ãŸããä»»æã«ã·ãŒããããPRNGã
numpyãæšå¥šãããã¯äž»ãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸãããããã»ã©å€ãã¯å¿ èŠãããŸããã
ãµããŒãã ãnumpyããã®ã·ãŒãã§æšå¥šããPRNGãæããŠãã ãããã¯ã
ãããŠããããç§ãã¡ããªãã·ã§ã³ã«ã€ããŠè°è«ããŠãããã®ã§ãã numpyãããæ¹æ³ãå¿ èŠã§ã
ã·ãŒããããPRNGãååŸããæ¹æ³ã«ã€ããŠæèŠãè¡šæãããã®æ¹æ³ã¯
ãŠãŒã¶ãŒã«ãšã£ãŠç°¡åã§äŸ¿å©ã§ãïŒããã§ãªããã°ããŠãŒã¶ãŒã¯ããã䜿çšããŸããïŒã ç§ã¯å¥œãã§ã
ã¢ã«ãŽãªãºã ã«ååãä»ããŸãïŒãã䟿å©ãªé¢æ°ã䜿çšããŸããïŒãã
@rgommers https://github.com/rgommersã¯ãããã¯äžæ©é ããããšèããŠããã
ç§ã¯ããã«åæ ããŠããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKA4SSNW6XZEVFUMCDPXVGW5A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABKTSROCMLHG6E6BLWI6TWDPXVGW5ANCNFSM4HPX3CHA
ã
ç«ã2019幎5æ28æ¥ã«ã¯ãååŸ4æ38åãããŒãã»ã«ãŒã³ã®[email protected]ã¯æžããŸããïŒ
ãããã©ã«ããã«ã€ããŠã®ç§ã®èŠè§£ã¯ããããå®è£ ãšããŠæ®ãããšãã§ãããšããããšã§ã
詳现ãGeneratorïŒïŒãåžžã«æ©èœããããã«ããŸãã ç§ã¯ããã
åžžã«åçŸå¯èœãªçµæãââåŸãå¯äžã®æ¹æ³ã§ããããšã«æ³šæããŠãã ããã
ïŒãžã§ãã¬ãŒã¿ãŒã®å€æŽãŸã§ïŒæ§æã䜿çšããããšã§ã
GeneratorïŒBitGeneratorïŒkwarg1 = 1ãkwargs2 = bã...ïŒïŒåºå¥ããå¿ èŠã®ããåçŸæ§ã«ã¯2çš®é¡ãããŸãã 1ã€ã¯
åãã·ãŒãã§ããã°ã©ã ã2åå®è¡ãããšãåãçµæãåŸãããŸãã
ãããç§ãã¡ããµããŒãããå¿ èŠããããã®ã§ãã ãã1ã€ã¯ãå šäœã®åçŸæ§ã§ãã
å°ãªããšãå³å¯ãªæå³ã§ãç§ãã¡ãåŠèªããnumpyã®ããŒãžã§ã³ãåŒæ°ã®ãªãGeneratorïŒïŒãã€ãŸããä»»æã«ã·ãŒããããPRNGã
numpyãæšå¥šãããã¯äž»ãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸãããããã»ã©å€ãã¯å¿ èŠãããŸããã
ãµããŒãã ãnumpyããã®ã·ãŒãã§æšå¥šããPRNGãæããŠãã ãããã¯ã
ãããŠããããç§ãã¡ããªãã·ã§ã³ã«ã€ããŠè°è«ããŠãããã®ã§ãã numpyãããæ¹æ³ãå¿ èŠã§ã
ã·ãŒããããPRNGãååŸããæ¹æ³ã«ã€ããŠæèŠãè¡šæãããã®æ¹æ³ã¯
ãŠãŒã¶ãŒã«ãšã£ãŠç°¡åã§äŸ¿å©ã§ãïŒããã§ãªããã°ããŠãŒã¶ãŒã¯ããã䜿çšããŸããïŒã ç§ã¯å¥œãã§ã
ã¢ã«ãŽãªãºã ã«ååãä»ããŸãïŒãã䟿å©ãªé¢æ°ã䜿çšããŸããïŒãã
@rgommers https://github.com/rgommersã¯ãããã¯äžæ©é ããããšèããŠããã
ç§ã¯ããã«åæ ããŠããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKA4SSNW6XZEVFUMCDPXVGW5A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABKTSROCMLHG6E6BLWI6TWDPXVGW5ANCNFSM4HPX3CHA
ã
䜿ããããã®èŠ³ç¹ãããç§ãã¡ã¯æ¬åœã«Generator(seed)
ããµããŒãããå¿
èŠããããšæããŸãã ããã§ãªããã°ã圌ããããæºåãã§ããŠããªãéžæãããããšã«çŽé¢ããŠããŠãŒã¶ãŒã¯ãã RandomState
ã«åºå·ããã§ãããã
Generator
ã§ããã©ã«ãã®ããããžã§ãã¬ãŒã¿ãŒãããŒãžã§ã³ç®¡çããã«ã¯ã version=1
代ããã«bit_version=1
䜿çšã§ããŸããã version
ã¢ã€ãã¢ãåé€ããŠãåé¡ãããŸããã ãŠãŒã¶ãŒãããããžã§ãã¬ãŒã¿ãæ瀺çã«èšå®ããå¿
èŠã¯ããŸããªããšæããŸãã
ç¹å®ã®ãžã§ãã¬ãŒã¿ãŒæ©èœãå¿
èŠãšããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã解決ããããã®ç§ã®å¥œã¿ã¯ãå®è£
ã®è©³çŽ°ãé ãæ°ããæ±çšBitGââeneratorAPIãèšèšããããšã§ãã ãããã¯ã DefaultBitGenerator
è¿œå ãããã䜿çšã«ãã¬ãŒããªããå«ãŸããå Žåã¯æ°ããã¯ã©ã¹ã«å
¥ããããšãã§ããŸãïŒäŸïŒ ParallelBitGenerator
ã
ããã©ã«ãã®ããããžã§ãã¬ãŒã¿ãŒã®å€æŽã«ããRNGã¹ããªãŒã ã®å°æ¥ã®å€æŽã«é¢ããèŠåã¯çµ¶å¯Ÿã«é¿ããããšæããŸãã ãããã®èŠåã¯ããã®ãããªè©³çŽ°ã«äŸåããªãããä¹±æ°ãèªçºçã«å€åããã®ãé²ãããã ãã«ãžã§ãã¬ãŒã¿ãŒã«seed
ãèšå®ãã倧å€æ°ã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯åãªããã€ãºã§ãã
ãŠãŒã¶ãŒã¯RandomStateã«åºå·ããã ãã§ãã
ããã¯åé¡ãããŸããã圌ãã¯ã¢ãŒãªãŒã¢ããã¿ãŒã§ã¯ãããŸããã APIã¯ãã€ã§ãæ¡å€§ã§ããŸãããçž®å°ããã®ã¯ã¯ããã«é£ãããããå®è¡å¯èœãªæå°éã®APIã匷ãæ±ããŠããŸãïŒå€åé£ããããŸããïŒïŒã Generator(Philox())
ã Generator(seed(3))
ã Generator(bit_version=1)
éã®ãã¥ã¢ã³ã¹ã¯ãããããšã³ããŠãŒã¶ãŒã«äŒãããŸã§å°ããããã«ããã§ãã
Generator(seed)
ãªãæåã®ããŒãžã§ã³ãå
¥æããŠããã£ãŒãããã¯ãåãåããŸãããã
Generator(seed)
ãªãæåã®ããŒãžã§ã³ãå ¥æããŠããã£ãŒãããã¯ãåãåããŸãããã
OKãããã§ã¯æ·±å»ãªç°è°ã¯ãããŸããã ãã®å Žåãä»ã®ãšããå®å šãªBitGeneratorãæå®ããå¿ èŠããããããããŸããã
ãããã£ãŠãå®éã«ã¯ããŠãŒã¶ãŒãåçŸå¯èœãªçµæãââåŸãæ£ããæ¹æ³ã¯ãPRNGãäœæãïŒã·ãŒããæäŸããã«ãèªåçã«é©åã«ã·ãŒããããããã«ããïŒãããããã¯ã«ã¹ã«ããããšã§ãã
ç§ã¯åãããšãèšããŸãããç§ã¯ããã§ã»ãšãã©çœåŒåãåŸãŸããã ããªããèšãããã«ãããŸããäœããæªãèãã ãããšãã£ãŠã人ã ãããããããããªããšããæå³ã§ã¯ãããŸããïŒã
åé¡ã®äžéšã¯ãMTã®å·šå€§ãªç¶æ ã«ãã£ãŠæªåããŸããããã¯ãå®éã«ã¯ãã¡ã€ã«ãžã®ã·ãªã¢ã«åãå¿ èŠãšããŸãã ãã®ãã¡ã€ã«ããŒã¹ã®ãã³ã¹ãããŠãŒã¶ãŒã䜿ããããªããããªæãç°¡åãªAPIã«ããã®ã¯é£ããã§ãã ç¶æ ãã¯ããã«å°ããããã©ã«ãã®PRNGã䜿çšãããšãç¶æ³ã¯æ¹åãããŸãã 128ãããã¯UUIDã®ãµã€ãºã§ããã16é²æ°ã§å°å·ããŠã³ããŒã¢ã³ãããŒã¹ãããã®ã«ååå°ãããµã€ãºã§ãã ãããã£ãŠãé©åãªãã¿ãŒã³ã¯ãããã©ã«ãã§é©åãªãšã³ããããŒã·ãŒãã«ãªãããã«ããã°ã©ã ãèšè¿°ãã次ã«ããã°ã©ã ãå®è¡ãããšãã«ã³ããŒããŠè²Œãä»ããããšãã§ããããã«ãã®ç¶æ ãåºåããããšã§ãã
⯠python secret_prng.py
Seed: 0x977918d0c7da45e5168f72005586500c
...
Result = 0.7223650399276123
⯠python secret_prng.py
Seed: 0xe8962534e5fb585483b86119fcb852ce
...
Result = 0.10640984721018876
⯠python secret_prng.py --seed 0xe8962534e5fb585483b86119fcb852ce
Seed: 0xe8962534e5fb585483b86119fcb852ce
...
Result = 0.10640984721018876
ãã®ãããªãã¿ãŒã³ãåçŽããšå°æ¥ã®èšŒæ ã®äž¡æ¹ãæäŸãããã©ããã¯ããããŸããã
class Generator:
def __init__(bitgen_or_seed=None, *, bit_generator='pcg64', inc=0):
`` `python
ã¯ã©ã¹ãžã§ãã¬ãŒã¿ïŒ
def __init __ïŒbitgen_or_seed = Noneã*ãbit_generator = Noneãinc = NoneïŒïŒ
bit_generatorãNoneã§ãªãå ŽåããŸãã¯incãNoneã§ãªãå ŽåïŒ
warnïŒ 'ããã©ã«ãã¯PCG64ããAESCtrã«å€æŽãããŠããŸããincããŒã¯ãŒã'
ãè°è«ã¯éæšå¥šã§ãããå°æ¥çã«æèµ·ãããã§ãããããFutureWarningïŒ
ãã
`` `python
ã¯ã©ã¹ãžã§ãã¬ãŒã¿ïŒ
def __init __ïŒbitgen_or_seed = Noneã*ãbit_generator = 'aesctr'ãinc = Noneãcounter = 0ïŒïŒ
bit_generator == 'pcg64'ãŸãã¯incãNoneã§ãªãå ŽåïŒ
äŸå€ãçºçãããŸãïŒ 'PCGã¯ãµããŒããããªããªããincã¯åé€ãããŸãã'ïŒ
ãã
ãã®ãããªãã¿ãŒã³ãåçŽããšå°æ¥ã®èšŒæ ã®äž¡æ¹ãæäŸãããã©ããã¯ããããŸããã
äžèšã®https://github.com/numpy/numpy/issues/13635#issuecomment-496589421ã§è¿°ã¹ãããã«ãããã¯ã»ãšãã©ã®ãŠãŒã¶ãŒã«ãšã£ãŠé©ãã¹ãããšã§ãããèç«ãããããšã ãšæããŸãã ãŠãŒã¶ãŒããã¹ãŠã®ãªãã·ã§ã³ã®åŒæ°ãèšå®ããŠããªãå Žåã«èŠåã®çºè¡ãéå§ããèšç»ããããæ瀺çãªBitGeneratorãªããžã§ã¯ããæäŸããå¿ èŠããããŸãã APIãäºæããªãæ¹æ³ã§å£ããŠããããšãããã£ãå Žåãããã¯æ¬åœã«æåŸã®æ段ã«ãªãã¯ãã§ãã
åé¡ã¯ç§»è¡æéã§ãã ããã©ã«ãã䜿çšããŠãããã¹ãŠã®äººãçªç¶èŠåãåãåãã移è¡æéäžã«åãæ¿ããããã®åªããæ¹æ³ããããŸããã ãããã¯ãå°ãªããšããããªãã¯ã®ãäœãšãã«ã®ãŒç¶æ
ããããããã移åGenerator(seed)
ã®å°ãªã䟿å©ãªãé«ãšãã«ã®ãŒç¶æ
ãã«Generator(seed, bit_generator='aesctr')
ã ãã®APIã®ç®çã¯äŸ¿å©ãªãäœãšãã«ã®ãŒç¶æ
ããæäŸããããšã§ãã£ãããããã®ç§»è¡äžã«ç®çãéæã§ããŸããã§ããã ãã¹ãã°ã©ã é¢æ°ã®1ã€ã§ããIIRCã䜿çšããŠãããäžåºŠå®è¡ããŸããããããã¯æªå€¢ã§ããã
ããã¯ãåŒæ°ã®æå³ãã€ã³ãã¬ãŒã¹ã§å€æŽããããšãããã¹ãŠã®éæšå¥šã«å ±éã§ãã ããæ©èœããå¥ã®æ©èœã«ç§»åãããšããéæšå¥šã¯ã管çãã¯ããã«ç°¡åã§ããããããç§ãæå±ããŠããããšã§ãã
Generator(seed)
ãªãæåã®ããŒãžã§ã³ãå ¥æããŠããã£ãŒãããã¯ãåãåããŸãããã
ãæåã®ããŒãžã§ã³ããšã¯ãå®å šãªnumpyãªãªãŒã¹ãæå³ããŸããïŒ ãããšããPRãããŒãžããã ãã§ããïŒãã以éã«çºçããŸããïŒïŒ
å®å
šãªnumpyãªãªãŒã¹ã®å Žåãå«ããBitGenerator
ã®æ°ãªã©ããŸã 決å®ãã¹ãããšãããã€ããããŸãã çŸåšã®å®å
šãªè£æ°ãå«ããå Žåã¯ãããã€ãã®ãªãã·ã§ã³ãé瀺ããŠããŸãã
ããæ©èœããå¥ã®æ©èœã«ç§»åãããšããéæšå¥šã¯ã管çãã¯ããã«ç°¡åã§ããããããç§ãæå±ããŠããããšã§ãã
+1åæ
ããããããã¯ã人ã ãåé¿ããŠããdefault_generatorïŒseedïŒã®ãããªãæå®ããã移åã¿ãŒã²ãããAPIãæã€åé¡ã軜æžããããšã§ãïŒããšãã°ã @ shoyerã®ããŒãžã§ã³åŒæ°ïŒã
ã¹ããªãŒã ã®äºææ§ãç¶æããããšïŒNEP 19ã¯ãããåŠèªããŸãïŒã¯ãAPIã®ç Žæã®äºæ¬¡çãªãã®ã§ãã ç°ãªãBitGeneratorã¯ç°ãªãå¹æçãªAPIãæã£ãŠããŸã
ãããä»ã§ã¯ãã£ãšçã«ããªã£ãŠããŸãã
å¥åŠãªååãåé¡ã§ããå Žåã¯ãããªã·ãŒãåãã§ããéããããããããããäžè¬çãªååã䜿çšã§ããŸãïŒæ°ããé¢æ°ãè¿œå ããå€ãé¢æ°ã«ã€ããŠèŠåãéå§ããŸãïŒã ç§ã¯ãããšåçã ãšæããŸãã ãããé »ç¹ã«è¡ãã¹ãã§ã¯ãããŸããã
ããã¯ããããŸã§ã®ãšããæåã®è§£æ±ºçã®ããã«æããŸãã ããã§æ£ããååãéžæã§ããã¯ãã§ãã ãããŠãä»ã®æ£æ°ã®ååã®å€§ããªã¹ããŒã¹ããããŸã-ç§ãã¡ããããã決ããŠå¿ èŠãšããªãã§ãããã
np.random.generator
ãnp.random.default_generator
ã
å«ããBitGeneratorã®æ°
çŸåšå«ãŸããŠãããã®ïŒMT19937ãDSFMTãPCG32ãPCG64ãPhiloxãThreeFryãXoshiro256ãXoshiro512ïŒããåé€ããå¿ èŠããããšæããããã®ãåé€ããææ¡ã§å¥ã®åé¡ãéãããšãã§ããŸããïŒ
ããã§ã¯ãŸã åé¡ã解決ããŠããŸãããã©ã®BitGeneratorãããã©ã«ãã«ããå¿
èŠããããŸããïŒçŸåšã¯Xoshiro256
ïŒ
ããŠããã®åé¡ã¯ããã©ããåºå¥ãããBitGenerator
ãšããŠå®£äŒããå¿
èŠãããããã«é¢ãããã®ã§ãããããã©ã«ãã®éžæã«åœ±é¿ããŸãããã©ã®åé¡ãå«ãããåé€ããå¿
èŠããããŸãã ããã©ã«ããæäŸããã¡ã«ããºã ïŒããã©ã«ããæäŸããå ŽåïŒã¯ããã€ãã®å¶çŽãè¿œå ããããããããã¯ãã¹ãŠãå€ããå°ãªããäžç·ã«æ±ºå®ããå¿
èŠããããã®ã§ãã ããã¯å€§ããªåä»ãªåé¡ã§ããããã®PRãã·ã§ããŒãã£ã³ã°ããããã«è¡ã£ããã¹ãŠã®äœæ¥ã®åŸã誰ãã³ãŒããæäŸããŠããªãå¥ã®ã¡ã¬ã¹ã¬ãããèŠãã®ã«ç²ããŠãããšç¢ºä¿¡ããŠããã®ã§ããèŠèãç³ãäžããŸãã :-)
ã¢ã«ãŽãªãºã èªäœã«é¢ããéããç§ã¯ãã§ã«æšå¥šäºé
ã瀺ããŠããŸãã RandomState
ãšæ¯èŒã®ããã«MT19937
ãä¿æããå¿
èŠããããæšå¥šç®çã®ããã«PCG64
奜ãã§ãã
ç§ã¯CompilerExplorerãå°ãããããŸããããçµã¿èŸŒã¿é¢æ°ã䜿çšããŠ64ãããMSVCçšã®PCG64ãå®è£
ããã³ã³ãã€ã©ãŒã«clangã®uint128_t
æ°åŠã«è¿ãã¢ã»ã³ããªãçæãããããã«ãããšæããŸãïŒhttpsïŒ// godbolt .org / z / ZnPd7Z
çŸåšãWindowséçºç°å¢ãã»ããã¢ãããããŠããªãã®ã§ãå®éã«_æ£ãã_ãã©ããã¯ããããŸãã... @ bashtageãããè©ŠããŠã¿ãŸãããïŒ
ããããªãïŒ
Uniforms per second
************************************************************
PCG64 62.77 million
ãããä»ãïŒ
Uniforms per second
************************************************************
PCG64 154.50 million
ãããã¯ã2ã€ã®ç°ãªãã·ãŒãã«å¯ŸããŠ1000uint64å€ã®åãã»ãããçæããããšãå«ããã¹ãã«åæ ŒããŸãã
GCCãã€ãã£ãããã³æ¯èŒã¢ãŒãã§ã®æ¯èŒã®å ŽåïŒ
Time to produce 1,000,000 Uniforms
************************************************************
Linux-64, GCC 7.4 PCG64 4.18 ms
Linux-64, GCC 7.4, Forced Emulation PCG64 5.19 ms
Win64 PCG64 6.63 ms
Win32 PCG64 45.55 ms
ãããŒãããã¯æ¬åœã«æªãããã§ãã ãããããæ¯èŒããŒãžã®æ å ±ãæ¡åŒµããŠãåããã·ã³ã§ã®msvc2017-on-win {64ã32}ãšgcc7.4-on-linux {64ã32}ã®ããã©ãŒãã³ã¹ã瀺ãå¿ èŠããããŸãïŒmsvc2017ã䜿çšããŠãããšä»®å®ããŸããããããã©ããã«ãã®æ å ±ãå«ããå¿ èŠããããŸãïŒã
Win32ã¯ããã§ã¯çµ¶æçã§ãã Linux 32ããããããªãã²ã©ããã®ã«ãªããšæããŸãããç°¡åã«ãã¹ãã§ãã32ãããLinuxã·ã¹ãã ããããŸããã
32ããããã·ã³ïŒäŒæ¥ã®ITããªã·ãŒã®ããã«Windowsã§ããå¯èœæ§ãé«ãïŒã«åºå·ããŠãã人ã ã«æšå¥šãè¡ãå Žåã¯ééããªãããããŸãã ãã®reccoã¯æããã§ãïŒ32ãããçšã®DSFMTïŒãŸãã¯MT19937ãè¯ãã§ãïŒã ãã ãããã³ãããŒã¯ã¯è¯ãã§ãããã
ããã䟡å€ãããããšã«ã€ããŠã¯ãç§ã¯ãè€æ°ã®ç¬ç«ããã©ã³ãã ã¹ããªãŒã ã®é »ç¹ã«ç¹°ãè¿ãããPCGã®äž»åŒµã«ããªãæççã§ãã 誰ããç¬ç«ã®äž»åŒµãè£ä»ããããã«æ·±å»ãªçµ±èšåæãããŸãããïŒ ïŒå®éããªããŒã«ã®è«æã¯ãå¥åã®ãã¹ããªãŒã ã®ã¿ã«èšåããŠãããç¬ç«æ§ã䞻匵ããŠããªããšæããŸããïŒ
æççã§ããã®ã«ã¯ååãªçç±ããããšæããŸããç¹å®ã®LCGä¹æ°ã«å¯ŸããŠããããã®åå¥ã®ã¹ããªãŒã ã¯ãã¹ãŠãã¹ã±ãŒãªã³ã°[*]ãä»ããŠåçŽã«é¢é£ä»ããããŸãã ãããã£ãŠãåãä¹æ°ãæã€2ã€ã®LCGã¹ããªãŒã ãäžããããå Žåãéå§ç¹ã¯ç°ãªããŸãããäžæ¹ã¯åã«ä»æ¹ã®å®æ°åïŒã¢ãžã¥ã2**64
ãŸãã¯2**32
ïŒã«ãªããŸãã PCGã®é åéšåã¯ãããå°ãé ãã®ã«åœ¹ç«ã¡ãŸãããçµ±èšçã«æ€åºå¯èœãªçžé¢é¢ä¿ããã£ããšããŠããå®éã«ã¯é©ãããšã§ã¯ãããŸããã
確ãã«ãå¥åã®ã¹ããªãŒã ã§ãããããã€ãã®æ·±å»ãªãã¹ãããªããã°ãç¬ç«ããã¹ããªãŒã ãé¡é¢ã©ããã«äž»åŒµããããšã¯ã§ããŸããã
[*]äŸïŒ x[0], x[1], x[2], ...
ãx[i+1] := (m*x[i] + a) % 2**64
æšæº64ãããLCGã¹ããªãŒã ã§ãããšããŸãã ãã¹ãŠã®i
y[i] := 3*x[i] % 2**64
ãèšå®ããŸãã ãã®å Žåã y[i]
ã¯y[i+1] := (m*y[i] + 3*a) % 2**64
LCGã¹ããªãŒã ã§ãããããå
ã®ã¹ããªãŒã ãã¹ã±ãŒãªã³ã°ããã ãã§ãåãä¹æ°ã§ç°ãªãå æ³å®æ°ãæã€ãããã®ç°ãªãLCGã¹ããªãŒã ã®1ã€ãçæã§ããŸãã 3
代ããã«ä»ã®å¥æ°ä¹æ°ã䜿çšããå
šæéã®LCGã®ã¿ã«é¢å¿ããããšä»®å®ãããšïŒãããã£ãŠã a
ã¯å¥æ°ã§ãïŒãå¯èœãªãã¹ãŠã®å®å
šãª-ãååŸããŸãããã®ä¹æ°ãæã€æéLCGã
ç·šéïŒå ±åœ¹é¡ã®æ°ã«é¢ãã誀ã£ãèšè¿°ãä¿®æ£ããŸããã
PCGã¹ããªãŒã ã®æã培åºçãªå ¬éåæã¯ããã«ãããšæããŸãïŒ http ïŒ
@imnemeæçµçãªã¢ããã€ã¹ãæ¡åŒµã§ããŸããïŒ ãDavidBlackmanãšã®éä¿¡ã¯ãäžå®ã®ã·ãŒãã1,2,3,4ã®ã¹ããªãŒã ãªã©ãçžé¢ã®ããåæåã䜿çšããŠãè¿ãã®ãã¹ããªãŒã ãäœæããæ¹ãæã£ããããç°¡åãããããªãããšã瀺ããŠããŸããã§è€æ°ã®ã¹ããªãŒã ã䜿çšããå Žååæã«ãä»ã®ãšãããã¹ããªãŒã IDãšã·ãŒããåºå¥ããçžäºã«æ確ãªçžé¢é¢ä¿ãæããªãããã«ããããšããå§ãããŸããã€ãŸããäž¡æ¹ã1,2,3,4ã«ããªãã§ãã ãããã
ããã¯ãåäžã®é©åãªã·ãŒãïŒããšãã°ããšã³ããããŒãœãŒã¹ãã掟çïŒãååŸããŠããID 1ã2ã3ã4ãã¹ããªãŒã ããŠãåé¡ãªããšèããããšãæå³ããŸããïŒ ãŸãã¯ãã·ãŒãIDãšã¹ããªãŒã IDã®äž¡æ¹ããé©åãªãšã³ããããŒãœãŒã¹ããã©ã³ãã ã«éžæããå¿ èŠããããŸããïŒ
äžéšã®Linux-32ïŒUbuntu 18.04 / GCC 7.4ïŒçªå·
Time to produce 1,000,000 Uniforms
***************************************************************
Linux-64, GCC 7.4 PCG64 4.18 ms
Linux-64, GCC 7.4, Forced Emulation PCG64 5.19 ms
Win64 PCG64 6.63 ms
Win32 PCG64 45.55 ms
Linux-32, GCC 7.4 PCG64 25.45 ms
ãããã£ãŠãWin-32ã®2åã®é床ã§ãããäœéã§ãã 4ã€ã®ã¿ã€ãã³ã°ã¯ãã¹ãŠåããã·ã³ã§è¡ãããŸãã
Other Linux-32/GCC 7.4 Timing Results
-----------------------------------------------------------------
DSFMT 6.99 ms
MT19937 13.09 ms
Xoshiro256 17.28 ms
numpy 15.89 ms
NumPyã¯NumPy1.16.4ã§ãã DSFMTã¯ã32ãããïŒx86ïŒã§åªããããã©ãŒãã³ã¹ãçºæ®ããå¯äžã®ãžã§ãã¬ãŒã¿ãŒã§ãã ããã¯ã32ããããŠãŒã¶ãŒã«å¯ŸããŠæ確ã«ææžåããå¿ èŠããããŸãã MT19937ã¯ã32ããããŠãŒã¶ãŒã«ãšã£ãŠãæ¯èŒçè¯ãéžæã§ãã
ãããã£ãŠãã¬ã¬ã·ãŒç®çã®ããã«MT19937
ãå¿
èŠã§ãã ã©ã®PRNGãå«ãããïŒã€ãŸãã MT19937
ãšåäžã®æ±çšæšå¥šïŒãæå°éã«æãããå Žåã¯ã32ãããããã©ãŒãã³ã¹ã䜿çšããŠåäžã®æ±çšæšå¥šãå¶éããå¿
èŠã¯ãããŸããã 3çªç®ã®ã32ãããã«æšå¥šãPRNGãè¿œå ããããåŸãªããšæããŠããŸãã MT19937
ã¯åžžã«å©çšå¯èœã§ãããçŸåšã®ç¶æ
ãããæªãã¯ãããŸããã ãããŠããµãŒãããŒãã£ã®ããã±ãŒãžã¯ãããããããªçšéã«å©çšã§ããããã«ãªããŸãã
ãã¡ãããä»ã®çç±ã§ããå®å šãªPRNGã®ã»ãããå«ãããå Žåã¯ãããã¥ã¡ã³ãã«ããããçš®é¡ã®ç¹å®ã®æšå¥šäºé ãå«ããããšãã§ããŸãã
PCGã®ãPãéšåãçžé¢ã¹ããªãŒã ããã®æœåšçãªåé¡ãã©ã®çšåºŠè»œæžããã®ãèå³ããããŸããã
ãããã£ãŠããããïŒããããïŒLCGã®ææªã®ã±ãŒã¹ã§ããäžæ¹ã®LCGã¹ããªãŒã ã®å æ³å®æ°ã¯ãããäžæ¹ã®å æ³å®æ°ã®æ£ç¢ºãªåŠå®ã§ãã 次ã«ãé©åã«ã²ã©ãã·ãŒãã®éžæãè¡ããšãLCGã¹ããªãŒã ã®1ã€ãä»ã®ã¹ããªãŒã ã®æ£ç¢ºãªåŠå®ã«ãªãããšã«ãªããŸãã
ããããäž¡æ¹ã®ã¹ããªãŒã ã䜿çšããŠäžé£ã®floatãçæããŠããå ŽåãPCGã®é åéšåãšfloat64ãžã®å€æã®äž¡æ¹ãå°ã圹ç«ã€ã¯ãã§ãã
ããã¯ãé åãã©ãã ã圹ç«ã€ãã瀺ãããããã§ãã
ããã¯ããã®ãããª1ã€ã®ã¹ããªãŒã ããã®10000ãããŒãã®æ£åžå³ã§ãããåŠå®ããããã€ã³ããã®10000ã«å¯ŸããŠã§ãã ã²ã©ãããã§ã¯ãããŸããããçŽ æŽããããã®ã§ããããŸãããæãããªéºç©ããããŸãã
ããããäœãçµè«ä»ãããããããªãïŒããã¯çµ¶å¯Ÿã«äžèªç¶ãªäŸã§ãããå¶ç¶ã«ééããå¯èœæ§ã¯äœãïŒç§ã¯é¡ã£ãŠããŸãïŒã äžæ¹ãçžé¢ã®ãªãè€æ°ã®ã¹ããªãŒã ãæ¬åœã«å¿ èŠãªå Žåã¯ãããçšåºŠã®èæ ®ãšæ³šæãå¿ èŠã§ããããšã瀺ããŠããŸãã
èšé²ã®ããã«ãããã«ãœãŒã¹ããããŸãïŒ
import matplotlib.pyplot as plt
import numpy as np
from pcgrandom import PCG64
gen1, gen2 = PCG64(), PCG64()
multiplier, increment, state = gen1._get_core_state()
new_increment, new_state = -increment % 2**128, -state % 2**128
gen2._set_core_state((multiplier, new_increment, new_state))
xs = np.array([gen1.random() for _ in range(10**4)])
ys = np.array([gen2.random() for _ in range(10**4)])
plt.scatter(xs, ys, s=0.1)
plt.show()
PCG64ã¯ãO'NeillãPCG-XSL-RRïŒPCGããŒããŒã®ã»ã¯ã·ã§ã³6.3.3ïŒãšåŒã¶ãžã§ãã¬ãŒã¿ãŒã§ãã pcgrandom
ããã±ãŒãžã¯ãã¡ããã
ç¬ç«ããã¹ããªãŒã ãååŸããæšæºçãªæ¹æ³ã¯ãjumpaheadïŒïŒã䜿çšããããšã ãšæããŸããã
ãç¬ç«ãããã¹ããªãŒã ãååŸããããã«åã·ãŒãããããšã¯ãäžè¬çã«å±éºã§ãã
ã«ãŠã³ã¿ãŒ/ããã·ã¥ãžã§ãã¬ãŒã¿ãŒã«ã¯ç°¡åãªjumpaheadïŒïŒããããŸãã PCGã¯ãããŸããïŒ
ãŸãããŠãŒã¶ãŒããã®åé¡ïŒå°ãªããšã1ã€ã®ãããã¹ããªãŒã ãæäŸããŠãã ãã
ç¡å¶éã®ç¶æ
空éãæã€æå·å質ã
也æ¯ã
ãã£ãªãã
ïŒsebergã«ããç·šéïŒé»åã¡ãŒã«ã®èŠç©ãããåé€ïŒ
@pbstark ïŒããã¯åã·ãŒãã ãã§ã¯ãããŸããã2ã€ã®åºç€ãšãªãLCGãžã§ãã¬ãŒã¿ãŒã¯å®éã«ã¯ç°ãªããŸããç°ãªãå¢åaãšbã®
ããããLCGã®åçŽãã¯ããã®å ç®å®æ°ãå€æŽãããšãå ã®ãžã§ãã¬ãŒã¿ãŒã§æªç¥ã®éã ããžã£ã³ãã¢ãããã«ãªããåçŽãªç·åœ¢å€æïŒå®æ°ã«ããä¹ç®ããŸãã¯å Žåã«ãã£ãŠã¯å®æ°ã®å ç®ïŒãšçµã¿åããããããšãæå³ããŸãã
PCGã䜿çšããªãçç±ã§ã¯ãªããNumPyã®æ°ããã¡ã€ã³PRNGã«ã¯é©ããŠããªãããšãç§ã¯ä»ã®ãšãã䞻匵ããŠããŸããã ãç¬ç«ãããã©ã³ãã ã¹ããªãŒã ã®çŽæã«äººã ãå·»ã蟌ãŸããŠã»ãããªãã ãã§ãã ãããããPCGã®èšå®å¯èœãªã¹ããªãŒã ã®ã¢ã€ãã¢ã¯ãã¯ã€ãã¯ãžã£ã³ãã¢ãããã«å ããŠãè¿œå ã®ä¹æ³å€æãŸãã¯å æ³å€æã®ããŒãã¹ãšåçã®ããšãè¡ãããã®äŸ¿å©ãªæ¹æ³ãæäŸããŸãã
ã³ãã¥ããã£ã³ãŒã«ã§æå·åã«ã€ããŠå°ã話ãåããŸããã å°ãæ éã ã£ããšæããŸãã è¯ãã¢ã€ãã¢ã®ããã«æããŸãããæå·åãããå¥å šãªRNGãå«ããå ŽåããŠãŒã¶ãŒãå®éã®æå·åã®ç®çã§ãããã䜿çšãããã©ããããããªããããçºçããã»ãã¥ãªãã£ã®åé¡ã«ã察å¿ããå¿ èŠããããŸãã
å«ããæ°ã«ã€ããŠïŒã³ã³ã»ã³ãµã¹ã¯ãããããžã§ãã¬ãŒã¿ãŒãããã«ããã€ãé 眮ããããšã§åé¡ããªãåŸåããããŸããïŒãã¡ãããããã€ãã®å°ããªããã¥ã¡ã³ããé©ããŠããŸãïŒã ã¡ã³ããã³ã¹ã®è² æ ã¯ããã»ã©å€§ãããªãããã§ãã çµå±ãç§ã®æšæž¬ã§ã¯ãã±ãã³ãšãããŒããææ¡ãããã®ã¯äœã§ãäžç·ã«è¡ãã§ãããã
ååã«ã€ããŠïŒç§ã¯å人çã«RNGåã䜿çšããŠããŠãŒã¶ãŒã«ãããã䜿çšãããããšãæ°ã«ããŸãããå¯äžã®æ¬ ç¹ã¯ãã³ãŒãã£ã³ã°äžã«ååãæ€çŽ¢ããªããã°ãªããªãå¯èœæ§ãããããšã§ãã éæšå¥šã®èŠåã¯ã§ããã ãå°ãªãããããã«ããŠãã ããã ã·ãŒããªãã®ããã©ã«ãRNGã®æå°éã®å ¬éAPIã奜ãã§ãã
@mdickinson ãç§ã¯ããªãã®ã°ã©ããèªåã§åçŸããããšããŸããã倱æããŸããã ç§ã¯ãã®ããã°ã©ã ã§æ£èŠã®C ++ããŒãžã§ã³ã®ã³ãŒãã䜿çšããŸã
#include "pcg_random.hpp"
#include <iostream>
#include <random>
int main() {
std::random_device rdev;
pcg_detail::pcg128_t seed = 0;
pcg_detail::pcg128_t stream = 0;
for (int i = 0; i < 4; ++i) {
seed <<= 32;
seed |= rdev();
stream <<= 32;
stream |= rdev();
}
pcg64 rng1(seed,stream);
pcg64 rng2(-seed,-stream);
std::cerr << "RNG1: " << rng1 << "\n";
std::cerr << "RNG2: " << rng2 << "\n";
std::cout.precision(17);
for (int i = 0; i < 10000; ++i) {
std::cout << rng1()/18446744073709551616.0 << "\t";
std::cout << rng2()/18446744073709551616.0 << "\n";
}
}
ãããå®è¡ãããšã次ã®ããã«åºåãããŸãïŒåçŸæ§ã確ä¿ããããïŒã
RNG1: 47026247687942121848144207491837523525 203756742601991611962280963671468648533 41579532896305845786243518008404876432
RNG2: 47026247687942121848144207491837523525 136525624318946851501093643760299562925 52472962479578397910044896975270170620
次ã®ã°ã©ããããããã§ããããŒã¿ãã€ã³ãïŒ
ç§ãéã£ãããæ¹ã§äœãããŠããã®ãç解ã§ããã°ãããã¯åœ¹ã«ç«ã¡ãŸãã
ïŒçžé¢ãå¯èœã§ãããšããèãã«åè«ããããã«ãããèšã£ãŠããã®ã§ã¯ãªãããããã¯ã«ã€ããŠå¥ã®ã³ã¡ã³ããæžããŸããããã®ã³ã¡ã³ããæžããŠãããšãã«ã䜿çšããŠçµæãåçŸã§ããªãããšã«æ°ã¥ããŸããç§ã®ãã€ãã®ããŒã«ãïŒ
@mdickinsonã¯èšç®ãããç¶æ ã§ãã³ãããå éšã«çŽæ¥ã€ã³ã¯ãªã¡ã³ããã2ã€ã®ã¹ãããããéåžžã®åæåã«ãŒãã³ããã€ãã¹ããŸãã
ããŸããŸãªæ¹æ³ã§æ§ç¯ãããè€æ°ã®PCG32ã¹ããªãŒã ãã€ã³ã¿ãŒãªãŒãããŠãPractRandã«ãã£ãŒãããç°¡åãªå°ããªãã©ã€ããŒã¹ã¯ãªãããmaster
ã®numpyã䜿çšããŸããæµå¯Ÿçãªå
éšç¶æ
/å¢åãçŽæ¥ãã³ããããšãPractRandã¯ããã«å€±æããŸãã æµå¯Ÿçãªç¶æ
ãéæããããã«ãæµå¯Ÿçãª_seeds_ïŒå®éã«ã¯åæåã«ãŒãã³ãééããïŒãèŠã€ããåççãªæ¹æ³ãèŠã€ããããšãã§ãããã©ããã¯ç§ã«ã¯ããããŸããã
åè¿°ã®ç§ã®ããã°æçš¿ã§è¿°ã¹ãããã«ã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ã·ãŒã±ã³ã¹ã§æ··åããããšã§ããïŒ
ç§ã¯å°é家ã§ã¯ãããŸããããæå·åã®é¢ã§ã¯ã次ã®å Žæã§ã¯å©çšã§ããªãææ¡ããããŸãã
https://cryptography.io/en/latest/ Python Cryptographic AuthorityããïŒ
ä¹±æ°çæã«é¢ãã圌ãã®ããŒãžã«ãèšåãããŠããŸãïŒ
Python 3.6以éãæšæºã©ã€ãã©ãªã«ã¯ãæå·çã«å®å šãªä¹±æ°ãçæããããã«äœ¿çšã§ããã·ãŒã¯ã¬ããã¢ãžã¥ãŒã«ãšãããã¹ãããŒã¹ã®åœ¢åŒçšã®ç¹å®ã®ãã«ããŒãå«ãŸããŠããŸãã
å€åãäžä»£ã«é åãè¿œå ããŠãããšæããŸãã ã¯ãªãã°ã©ãã£ãã¯ã®å ç¢æ§ã«é¢é£ããæœåšçãªã¡ã³ããã³ã¹ã®è² æ ã¯ãNumPyã§æ¬åœã«äŸ¡å€ããããé©åã§ãããã©ããçåã«æãå¿ èŠããããŸãã ããµããšã«ã¯ä»¥åã«åæ§ã®æžå¿µã«ã€ããŠèšåãããšæããŸãã
å®éãæœåšçãªdtypeãªãã¡ã¯ã¿ãªã³ã°/æ¡åŒµæ©èœã®ãããªãã®ããå€çš®å€æ§ãªç¹æ®ãªæ°ããã¢ããªã±ãŒã·ã§ã³ãç¶æããè² æ ãå¿ ãããè² ãããšãªããAPIã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããããã«èšèšãããŠããããã«æãããŸãã
ãšããã§ã Vignaã®PCGæ¹è©[ç¹ã«ãã®ã»ã¯ã·ã§ã³]ãžã®ç§ã®å¿çã§ã¯èª¬æããŠããŸãã ããã§èŠ³å¯ããã®ã¯ãPCGã¯è·é¢é¢æ°ãæã£ãŠããã®ã§ãå®éã«è·é¢é¢æ°ã§ç¢ºèªããŠãäžèªç¶ãªçš®åãæ€åºã§ãããšããããšã§ãã è·é¢é¢æ°ã®ãªãPRNGã§ããéžæãäžé©åãªã·ãŒããã¢ãèæ¡ã§ããŸããïŒç¹ã«ãã·ãŒãçšã®ãããªãã¯APIããã€ãã¹ããŠããå ŽåïŒãæãé²éªšãªå·¥å€«ã§ããæ€åºã§ããã¡ã«ããºã ã¯æäŸãããŠããŸããã
äžæ¹ã§ã¯ããæ°ã«å ¥ãã®ïŒãŸãã¯æãå«ããªïŒPRNGãååŸããŠãé¢çœãããšãã²ã©ãããšïŒããšãã°ããã®ç çåŠïŒãå®è¡ã§ããããã«ããããã®ã·ãŒããèæ¡ããããšãå¯èœãã©ãããèããã®ã¯æ¥œããã§ã...
ããããå šäœåãèŠããšãå®éã«ãŠãŒã¶ãŒãçŽé¢ããŠããåé¡ãèŠãã®ã¯çã«ããªã£ãŠãããšæããŸãã ã»ãšãã©ã®ãŠãŒã¶ãŒã¯ã_ãã¹ãŠã®PRNGïŒéå»ããã³å°æ¥ïŒ_ã«ã€ããŠã32ãããã·ãŒãã絶察ã«ã²ã©ãèãã§ãããã©ã®PRNGã䜿çšãããŠããŠãããã€ã¢ã¹ãç°¡åã«æ€åºã§ããããšãèªèããŠããŸããã 確ãã«ãç§ãã¡ã¯ãããäžæãã代ããã«èª°ããã¡ã«ã»ã³ããã€ã¹ã¿ãŒãã»ãŒãŒãã®ç¶æ ïŒãŸãã¯LFSRããŸã£ããæ©èœããªããã¹ãŠãŒãã®ç¶æ ïŒïŒã«åæåã§ãããã©ããããŸãã¯èª°ãããããããããããªããã©ãããå¿é ããããšã«æéãè²»ããããšãã§ããŸãXoshiroã11åã®åºåã®ã¹ããŒã¹ã§åãåºåã7åç¹°ãè¿ããã€ã³ãã®è¿ãã«åæåãããã2ã€ã®åæ§ã®PCGã¹ããªãŒã ãèæ¡ãããªã©ã§ããããããã®ãã¹ãŠã®å·¥å€«ã¯ããžã§ãã¬ãŒã¿ãŒãçºçããå Žåãåºæ¬çã«åŸ®å°ïŒå®éã«ã¯ãŒãïŒã®å¯èœæ§ããããŸãã©ã³ãã ããŒã¿ãã·ãŒããããŠããŸãã ãããã®è»¢æã¯ç¥çã«é åçã§åŠè¡çã«èå³æ·±ããã®ã§ãããããŒããçããŠããéããŠãŒã¶ãŒãã·ãŒãã«é¢ããŠäœãããŠããã®ãã»ãšãã©ããããªããšããäºå®ãã»ãšãã©ç¡èŠããªããããããã«ã€ããŠèããŸãã
inc=1,2,3,4
ãæªãèãã§ããå Žåãããã¯éåžžã«æ確ã«ææžåããå¿
èŠãããããšã瀺åããŠããã®ã§ã¯ãªãã§ããããããããšããããã«ç°ãªãAPIã䜿çšããå¿
èŠãããã®ã§ããããã ãã¶ãnew_generator = (Bit)Generator().independent()
ã§ãããïŒåºç€ãšãªãïŒããããžã§ãã¬ãŒã¿ãŒããããéæããããã®åªããæ¹æ³ãæäŸããªãå Žåã¯ãèŠåãåºãããšãã§ããŸãã
ãŸãã32ãããã·ãŒãã®æªãã«ããããŸããã ã·ãŒããäœæããŠä¿åããããªãŒãºããããã®åªããAPIãèããããŸããïŒ ç§ã¯ç¥ããªãã ãã¶ãããåçµãããã·ãŒããã£ãã·ã¥ãã¡ã€ã«ãååšããªãå Žåã¯äœæãããããšãããããŸãã
PCGã®å Žåãã·ãŒã-> uint64_t [2]-> splitmix64ïŒseed_by_arrayïŒ-> uint128ãå®è¡ããã ãã§ãäœãé£ç¶ããã·ãŒãã確å®ã«åæ£ãããŸãã
PCGã®å Žåãã·ãŒã-> uint64_t [2]-> splitmix64ïŒseed_by_arrayïŒ-> uint128ãå®è¡ããã ãã§ãäœãé£ç¶ããã·ãŒãã確å®ã«åæ£ãããŸãã
ãŸãã¯ãé©åãªæŽæ°ããã·ã¥ã䜿çšããŸãã ïŒããã¯å šåå°ã§ãªããã°ãªããŸãããïŒ å®ããŠçããã®ããããããããŸãã MultiplyâXorShiftãæ°åå®è¡ããŠãåé¡ãããŸããã
@mdickinsonã®ææã«äžèªç¶ãª/æµå¯Ÿçãªèšå®ã®å°ããªã»ããã«å¶éãããŠããããšãå°ã説åŸããããšæã£ãŠããŸãã ãã®å Žåã¯ãé©åãªæ¹æ³ã§è§£æ±ºããŠããã®ãããªã€ã³ã¹ã¿ã³ã¹ãé²ãããšãã§ããŸãã ç§ãã¡ãæã£ãŠããçŸåšã®ã³ãŒãã§ã¯ããŠãŒã¶ãŒãçŸåšã®APIã§ç°¡åã«é¥ãå¯èœæ§ã®ããããã€ãã®æªãç¶æ
ããããŸãã seed=1
ãšinc=0,1,2,...
äž¡æ¹ãèšå®ãããšãçžé¢é¢ä¿ãäœæããããšããDavidBlackmanã®çºèŠã確èªã§ããŸãã ã€ã³ã¿ãŒãªãŒããããPCG32ã¹ããªãŒã çšã®ææ°ã®PractRandãã©ã€ããŒã䜿çšããŠããããå®èšŒã§ããŸãã
⯠./pcg_streams.py --seed 1 --inc 0 |time ./RNG_test stdin32
[
{
"bit_generator": "PCG32",
"state": {
"state": 12728272447693586011,
"inc": 1
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 7009800821677620407,
"inc": 3
}
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0x470537d5
test set = normal, folding = standard (32 bit)
rng=RNG_stdin32, seed=0x470537d5
length= 128 megabytes (2^27 bytes), time= 4.0 seconds
Test Name Raw Processed Evaluation
BCFN(2+0,13-3,T) R= +9.6 p = 2.3e-4 mildly suspicious
...and 116 test result(s) without anomalies
rng=RNG_stdin32, seed=0x470537d5
length= 256 megabytes (2^28 bytes), time= 8.7 seconds
Test Name Raw Processed Evaluation
BCFN(2+0,13-2,T) R= +26.1 p = 6.3e-13 FAIL
...and 123 test result(s) without anomalies
./RNG_test stdin32 8.86s user 0.11s system 93% cpu 9.621 total
ç§ã¯ãŸã ã©ã³ãã ã·ãŒãã§å€±æã«ééããŠããŸããããåãè¿ãå¢åã§ãã ææ¥ãã§ãã¯ã€ã³ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã§äœãæå®ãããŠããªãå Žåãæšå¥šãããããã©ã«ãã®å¢åã䜿çšããŠããªãããšã«æ°ä»ããŸããã ãããããããä¿®æ£ããå¿
èŠããããŸãã ãã¶ãããã¯ã 2*inc + 1
ã§ã¯ãªããæå®ãããã¹ããªãŒã IDããå®éã®å¢åãå°åºããããã®é©åãªããŒã¹çªå·ã«ãªããŸãã
人ã ãããã©ã«ãã®ãšã³ããããŒã·ãŒãã䜿çšããŠããããä¿åããã®ãæ¯æŽããããã®ããŒã«ãæ§ç¯ããããšãè©Šã¿ãããšãã§ããŸãã ç§ãæã£ãŠãã1ã€ã®è³ªåã¯ãè€æ°ã®ã¹ããªãŒã ã®å¢åãç°¡åã«çæã§ããã®ãããããšããšã³ããããŒãµã³ããªã³ã°ããŠä¿åããå¿ èŠãããã®ãââãšããããšã§ãã ã·ãã¥ã¬ãŒã·ã§ã³ã®ãåæç¶æ ãããäžéæãªãã¡ã€ã«ã§ã¯ãªããååã®é»åã¡ãŒã«ããã³ããŒããŠè²Œãä»ããããšãã§ããåäžã®æ°å€ãšããŠãšã³ã³ãŒãã§ãããšéåžžã«äŸ¿å©ã§ãã ç¶æ ã128ããããŸãã¯256ããããããªããããã®å°ããªPRNGã䜿çšãããšãããã16é²æ°ã§ãã°ãã¡ã€ã«ã«ç°¡åã«åºåããè€è£œããããšãã«ã³ãã³ãã©ã€ã³ã«ã³ããŒã¢ã³ãããŒã¹ãããã ãã§ãã 32ãããæŽæ°ããã倧ããã§ããã管çããããã§ãã ãã¹ãŠã®ã¹ããªãŒã IDããšã³ããããŒãµã³ããªã³ã°ããå¿ èŠãããå Žåã¯ããããå¿ããŠããã¹ãŠãç¶æ ãã¡ã€ã«ã®ã©ããã«èšé²ããå¿ èŠããããŸãã ããã«ãããæ°ããã¹ããªãŒã ãåçã«çæããå Žåã«èª¬æããããã€ãã®ãŠãŒã¹ã±ãŒã¹ãæé€ãããå¯èœæ§ããããŸãã ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããŠé©åãªã¹ããªãŒã IDãååŸã§ããå ŽåïŒã«ãŠã³ã¿ãŒã®ããã·ã¥ãªã©ããååŸã§ããå ŽåïŒãã¹ããªãŒã IDã§ã¯ãªããåæã·ãŒãã®ã¿ãèšé²ããå¿ èŠããããŸãã
IIRCãã·ãŒã¯ã¬ããã¢ãžã¥ãŒã«ã¯OSã®ãšã³ããããŒãœãŒã¹ãåŒã³åºããŸãã
äžéšã®ã·ã¹ãã ã§ã¯äžè¯ã§ãããè€è£œ/åçŸå¯èœã§ã¯ãããŸããã
15:19ã¿ã€ã©ãŒã»ã¬ãã£ã®æ°Žææ¥ã2019幎5æ29æ¥ã«ã¯[email protected]
æžããŸããïŒ
ç§ã¯å°é家ã§ã¯ãããŸããããæå·åã®é¢ã§ã¯ãææ¡ãããŠããã®ã¯
ã§å©çšã§ããŸããïŒ
https://cryptography.io/en/latest/ Python CryptographicAuthorityãã
https://github.com/pyca ïŒä¹±æ°çæã«é¢ãã圌ãã®ããŒãž
https://cryptography.io/en/latest/random-numbers/ãèšåããŠããŸãïŒPython 3.6以éãæšæºã©ã€ãã©ãªã«ã¯ç§å¯ãå«ãŸããŠããŸã
https://docs.python.org/3/library/secrets.htmlã¢ãžã¥ãŒã«ã
æå·çã«å®å šãªä¹±æ°ãçæããããã«äœ¿çšãããŸãã
ããã¹ãããŒã¹ã®ãã©ãŒãããã®ãã«ããŒãå€åãäžä»£ã«é åãè¿œå ããŠãããšæããŸãã ç§ã¯çåã«æãå¿ èŠããããŸã
ã¯ãªãã°ã©ãã£ãã¯ã«é¢é£ããæœåšçãªã¡ã³ããã³ã¹ã®è² æ
å ç¢æ§ã¯æ¬åœã«äŸ¡å€ããããNumPyãšèšãã®ã«é©åã§ã
pycaãšéä¿¡ãããããããµãŒãããŒãã£ã«ã€ããŠèããŸã
ãã®ããã®ãžã§ãã¬ãŒã¿/ãã©ã°ã€ã³ã ããµããšã«ãåæ§ã®æžå¿µã«ã€ããŠèšåãããšæããŸã
以åã確ãã«ãæœåšçãªdtypeãªãã¡ã¯ã¿ãªã³ã°ã®ãããªãã®/
æ¡åŒµæ©èœã¯ãAPIã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããããã«ãèšèšãããŠããŸãã
å¿ ç¶çã«å€çš®å€æ§ãªãã®ãç¶æããè² æ ãè² ã
ç¹æ®ãªæ°ããã¢ããªã±ãŒã·ã§ã³ãâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWKXSSTX6QI7HJ65GYTPX36O3A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWKGZMUB67VPCMFZYGTPX36O3ANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
@tylerjereddyãããã¯ãæ»æè
ïŒããã³ããªãïŒïŒãäºæž¬ã§ããªãç©çãšã³ããããŒãœãŒã¹ããå°éã®ã©ã³ãã ããããååŸããããã®ãã®ã§ãã ãããã¯ãåæåãã¯ãã«ããã³ã¹ãããŒãªã©ããã¹ãŠçãæå·åã§äœ¿çšãããŸãã ãããã®èŠç¹ã¯ãããããåçŸããæ¹æ³ããªããšããããšã§ããããã¯ã np.random
ã®æ°å€ã·ãã¥ã¬ãŒã·ã§ã³ã®ç®çãšã¯çžå®¹ããŸããã ãã®ããŒãžã§ã¯ãæå·çã«å®å
šãªPRNGã«ã€ããŠã¯èª¬æããŠããŸããããããååšãã cryptography
ããã±ãŒãžã§å©çšå¯èœãªããªããã£ãããæ§ç¯ã§ããŸãã ãã ãã_practice_ã§ã¯ãå¹ççãªCã³ãŒãã§ãã§ã«å©çšå¯èœãªã¢ã«ãŽãªãºã ã®ããè¯ãå®è£
ããããŸããå°ãªããšããã·ãã¥ã¬ãŒã·ã§ã³ã®ç®çã§å®åŒåããã³ãã¹ãããããã®ã§ãã @bashtageã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã«
ãŸãã @ pbstarkãææ¡ããŠããã®ã¯ãæå·ããŒã¹ã®PRNGã ãã§ã¯ãªãããšãnumpyããŒã ã«æ確ã«ããããšæããŸãã ãããã圌ã¯_unbounded state_ãåãããã®ãæãã§ããŸããããã¯ã圌ãæ¢ããŠããæ°åŠçç¹æ§ãæäŸããŸãã
äžè¬çã«ã·ãã¥ã¬ãŒã·ã§ã³ããããã«èæ
®ãããŠããæå·ããŒã¹ã®PRNGã®å€§åã¯ã_not_ã¯@pbstarkãæãã§ããããšãç¡å¶éç¶æ
ãæã£ãŠããŸãã ãããã¯éåžžãæéã«ãŠã³ã¿ãŒã®æå·åã«åºã¥ããŠããŸãã ãã®ã«ãŠã³ã¿ãŒãå転ãããšãæéã®æéã«éããŸãã æè¡çã«ã¯ã圌ã®cryptorandom
ã¯ãåºå®ãµã€ãºã®256ããããã€ãžã§ã¹ãç¶æ
ãšåºå®ãµã€ãºã®64ãããé·ã«ãŠã³ã¿ãŒã«ããã 2**(256+64)
åºæã®åææ¡ä»¶ã«ãå¶éãããŸãã ããã¯ãããããé·ãã«ãŠã³ã¿ãŒãä»»æã®ãµã€ãºã«ããããšã§ãçã«ç¡å¶éã®PRNGãå®è£
ããæ¹æ³ã瀺ããŠããŸããããã®ãããªã¢ã«ãŽãªãºã ãå
¬éãŸãã¯ãã¹ããããã®ãèŠãããšããããŸããã
äžæ¹ãä»»æã®ãµã€ãºã®ç¶æ ãæã€PRNGã¢ã«ãŽãªãºã ãå¿ èŠãªå Žåã¯ãæåã«å¿ èŠãªãã®ãããäžã«åºå®ããããã®ã ãã§ã PCGã®æ¡åŒµãžã§ãã¬ãŒã¿ãŒããã®ã¿ã¹ã¯ã«é©ããŠããŸãã ãããã¯æããã«CS-PRNGã§ã¯ãããŸããããå®éã«ã¯ããªã³ããã³ãã§å·šå€§ãªç¶æ 空éãæã¡ãããšãã@pbstarkã®èŠæãæºãããŸãã ããã§ããããããnumpyã«å«ããããšã¯ãå§ãããŸããã
æšæºã®æçCS-PRNGã«ã¯ä»ã«ãå¿ èŠãªããããã£ããããŸããããããã¯ç°¡åãªããã©ã«ãã®IMOã§ã¯ãããŸããã
Cryptorandomã®ç¶æ
空éã¯256ãããããã·ã¥ã§ã¯ãããŸãããç¡å¶éã§ãã ã¶ã»
ã·ãŒãç¶æ
ã¯ä»»æã®é·ãã®æååã§ãããæŽæ°ã®ãã³ã«ãŒããè¿œå ãããŸã
çŸåšã®ç¶æ
ã«ã ç¡å¶éã®æŽæ°ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããšã
åãããšãæãéããã æåã¯ãããå®è£
ããŸãããã
ããå¹ççãªæŽæ°ãå¯èœã«ãªããããå¢åã§ã¯ãªãè¿œå
åç¶æ
ãæåããããã·ã¥ããããããã€ãžã§ã¹ãïŒé¡èãªã¹ããŒãã¢ããïŒã
19:26ãããŒãã»ã«ãŒã³ã®æ°Žææ¥ã2019幎5æ29æ¥ã«ã¯[email protected]
æžããŸããïŒ
@tylerjereddyhttps ïŒ//github.com/tylerjereddyãããã¯ååŸããããã®ãã®ã§ã
ç©çãšã³ããããŒãœãŒã¹ããã®å°éã®ã©ã³ãã ããã
æ»æè ïŒãããŠããªãïŒïŒã«ã¯äºæž¬ã§ããŸããã ãããã¯æå·åã§äœ¿çšãããŸã
åæåãã¯ãã«ããã³ã¹ãããŒãªã©ããã¹ãŠçããã®ã§ãã ã¶ã»
ãããã®èŠç¹ã¯ãããããåçŸããæ¹æ³ããªããšããããšã§ãã
np.randomã®æ°å€ã·ãã¥ã¬ãŒã·ã§ã³ã®ç®çãšã®ãªããºã ãã®ããŒãžã¯
åçŸæ§ã®ããæå·çã«å®å šãªPRNGã«ã€ããŠã¯è©±ããŠããŸããã
ååšããããªããã£ãããæ§ç¯ã§ãããã®ã§ããããŸã
æå·åããã±ãŒãžã§å©çšã§ããŸãã ãããå®éã«ã¯ã
ã§ãã§ã«å©çšå¯èœãªãããã®ã¢ã«ãŽãªãºã ã®ããè¯ãå®è£
å¹ççãªCã³ãŒããå°ãªããšãå®åŒåããã³ãã¹ãããããã®
ã·ãã¥ã¬ãŒã·ã§ã³ã®ç®çã§ã @bashtagehttps ïŒ//github.com/bashtageãå®è£ ãããŸãã
ããã€ãã®https://github.com/numpy/numpy/issues/13635#issuecomment-496287650
ãã®ãã¬ãŒã ã¯ãŒã¯ã®ããã«ããŸãã@ pbstarkãäœã§ããããnumpyããŒã ã«æ確ã«ããããšæããŸã
https://github.com/pbstarkãææ¡ããŠããã®ã¯ãæå·ããŒã¹ã ãã§ã¯ãããŸãã
PRNGã ãããã圌ã¯ç¡å¶éã®ç¶æ ã
圌ãæ¢ããŠããæ°åŠçç¹æ§ãã·ãã¥ã¬ãŒã·ã§ã³ã§äžè¬çã«èæ ®ãããŠããæå·ããŒã¹ã®PRNGã®ã»ãšãã©
@pbstarkãšããç¡å¶éã®ç¶æ ã¯ãããŸãã
https://github.com/pbstarkãæãã§ããŸãã ãããã¯éåžžã
æéã«ãŠã³ã¿ãŒã®æå·åã ãã®ã«ãŠã³ã¿ãŒã転ãããšãããªãã¯
æéæéã æè¡çã«ã¯ã圌ã®ã¯ãªããã©ã³ãã
https://statlab.github.io/cryptorandom/ã2 **ïŒ256 + 64ïŒã«å¶éãããŠã
åºå®ãµã€ãºã®256ããããã€ãžã§ã¹ãç¶æ ã«ããåºæã®åææ¡ä»¶ãš
åºå®ãµã€ãºã®64ãããé·ã«ãŠã³ã¿ãŒã ããã¯ãããããžã®éã瀺ããŠããŸã
é·ãã«ãŠã³ã¿ãŒãäœæããããšã«ãããçã«ç¡å¶éã®PRNGãå®è£ ãã
ä»»æã®ãµã€ãºã§ããããã®ãããªã¢ã«ãŽãªãºã ãå ¬éãããŠããã®ãèŠãããšããããŸããã
ãã¹ãæžã¿ãäžæ¹ã次ã®ãããªPRNGã¢ã«ãŽãªãºã ãå¿ èŠãªå Žå
ä»»æã®ãµã€ãºã®ç¶æ ãæåã«ä¿®æ£ãããç¶æ
ããªããå¿ èŠãšãããã®ã®äžã«äœãããããŠPCGã®æ¡åŒµãžã§ãã¬ãŒã¿ãŒ
http://www.pcg-random.org/party-tricks.htmlã¯ãã®ããã«ããŸãããã§ããã
ä»äºã ãããã¯æããã«CS-PRNGã§ã¯ãããŸããããå®éã«ã¯æºè¶³ããŸã
@pbstarkhttps ïŒ//github.com/pbstarkã®å·šå€§ãªç¶æ 空éãæã¡ãããšããé¡æ
ãªã³ããã³ãã ããã§ããããããnumpyã«å«ããããšã¯ãå§ãããŸãããæšæºã®æçCS-PRNGãæã€ä»ã®ããããã£ããããŸã
å¿ èŠãªå ŽåããããŸããããããã¯ç°¡åãªããã©ã«ãã§ã¯ãããŸãããIMOãâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWLGAF6YVIWXYZ2LTT3PX43ONA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWLIJD3UCVY3NXCLPKDPX43ONANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
ãããSHA-256ã®ãªã³ã©ã€ã³ã¢ããããŒãã®ä»çµã¿ã§ã¯ãªãã®ã§ã¯ãªãããšæããŸãã ç¶æããç¶æ
ã¯ãæŽæ°ãèšç®ãããšãã«è¿œå ãã256ããããã€ãžã§ã¹ããšåºå®ãµã€ãºã®64ãããé·ã«ãŠã³ã¿ãŒã®ã¿ã§ãã å
šæãä¿æããŠããããã§ã¯ãããŸããã ããã·ã¥ã¯å§çž®ãããŸãã ããããåãã€ãã§å¹ççãªæŽæ°ãå®è¡ã§ããæ¹æ³ã§ãã åºæ¬çã«ãæéã§ããåãå
éšSHA-256ç¶æ
ã«ãããããå€ãã®åæå/éå»ã®å±¥æŽããããŸãã ãµã€ã¯ã«ã¯ç¢ºãã«é·ãããããã2**(256+64)
ãããé·ããªããŸããã確ãã«ååšããŸãã ãããã®å Žåããå¯èœãªåææ¡ä»¶ã¯2**(256+64)
æªæºã§ãïŒããã¹ãã®é·ãã0ãã2**64-1
å Žåãæ倧ã§2**256
å
éšããã·ã¥ç¶æ
ã䜿çšã§ããŸããããã¹ãã®é·ãã32ãã€ããè¶
ããŠãããããããžã§ã³ããŒã«ã§è¡çªãçºçããå¿
èŠããããŸãïŒã ããŒã¿æ§é ã«ã¯ãã以äžãããããããŸããã
ã©ããããããšã; ç解ããã ç§ã¯ãããå¥ã®æ¹æ³ã§è¡šçŸããŸãïŒç¶æ
ã¹ããŒã¹ã«ã¯å¶éããããŸããããïŒé³©ã®ç©Žã«ãã£ãŠïŒå€ãã®ç°ãªãåæç¶æ
ãå¿
èŠã§ã
åºå¥ã§ããªãåºåã·ãŒã±ã³ã¹ãçæããŸãã
20:21ãããŒãã»ã«ãŒã³ã®æ°Žææ¥ã2019幎5æ29æ¥ã«ã¯[email protected]
æžããŸããïŒ
ãããSHA-256ã®ãªã³ã©ã€ã³ã¢ããããŒãã®ä»çµã¿ã§ã¯ãªãã®ã§ã¯ãªãããšæããŸãã ç¶æ
ç¶æããŠããã®ã¯ã256ããããã€ãžã§ã¹ããšåºå®ãµã€ãº64ãããã®ã¿ã§ãã
æŽæ°ãèšç®ãããšãã«è¿œå ããé·ãã«ãŠã³ã¿ãŒã ããã¯ä¿æãããŸãã
å šæã ããã·ã¥ã¯å§çž®ãããŸãã ãããå¹ççã«è¡ãããšãã§ããæ¹æ³ã§ã
åãã€ãã§æŽæ°ããŸãã åºæ¬çã«ãå€ãã®åæå/éå»ããããŸã
æéã§ããåãå éšSHA-256ç¶æ ã«ãããããå±¥æŽã
ãµã€ã¯ã«ã¯ç¢ºãã«é·ãããããã2 ïŒ256 + 64ïŒããé·ããªããŸãã
ãããŠããããã«ãããããªãã¯2æªæºïŒ256 + 64ïŒ
èããããåææ¡ä»¶ïŒããã¹ãã®é·ã0ã2 64-1ããšã«
æã¡ãŸãã ããã¹ãã®é·ãã32ãè¶ ããã
ãã€ããã©ããžã§ã³ããŒã«ã§ã®è¡çªãå¿ èŠã§ââãïŒã äœããããŸãã
ããŒã¿æ§é ã®ããå€ãã®ããããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWO6HRJZHTVBF2TLK3LPX5B3TA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AANFDWM56HCQRZXDO3BAQHDPX5B3TANCNFSM4HPX3CHA
ã
-
ãã£ãªããã»Bã»ã¹ã¿ãŒã¯| ã¢ãœã·ãšã€ããã£ãŒã³ãæ°åŠããã³ç©çç§åŠ|
çµ±èšåŠéšææ|
ã«ãªãã©ã«ãã¢å€§åŠ
ããŒã¯ã¬ãŒãã«ãªãã©ã«ãã¢94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark
ãŸããééã§ããå¯èœæ§ã®ããç¶æ
ã2**(256+64)
ãããªãå ŽåããããŸãã æŽæ°ã¯æ¯ååã圢åŒã§è¡ããããããæçµçã«ã¯ä»¥åã«èŠãç¶æ
ã«ãªããïŒç§ã«ã¯ïŒæªç¥ã®ããããæéã®æéã®ã«ãŒãã«å
¥ããŸãã åæç¶æ
ã®æ°ãæéã§ããããšæéãæéã§ããããšã cryptorandom
ã¯äž¡æ¹ãããã MT19937
ãããå°ãããšæããŸãã
ããèªäœãcryptorandom
åé¡ã ãšã¯æããŸããã ç¡å¶éã®åæç¶æ
ãŸãã¯ç¡å¶éã®æéãæã€ããšããå®éã«å¿
èŠãªãã®ã§ãããšç§ã¯ç¢ºä¿¡ããŠããŸããã
ç§ã¯ãŸã ã©ã³ãã ã·ãŒãã§å€±æã«ééããŠããŸããããåãè¿ãå¢åã§ãã ææ¥ãã§ãã¯ã€ã³ããŸãã
512GiBã§åŒãç¶ã奜調ïŒ
⯠./pcg_streams.py -i 0 |time ./RNG_test stdin32
[
{
"bit_generator": "PCG32",
"state": {
"state": 10843219355420032665,
"inc": 1
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 5124747729404067061,
"inc": 3
}
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0xb83f7253
test set = normal, folding = standard (32 bit)
rng=RNG_stdin32, seed=0xb83f7253
length= 128 megabytes (2^27 bytes), time= 4.0 seconds
no anomalies in 117 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 256 megabytes (2^28 bytes), time= 8.6 seconds
no anomalies in 124 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 512 megabytes (2^29 bytes), time= 16.9 seconds
Test Name Raw Processed Evaluation
BCFN(2+2,13-2,T) R= -8.0 p =1-2.1e-4 mildly suspicious
...and 131 test result(s) without anomalies
rng=RNG_stdin32, seed=0xb83f7253
length= 1 gigabyte (2^30 bytes), time= 33.8 seconds
no anomalies in 141 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 2 gigabytes (2^31 bytes), time= 65.7 seconds
Test Name Raw Processed Evaluation
BCFN(2+2,13-1,T) R= -7.8 p =1-3.8e-4 unusual
...and 147 test result(s) without anomalies
rng=RNG_stdin32, seed=0xb83f7253
length= 4 gigabytes (2^32 bytes), time= 136 seconds
no anomalies in 156 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 8 gigabytes (2^33 bytes), time= 270 seconds
no anomalies in 165 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 16 gigabytes (2^34 bytes), time= 516 seconds
no anomalies in 172 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 32 gigabytes (2^35 bytes), time= 1000 seconds
no anomalies in 180 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 64 gigabytes (2^36 bytes), time= 2036 seconds
no anomalies in 189 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 128 gigabytes (2^37 bytes), time= 4064 seconds
no anomalies in 196 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 256 gigabytes (2^38 bytes), time= 8561 seconds
no anomalies in 204 test result(s)
rng=RNG_stdin32, seed=0xb83f7253
length= 512 gigabytes (2^39 bytes), time= 19249 seconds
no anomalies in 213 test result(s)
ãããã·ãŒã±ã³ã·ã£ã«ã€ã³ã¯ãªã¡ã³ãã§3ã€ä»¥äžã®ã¹ããªãŒã ãå®è¡ãããšãããã«å€±æãçºçããŸãã ããçš®ã®å šåå°ã䜿çšããŠãŠãŒã¶ãŒå ¥åããå®éã®å¢åãå°ãåºããããã空éå šäœã«åºããããšãæ€èšããå¿ èŠããããŸãã
⯠./pcg_streams.py -n 3 | time ./build/RNG_test stdin32
[
{
"bit_generator": "PCG32",
"state": {
"state": 18394490676042343370,
"inc": 2891336453
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 12676019050026377766,
"inc": 2891336455
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 6957547424010412162,
"inc": 2891336457
}
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0x4a9d21d1
test set = normal, folding = standard (32 bit)
rng=RNG_stdin32, seed=0x4a9d21d1
length= 128 megabytes (2^27 bytes), time= 3.2 seconds
Test Name Raw Processed Evaluation
DC6-9x1Bytes-1 R= +19.4 p = 1.6e-11 FAIL
[Low8/32]DC6-9x1Bytes-1 R= +13.2 p = 4.6e-8 VERY SUSPICIOUS
...and 115 test result(s) without anomalies
@imneme
ç§ãéã£ãããæ¹ã§äœãããŠããã®ãç解ã§ããã°ãããã¯åœ¹ã«ç«ã¡ãŸãã
increment = 2 * stream + 1
å€æãå¯èœã«ããã«ã¯ãã³ãŒãå
ã®è¡pcg64 rng2(-seed,-stream);
ãpcg64 rng2(-seed,-1-stream);
ã«çœ®ãæããå¿
èŠããããšæããŸãã å¢åã®åŠå®ã¯ãã¹ããªãŒã ã€ã³ããã¯ã¹ã®ãããåäœã®åŠå®ã«å¯Ÿå¿ããŸãã ãã®å€æŽãå ããŠã³ãŒããå®è¡ãããšã以åã®ãããããšéåžžã«ãã䌌ããã®ã衚瀺ãããŸãã ïŒãããŠãç§ããã®å€æŽãããªããã°ããã¹ãŠãèŠèŠçã«è¯ãèŠããããšã確èªããŸããïŒ
@imneme
ã¹ããªãŒã ãèããæ£ããæ¹æ³ã¯ãã·ãŒãããå¿ èŠãããããã©ã³ãã ãªç¶æ ã§ãã
åæããŸããã ããã«ãããLCGã®å
šäœåãéåžžã«ãããã«ãªããšæããŸããé©åã«éžæãããä¹æ°a
ãåºå®ããã64ãããLCGã®å Žåããµã€ãº2^127
ç¶æ
空éãããããã¹ãŠã®ãã¢(x, c)
æŽæ°ã®c
ã¯å¥æ°ã®å¢åã§ãã ç¶æ
æŽæ°é¢æ°ã¯next : (x, c) ⊠(ax+c, c)
ã§ãããç¶æ
空éãããããé·ã2^64
äºãã«çŽ ãªãµã€ã¯ã«2^63
ã«åå²ããŸãã ã·ãŒãã«ã¯ããã®ç¶æ
空éã§éå§ç¹ãéžæããã ãã§ãã
次ã«ãåæã容æã«ããç°ãªãã¹ããªãŒã éã®é¢ä¿ãæ確ã«ããæãããªçŸ€äœçšããããŸãã Z / 2^64Z
ã®å¯é1次å
ã¢ãã£ã³å€æã®ã°ã«ãŒãã¯ãæ£ç¢ºã«2^127
é åºã§ãããäžæçã«åäœããŸããç¶æ
空éã§ïŒãããŠå¿ å®ã«ïŒïŒã¢ãã£ã³å€æy ⊠ey + f
ã¯ããã¢(x, c)
ã(ex + f, ec + (1-a)f)
ãããããŸãã ãã®ã°ã«ãŒãã¢ã¯ã·ã§ã³éå€ãnext
å€æã¯ã³ãã€ã³ãããšãŠããŒã¯æå
çŽ ã®ã§é¢æ°ã (x, c)
å¥ã«ç¶æ
空éã«ãããŠã (x2, c2)
ããŸãã«ãã£ãŠçæãããã·ãŒã±ã³ã¹ãããã³ã°(x, c)
(x2, c2)
ã«ãã£ãŠçæãããã·ãŒã±ã³ã¹ã«(x, c)
(x2, c2)
ã
tl; drïŒåºå®ä¹æ°ã®å Žåãåãä¹æ°ãæã€ä»»æã®2ã€ã®LCGã·ãŒã±ã³ã¹ïŒå
èªã¿ã®å Žåã®ããã«åãå¢åã䜿çšããããç°ãªãå¢åã䜿çšãããã«é¢ä¿ãªãïŒã¯ãã¢ãã£ã³å€æã«ãã£ãŠé¢é£ä»ããããŸãã é¿ãããäžå¹žãªã±ãŒã¹ã§ã¯ããã®ã¢ãã£ã³å€æã¯ã 2
è¿œå ãããã -1
ä¹ç®ããããããªã©ãéåžžã«åçŽãªãã®ã§ãã äžè¬çãªã±ãŒã¹ã§ã¯ãã¢ãã£ã³å€æãååã«è€éã§ãæšæºã®çµ±èšçæ€å®ã§ã¯2ã€ã®ã¹ããªãŒã éã®é¢ä¿ãæ€åºã§ããªãããšãæãŸããŸãã
@mdickinsonã¯ç¶æ³ãããŸãã«ããŒããŠããŸãã PCGã®é åã¯ãLCGã®å Žåãšã¯å°ãç°ãªããŸãããããã»ã©å€ãã¯ãããŸããã PCGé åã®èŠç¹ã¯ãå®è¡ããã¹ã¯ã©ã³ãã«ã®éãéžæã§ããããšã§ãã åãæšãŠããã128ãããLCGã¯ãã§ã«BigCrushãééããŠããããã pcg64
é åãéžæãããšãã«ããã®ãµã€ãºã®LCGïŒXSL RRïŒã«å¯ŸããŠé©åºŠãªéã®ã¹ã¯ã©ã³ãã«ãéžæããŸããã 察ç
§çã«ã64ãããLCGã¯ããã€ãã®çµ±èšçæ€å®ã«ããã«å€±æããããã pcg32
ã¯ããå°ãã¹ã¯ã©ã³ãã«ã䜿çšããŸãããããã§ãPCGããŒããŒããã®æ匷ã®é åã§ã¯ãããŸããã ã¹ã¬ããã®ãã«ãªã¯ãšã¹ãã¹ã¬ããã§è¿°ã¹ãããã«ã pcg32
ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã匷åãªPCGé åïŒRXS MïŒã«åŸåãå§ããŸããã ããã¯ãŸã ããã©ã«ãã§ã¯ãããŸãããæ瀺çã«ãã®ããŒãžã§ã³ãèŠæ±ããå¿
èŠããããŸãããPCGã®ã¡ãžã£ãŒããŒãžã§ã³ãã³ããå®è¡ãããšãã«ããã©ã«ããåãæ¿ããå¯èœæ§ããããŸãã ïŒRXSMã¯RXSM XSã®äžäœååã§ãããVignaã¯ãã®ãµã€ãºãšDavid Blackmanã奜ãé åã§åºç¯å²ã«ãã¹ãããŸããïŒã
ãã¢ã¹ããªãŒã ãã¹ãããã°ã©ã ã®æŽæ°ããŒãžã§ã³ãpcg32ã®äž¡æ¹ã®ã¹ããŒã ã䜿çšããå Žåã®éããèŠèŠåã§ããŸãïŒXSHRRãšRCSM [ããã³åºã«ãªãçã®LCGã]ïŒã
#include "pcg_random.hpp"
#include <iostream>
#include <random>
// Create a "PCG" variant with a trivial output function, just truncation
template <typename xtype, typename itype>
struct truncate_only_mixin {
static xtype output(itype internal)
{
constexpr size_t bits = sizeof(itype) * 8;
return internal >> (bits/32);
}
};
using lcg32 = pcg_detail::setseq_base<uint32_t, uint64_t, truncate_only_mixin>;
int main() {
std::random_device rdev;
uint64_t seed = 0;
uint64_t stream = 0;
for (int i = 0; i < 2; ++i) {
seed <<= 32;
seed |= rdev();
stream <<= 32;
stream |= rdev();
}
lcg32 rng1(seed,stream);
lcg32 rng2(-seed,-1-stream);
// pcg32 rng1(seed,stream);
// pcg32 rng2(-seed,-1-stream);
// pcg_engines::setseq_rxs_m_64_32 rng1(seed,stream);
// pcg_engines::setseq_rxs_m_64_32 rng2(-seed,-1-stream);
std::cerr << "RNG1: " << rng1 << "\n";
std::cerr << "RNG2: " << rng2 << "\n";
std::cout.precision(17);
for (int i = 0; i < 10000; ++i) {
std::cout << rng1()/4294967296.0 << "\t";
std::cout << rng2()/4294967296.0 << "\n";
}
}
å§ããåã«ã @ mdickinsonãæããã°ã©ããèŠãŠã¿ãŸãããããã ããé åã®ãªãLCGã®å Žåã¯ãåãæšãŠã ãã§ãã
ããã¯ãçžé¢ããç¶æ ãæã€ç çåŠçLCGçšã§ããããšã«æ³šæããŠãã ããã 代ããã«ãã©ã³ãã ã«éžæãããå æ³å®æ°ïŒãã ãéå§å€ã¯åãïŒãæã€2ã€ã®LCGãéžæããå Žåã次ã®ããã«ãªããŸãã
PCGã®åºåé¢æ°ã«ç§»ããšãç çåŠçãªã±ãŒã¹ã§XSH RRã䜿çšãããšã次ã®ããã«ãªããŸããäžã®ã°ã©ãã§ã¯å€§å¹ ã«æ¹åãããŠããŸãããæããããå®å šã«èŠãé ããŠããããã§ã¯ãããŸããã
ããã¯ãåãåºç€ãšãªãïŒçžé¢ãæªãïŒLCGãã¢ãæã€RXSMã§ãã
ããããããã¯ç§ãpcg32
ããã«æ€èšããŠãããã®ã«ãããŸããã ããã©ãŒãã³ã¹ã®äœäžã¯ãããããã§ã pcg32
ã¯ååã«å°ããã®ã§ããããŒãŠãŒã¶ãŒã倧éã®ã©ã³ãã ã·ãŒãã®pcg32
ãžã§ãã¬ãŒã¿ãŒãäœæããããããã倧éã®æ°å€ãèŠæ±ããããšãå¿é
ããŠããããšãæ³åã§ããŸããçžé¢ã®å¯èœæ§ãéåžžã«å°ããããã§ã¯ãããŸããã ççŽã«èšã£ãŠãç§ã¯ããã«ã€ããŠ2ã€ã®èããæã£ãŠããŸãããªããªãããã®ç¥è©±äžã®ãã¯ãŒãŠãŒã¶ãŒã¯ããããpcg32
ããŠããããã§ãã
pcg64
ã®ã¹ããªãŒã ãããç¬ç«ãããããšã«ããŸãé¢å¿ããªãçç±ã®ã²ãšã€ã¯ãä»ã®ãã¹ãŠã®ç¶æ
ãåãã«ä¿ã¡ãã¹ããªãŒã ãã«åãæ¿ããããšãè³¢æãªãŠãŒã¹ã±ãŒã¹ãèŠåœãããªãããšã§ããå¥ã®ãã®ïŒããšãã°ãã©ã³ãã ãªå€ããŸããŠãè¿ãã®å€ïŒã ã»ãšãã©ãã¹ãŠã®PRNGã§ã2çªç®ã®PRNGãäœæããæ£ããæ¹æ³ã¯ãæ°ãããšã³ããããŒã§åæåããããšã§ãã
çµè«ãšããŠãNumPyã®å ŽåãPCG64ã2ã€ã®256ãããã®ç¶æ ïŒã¹ããªãŒã ã®äžäœããããç¡èŠããããããæè¡çã«ã¯255ïŒãå¿ èŠã§ãããšèããŠããããå®äºãšåŒã¶ã®ãæãçã«ããªã£ãŠãããšæããŸãã ããã«ãããAPIã«é¢é£ããåé¡ãåé¿ãããŸããããã¯ãããBitGeneratorã§ã¯æ©èœã1ã€å°ãªããªããå¥ã®BitGeneratorã§ã¯æ©èœããªããªãããã§ãã
ïŒãã ãã32ãããPCGããªã¢ã³ããRXS MããŒãžã§ã³ã«åãæ¿ããããšããå§ãããŸããCãœãŒã¹ã®å ŽåãCã³ãŒãã§RXS Mãæ瀺çã«æäŸãããC ++ã§ã®ã¿äœ¿çšã§ããããã«ãããããææ°ããŒãžã§ã³ãå¿ èŠã§ããå身ãïŒ
[ãããããªããç¥ããããšæã£ãŠãã以äžã®ãã®ã§ããå Žåã¯ç³ãèš³ãããŸããïŒ ãŸããç³ãèš³ãããŸããã ;-)]
pcg64
ã®ã¹ããªãŒã ãããç¬ç«ãããããšã«ããŸãæ©ãŸãããŠããªãçç±ã®ã²ãšã€ã¯ãä»ã®ãã¹ãŠã®ç¶æ ãåãã«ä¿ã¡ãã¹ããªãŒã ãå¥ã®ãã®ïŒããšãã°ãã©ã³ãã ãªå€ããŸããŠãè¿ãã®å€ïŒã ã»ãšãã©ãã¹ãŠã®PRNGã§ã2çªç®ã®PRNGãäœæããæ£ããæ¹æ³ã¯ãæ°ãããšã³ããããŒã§åæåããããšã§ãã
ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠã¯åã«èª¬æããŸããã åäžã®çããã·ãŒããå ¥åïŒã€ãŸããé»åã¡ãŒã«ããã³ãã³ãã©ã€ã³ã«ã³ããŒã¢ã³ãããŒã¹ãã§ãããµã€ãºçšåºŠã®ãã®ïŒãåãå ¥ããããã°ã©ã ã®åºåã決å®è«çã«ãã確ççããã°ã©ã ãäœæãããšããUXã®åŒ·åãªçç±ããããŸãã @stevenjkernã¯ããªãã©ã€ã³ã®äŒè©±ã§ã圌ã®ãœãããŠã§ã¢ãæ€èšŒããå¿ èŠã®ããèŠå¶åœå±ãšååããããã«ã¯ããã®ãããªããåããäžå¯æ¬ ã§ãããšè¿°ã¹ãŸããã ããã°ã©ã ã®å®è¡ã®ãã¡ã€ã«_output_ã䜿çšããŠçµæãè€è£œããå¿ èŠãããå Žåããã®ãããªç¶æ³ã§ã¯å°ãçãããããã«èŠããŸãã èŠå¶åœå±ã¯ããã¡ã€ã«å ã®æ å ±ãæ¬åœã«ã³ãŒã·ã£ã§ããããšã確èªããããã«ãã³ãŒãïŒå®éã«ã¯å©çšã§ããªãå¯èœæ§ããããŸãïŒãæ·±ãæãäžããå¿ èŠããããŸãã
ããã§ãPythonã«ãNåã®äžŠåããã»ã¹ãåçã«ã¹ãã³ã¢ããããŠäœæ¥ã®äžéšãå®è¡ããçµæãåéããŠã¡ã€ã³ããã»ã¹ã«é²ãããã®
Nã¹ããªãŒã ãåçŸå¯èœã«å°åºããå¿ èŠæ§ã¯ååã«åŒ·ããããçŸåšã®MTã¢ã«ãŽãªãºã ã§ãããååŸããããã«äººã ã¯å¥åŠãªããšãããŸãã ç§ã¯ããããã®å±éºãªèšç»ãæå¢ããªããã°ãªããªãã£ãããããŠç§ã¯PCGã®ã¹ããªãŒã ãç§ãã¡ãããã«çãã®ãå©ããããšãæãã§ããã
2**63
/ 2**127
åªããå
šåå°ããã·ã¥ã䜿çšããŠãç¶æ
ãåãã«ä¿ã¡ãªãããã«ãŠã³ã¿ãŒã·ãŒã±ã³ã¹0,1,2,3ã...ããå¢åãå°åºããããšã«ã€ããŠã©ãæããŸããïŒ ããªãã¯ããã«é¢ããåé¡ãäºèŠããŸããïŒ ããã·ã¥ãããå¢åãšããã«ç¶ã倧ããªãžã£ã³ãã¢ããããçµã¿åãããŠãç¶æ
ãæ°ãããµã€ã¯ã«ã®é ãéšåã«ç§»åããããšã«ã€ããŠã©ãæããŸããïŒ ãã¶ãããã®ãµããã£ã¹ã«ãã·ã§ã³ãé»åã¡ãŒã«ãŸãã¯å¥ã®åé¡ã«ç§»åããŠãå ±åããããšãã§ããŸãã
@ rkern ãPRNGã«éåžžã«çãã·ãŒããäžããããšãã§ããããšã«
å šå¡ãåãPRNGïŒããšãã°ãã¡ã«ã»ã³ããã€ã¹ã¿ãŒïŒã䜿çšããåãå°ããªã»ããïŒããšãã°ã10000æªæºã®æ°ïŒããã·ãŒããéžæããå Žåãåé¡ã¯ããã«è€éã«ãªããŸããããã¯ãããã°ã©ã ããšã®ä»»æã®ç¹å®ã®ãã€ã¢ã¹ã§ã¯ãªãã _ãããè¡ããã¹ãŠã®äººã®ããã«_ãã€ã¢ã¹ã ããšãã°ã4æ¡ã®ã·ãŒããéžæããã¡ã«ã»ã³ããã€ã¹ã¿ãŒãã劥åœãªæ°ã®æ°åïŒããšãã°ã100äžæªæºïŒãååŸãããšããŸãã ãã®ãããªç¶æ³ã§ã¯ãäžéãªæ°13ã¯100åã®åºåã®ãããããšããŠè¡šç€ºãããããšã¯ãªãïŒå®éã«ã¯32ãããæŽæ°ã®çŽ10ïŒ ãååšããªãïŒãæ°123580738ã¯æ¬¡ã®ä¿æ°ã§é倧è©äŸ¡ãããŠããããšãä¿èšŒã§ããŸãã 16.ããã¯ã100ååã®32ãããæŽæ°ã®ã©ã³ãã ãµã³ãã«ã«æåŸ ãããã®ãšãŸã£ããåãã§ããã_å šå¡ãåããµã³ãã«ã䜿çšããŠããå Žå_ã¯å®éã®åé¡ã§ãã å šå¡ã9æ¡ã®ã·ãŒããéžæãã10000ã®æ°åããæç»ããªãå ŽåããŸã£ããåæ§ã®åé¡ãçºçããŸãã
å€ãã®äººãäœããããããšããäºå®ã¯ãããè¯ãèãã«ããŸããã ïŒããã¯ãåã«äººã ã«ãããééã£ãŠããããŸãã¯ééã£ãããšãæãã§ãããšèšã£ãŠããããšããæå³ã§ã¯ãããŸããã圌ããå®éã«äœãå¿ èŠãšããŠããã®ããç解ããå¿ èŠããããŸãïŒããšãã°ãçãã³ãã³ãã©ã€ã³åŒæ°ããã®åçŸå¯èœãªçµæ-ããããæ£ããããšã¯ã UUIDãšå°ããªæŽæ°ããã®ã·ãŒããèš±å¯ããããšã§ããã·ãŒãããŒã¿ãäœæããããã«ããããããŸãã¹ã¯ã©ã³ãã«ããæ¹æ³ã«é¢ããããã€ãã®ã¢ã€ãã¢ã¯ããã®ããã°æçš¿ã«ããã randutilsã«çµã¿èŸŒãŸããŠããŸããïŒ
ïŒããªãçãã®ã§ããããè©ŠããŠã¿ãã³ãŒãã§ã...ïŒ
// mtbias.cpp -- warning, uses 4GB of RAM, runs for a few minutes
// note: this is *not* showing a problem with the Mersenne Twister per se, it is
// showing a problem with simplistic seeding
#include <vector>
#include <iostream>
#include <random>
#include <cstdint>
int main() {
std::vector<uint8_t> counts(size_t(std::mt19937::max()) + 1);
for (size_t seed=0; seed < 10000; ++seed) {
std::mt19937 rng(seed);
for (uint i = 0; i < 1000000; ++i) {
++counts[rng()];
}
}
size_t shown = 0;
std::cout << "Never occurring: ";
for (size_t i = 0; i <= std::mt19937::max(); ++i) {
if (counts[i] == 0) {
std::cout << i << ", ";
if (++shown >= 20) {
std::cout << "...";
break;
}
}
}
std::cout << "\nMost overrepresented: ";
size_t highrep_count = 0;
size_t highrep_n = 0;
for (size_t i = 0; i <= std::mt19937::max(); ++i) {
if (counts[i] > highrep_count) {
highrep_n = i;
highrep_count = counts[i];
}
}
std::cout << highrep_n << " -- repeated " << highrep_count << " times\n";
}
åã«ãèšã£ãããã«ã128ãããã·ãŒãã¯ãã®ç®çã«ã¯ååçããšæããŸãããããŠã人ã ãæ£ããããšãããããã°ã©ã ãæžãã®ãå©ããããŒã«ãæ§ç¯ããããšãã§ããŸãã ã€ãŸããããã©ã«ãã§ãšã³ããããŒãµã³ããªã³ã°ãè¡ããå°å·ããããã°ã«èšé²ããŠãåŸã§æž¡ãããšãã§ããããã«ããŸãã ããã°ã©ã ããšã«UUIDãçæããå®è¡ããšã«ãŠãŒã¶ãŒãæäŸããã·ãŒããããã«å°ããããããšããå§ãããŸãã
PCG64
ã®ç¶æ
éšåã«ãäœããã®æ¹æ³ã§é©åãª128ãããã·ãŒãã䜿çšããŠãããããšãã§ãããšä»®å®ããŸãããã åãå·ããã¹ããªãŒã ã掟çãããããšã«ã€ããŠäœãã³ã¡ã³ãã¯ãããŸããïŒ å
šäœãšããŠãåäžã®PCG64
ã¹ããªãŒã ãããå€ãã®æ°å€ãæç»ããããšã¯èããŠããŸããã æœéžããšã«èª¿æŽããããšãªããããŸããŸãªããã»ã¹ã§ãããã®æ°åãæãããšãã§ããããã«ããããšæããŸãã ã¢ãããã¯ãª63ãããã®multiply-xorshiftããã·ã¥ã䜿çšãããšãã€ã³ã¿ãŒãªãŒãããã8192ã¹ããªãŒã ã«å¯ŸããŠããããŸã§ã®ãšããããªãããŸãæ©èœããŠããããã§ãïŒçŸåšã32 GiBã§ãïŒã
@imneme
ç§ãã¡ãäœãæå³ããã®ããç°¡åã«å®çŸ©ãããšåœ¹ç«ã€ãããããŸããã
@rkernã¯ããé»åã¡ãŒã«ããã³ãã³ãã©ã€ã³ã«ã³ããŒ
æœéžããšã«èª¿æŽããããšãªããããŸããŸãªããã»ã¹ã§ãããã®æ°åãæãããšãã§ããããã«ããããšæããŸãã ã¢ãããã¯ãª63ãããã®multiply-xorshiftããã·ã¥ã䜿çšãããšãã€ã³ã¿ãŒãªãŒãããã8192ã¹ããªãŒã ã«å¯ŸããŠããããŸã§ã®ãšããããªãããŸãæ©èœããŠããããã§ãïŒçŸåšã32 GiBã§ãïŒã
ç¶æ
ãååãªæ°ïŒããšãã°ã PCG64.jumped
䜿çšããã2 ** 64ïŒé²ããããšã«ãããåäžã®å質ã·ãŒãã䜿çšããŠn
ã¹ããªãŒã ãã€ã³ã¿ãŒãªãŒãããããšããŸãããïŒ ããã¯ã PCG64(seed).jumped(node_id)
ãããªãã®ã䜿çšããŠãã¯ã©ã¹ã¿ãŒå
šäœã§å€§ããªn
ã¹ããªãŒã ã倧ãŸãã«èª¿æŽããæãç°¡åãªæ¹æ³ã®ããã§ãã
ããã§ã node_id
ã¯0,1,2ã..ã§ãã
ã€ã³ããã¯ã¹ã®ãããªãã®ã䜿çšããŠåçŽãªç¬ç«ããã¹ããªãŒã ãçæããã®ã«æ¬åœã«åªããŠããPRNGã¯ãããŸããïŒ MLFGãã§ãããšä¿¡ããŠããŸããã63ããããžã§ãã¬ãŒã¿ãŒã ã£ãã®ã§æ°ã«å ¥ããªãã£ãã§ãã
@bashtage ãããã¯æ¬åœã«ãããããæ£ããæ¹æ³ã§ã¯ãããŸããã æ£ããæ¹æ³ã¯ãã·ãŒããååŸããããšã§ããå°ããªæŽæ°ãè¿œå ããå Žåã¯ãããã·ã¥é¢æ°ã䜿çšããŠããã·ã¥ããŸããåè¿°ã®ããã«ãç§ã¯ä»¥åã«ïŒPCGãšã¯é¢ä¿ãªãïŒæ·±å»ãªããã·ã³ã°é¢æ°ãäœæããŸãã[ç·šéïŒãªã³ã¯ã®ä¿®æ£æ£ããæçš¿ã«]倧å°ããŸããŸãªçš®é¡ã®ãšã³ããããŒãæ··åããŸãã ããªãã¯ç§ã®ãã®ã䜿ãå¿ èŠã¯ãããŸããããç§ã¯ããªãããããã®ç·ã«æ²¿ã£ãŠäœããããããšããå§ãããŸãã
çæ³çã«ã¯ãPCGã«åºæã§ã¯ãªãã¡ã«ããºã ãå¿ èŠã§ãã PCGã¯ããã©ã«ãã®éžæã§ã¯ãªããããããŸããããããŠããšãããã§ãã£ããšããŠããããªãã¯äººã ã«ãã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã§åæ§ã®ããšãããŠãããããã§ãã ã¹ããªãŒã ãŸãã¯ãžã£ã³ãã¢ãããã«äŸåããããã€ãã®ç¬ç«ããPRNGãäœæããããã®ã¹ããŒã ã¯å¿ èŠãªããšæããŸãã
ïŒãã£ãšãééã£ãããã°æçš¿ã«ãªã³ã¯ããŸãããåã®ã¡ãã»ãŒãžãç·šéããŸããããã¡ãŒã«ã§èªãã§ããå Žåã¯ããã®ããã°æçš¿ã«ãªã³ã¯ããã€ããã§ããïŒ
@imnemeçŸåšãç§ãã¡ãæã£ãŠãããã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã¯ãžã£ã³ãããµããŒãããŠããŸãïŒãã®ãã¡ã®ããã€ãã¯å®éã«ã¯ã¢ããã³ã¹ã¿ã€ãã®åŒã³åºãã§ãïŒã 泚ææ·±ãã·ãŒãããã®ãè¯ãèãã§ããããšã¯ééããããŸãããå€ãã®ãŠãŒã¶ãŒãPRNG.jumped()
åŒã³åºãã䜿çšããããªãã®ã§ã¯ãªãããšæããŸãã ããã¯æããšã©ãŸãã¹ããã®ã§ããïŒ
ã·ãŒãã«é¢ããŠã¯ãMTãžã§ãã¬ãŒã¿ãŒã¯ãã¹ãŠäœæè ã®initã«ãŒãã³ã䜿çšããPCGã¯ããªãã®ã«ãŒãã³ã䜿çšããæ®ãã¯æ¬¡ã®ããã«ãªããŸãã
seed = np.array(required_size, dtype=np.uint64)
last = 0
for i in range(len(user_seed))
if i < len(user_seed)
last = seed[i] = splitmix64(last ^ user_seed[i])
else:
last = seed[i] = splitmix64(last)
ããã¯æ¹åã§ãããšæããŸãã
ããã¯æããšã©ãŸãã¹ããã®ã§ããïŒ
jumped
èŠãããšããããŸãã
0x96704a6bb5d2c4fb3aa645df0540268d
ä¹æ°MããããšããŸãã M ^ïŒ2 ^ 64ïŒãèšç®ãããšãã²ã©ãLCGä¹æ°ã§ãã0x6147671fb92252440000000000000001
ãåŸãããŸãã ãããã£ãŠã128ãããLCGãã2 ^ 64çªç®ããšã®ã¢ã€ãã ãååŸããå Žåãããã¯ã²ã©ããã®ã«ãªããŸãïŒäžäœãããã¯åãªãã«ãŠã³ã¿ãŒã§ãïŒã PCGã®æšæºé åé¢æ°ã¯ãã«ãŠã³ã¿ãŒãã¹ã¯ã©ã³ãã«ããã®ã§ã¯ãªããLCGã®éåžžã®åºåãã¹ã¯ã©ã³ãã«ããããã«èšèšãããŠããŸãã
PCG64ã¯çŸåšãPractrandã§æ倧0.5ãã¿ãã€ããŸã§ãã¹ããããŠãããããã«åæãããšã2ã®çŽ¯ä¹ã«é¢é£ããåé¡ãªãã«å€ãã®ãã¿ãã€ããèªã¿åãããšãã§ããããšã瀺ãããŠããŸãã æ®å¿µãªãããå ã«é²ãã§2ã®å·šå€§ãªæ£ç¢ºãªçŽ¯ä¹ãã¹ããããããšãPCGã®éåžžã®ïŒããæ§ãããªïŒé åã§ã¯ããã®ãããªåºç€ãšãªãLCGã®å·šå€§ãªè·é¢ãã¹ãããããããšã«ããç çåŠçã·ãŒã±ã³ã¹ãååã«è£åã§ããŸããã ãããä¿®æ£ããããã«é å匷床ãäžããããšãã§ããŸããå®éãIãšVignaã¯ã©ã¡ãããPCGã®æšæºé åãæ¢æã®æŽæ°ããã·ã¥é¢æ°ãšåå¥ã«æ¯èŒããŸããïŒçµå±ã®ãšããããããã¯SplitMixã®åºç€ã§ãã_is_ãã ã®ã«ãŠã³ã¿ãŒïŒã 2014幎ã«FastHashã§èª¿ã¹ããšãããé床ã¯ããã»ã©éãã¯ãããŸããã§ããããæè¿Vignaãmurmurhashã§èª¿ã¹ããšããããã©ãŒãã³ã¹ã¯æšæºã®PCGãäžåã£ãŠãããšäž»åŒµããŸããïŒïŒïŒã
æ¬åœã«2 ^ 64ã®ãžã£ã³ãã¢ããããå¿
èŠãªå Žåã¯ããã匷åãªåºåé¢æ°ã®é åã«åãæ¿ããå¿
èŠããããšæããŸãïŒãããŸã§èŠãŠããããã«ãäœã³ã¹ãã§å®è¡ã§ããå¯èœæ§ããããŸãïŒã ããããããããã¯ãå®éã«ã¯ãæšæºãã®PCGã§ã¯ãªããšæããéåžžã®åºåé åãç¶æãããå Žåjumped()
ããããã
ïŒãšããã§ãç çåŠçãžã£ã³ãã¢ãããã¯ä»ã®PRNGã«ãé©çšãããŸããSplitMixã«ã¯ããã€ãã®æªãå¢åãããããšãç¥ãããŠããã0xbd24b73a95fb84d9ã®éåžžã®å¢åïŒå¥åãã¬ã³ããïŒã¯åé¡ãããŸãããã2 ^é²ãã§ãããšèããã®ã劥åœã§ãã 32ã¯0x95fb84d900000000ã®å¢åãäžããŸãããããã¯ããŸãè¯ããããŸãããLFSRã®å Žåãæªããžã£ã³ãã¢ãããã¯ãããã2ã®çŽ¯ä¹ã§ã¯ãããŸããããåºç€ãšãªãè¡åãç çåŠçã«çµãããžã£ã³ãããããšç¢ºä¿¡ããŠããŸãããŸã°ãã§ããïŒ
å°ãªããšãPCG32
ã§ã¯ã .jumped()
ã䜿çšãã4ã€ã®ã€ã³ã¿ãŒãªãŒãã¹ããªãŒã ãéåžžã«è¿
éã«å€±æããããšã確èªã§ããŸãã
⯠./pcg_streams.py --jumped -n 4 | time ./RNG_test stdin32
[
{
"bit_generator": "PCG32",
"state": {
"state": 10149010587776656704,
"inc": 2891336453
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 1158608670957446464,
"inc": 2891336453
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 10614950827847787840,
"inc": 2891336453
}
},
{
"bit_generator": "PCG32",
"state": {
"state": 1624548911028577600,
"inc": 2891336453
}
}
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0xeedd49a8
test set = normal, folding = standard (32 bit)
rng=RNG_stdin32, seed=0xeedd49a8
length= 128 megabytes (2^27 bytes), time= 2.1 seconds
Test Name Raw Processed Evaluation
BCFN(2+0,13-3,T) R= +58.7 p = 1.3e-27 FAIL !!!
BCFN(2+1,13-3,T) R= +48.0 p = 1.5e-22 FAIL !!
BCFN(2+2,13-3,T) R= +16.0 p = 2.3e-7 very suspicious
DC6-9x1Bytes-1 R= +53.5 p = 1.8e-32 FAIL !!!
[Low8/32]DC6-9x1Bytes-1 R= +27.4 p = 1.1e-17 FAIL !
...and 112 test result(s) without anomalies
çæ³çã«ã¯ãPCGã«åºæã§ã¯ãªãã¡ã«ããºã ãå¿ èŠã§ãã PCGã¯ããã©ã«ãã®éžæã§ã¯ãªããããããŸããããããŠããšãããã§ãã£ããšããŠããããªãã¯äººã ã«ãã¹ãŠã®ãžã§ãã¬ãŒã¿ãŒã§åæ§ã®ããšãããŠãããããã§ãã
ããŠããããç§ãã¡ãããã§æ±ºå®ããããšããŠããããšã§ãã :-)åã¢ã«ãŽãªãºã ã«ãã£ãŠå ¬éãããããããã£ãååã«ç 究ãããŠããããšãåæãšããŠãåPRNGãæäŸããæ©èœãå ¬éããã ãã§ããªãæºè¶³ããŸããã ãŸããããããæšå¥šãããããã©ã«ãã®PRNGã§ãã䟿å©ãªæ©èœããããããããŸãããä»ã®äººã«ã¯ãªããããããŸããããšèšã£ãŠãããªãæºè¶³ããŠããŸãã
ã©ã®ã¢ã«ãŽãªãºã ã§ããããã·ã¥ã䜿çšããŠç¹å®ã®ç¶æ ãšã¹ããªãŒã IDããæ°ããç¶æ ãå°åºãããšããæŠå¿µã¯èå³æ·±ããã®ã§ãã ãããã©ãã»ã©ããç 究ãããŠãããç¥ã£ãŠããŸããïŒ ããããã¹ãŠã®ã¢ã«ãŽãªãºã ã§ããŸãæ©èœããããšã確èªããããšã¯ãç 究äžã®åé¡ã®ããã«èãããŸãã ããã¹ãŠã®PRNGã®ç¬ç«ããã¹ããªãŒã ãå°åºããããã®äžè¬çãªæé ã¯æ¬¡ã®ãšããã§ãããšäž»åŒµããããšãèºèºããŸãã ãç¬ç«ããã¹ããªãŒã ãå°åºããããã®äžè¬çãªAPIããããŸããåPRNGã¯ãã¢ã«ãŽãªãºã ã«é©ããæ¹æ³ã§å®è£ ããã¢ã«ãŽãªãºã ãé©åã«ãµããŒãããŠããªãå Žåã¯å®è£ ããªãå¯èœæ§ããããŸããã«æºè¶³ããŠããŸãã
äžæ¹ãPractRandã®N GiBã«éä¿¡ãããåBitGenerator
ã€ã³ã¿ãŒãªãŒãã¹ããªãŒã ããã¹ãããã®ã«ååãªCPUãµã€ã¯ã«ãå²ãåœãŠãã ãã®å Žåã¯ãããã»ã©é¢åã§ã¯ãããŸããã
ã©ã®ã¢ã«ãŽãªãºã ã§ããããã·ã¥ã䜿çšããŠç¹å®ã®ç¶æ ãšã¹ããªãŒã IDããæ°ããç¶æ ãå°åºãããšããæŠå¿µã¯èå³æ·±ããã®ã§ãã ãããã©ãã»ã©ããç 究ãããŠãããç¥ã£ãŠããŸããïŒ ããããã¹ãŠã®ã¢ã«ãŽãªãºã ã§ããŸãæ©èœããããšã確èªããããšã¯ãç 究äžã®åé¡ã®ããã«èãããŸãã ããã¹ãŠã®PRNGã®ç¬ç«ããã¹ããªãŒã ãå°åºããããã®äžè¬çãªæé ã¯æ¬¡ã®ãšããã§ãããšäž»åŒµããããšãèºèºããŸãã ãç¬ç«ããã¹ããªãŒã ãå°åºããããã®äžè¬çãªAPIããããŸããåPRNGã¯ãã¢ã«ãŽãªãºã ã«é©ããæ¹æ³ã§å®è£ ããã¢ã«ãŽãªãºã ãé©åã«ãµããŒãããŠããªãå Žåã¯å®è£ ããªãå¯èœæ§ããããŸããã«æºè¶³ããŠããŸãã
ãããããªãµãŒãã¯ãšã¹ãã§ã³ãïŒãããã£ãŠãååã«ç 究ããããïŒãšæ£ç¢ºã«åŒã¶ããšãã§ãããã©ããã¯ããããŸããããC ++ 11ïŒäž»ã«è©Šè¡é¯èª€ãããçã®èèæè¡ã®äœ¿çšã«é¢ãããã®ïŒã¯_SeedSequence_ã³ã³ã»ããïŒããã³ç¹å®ã®std::seed_seq
å®è£
ïŒããã®ä»äºã¯ãå®å
šã«ä»»æã®PRNGã«ã·ãŒãããŒã¿ãæäŸããããšã§ãã
äžè¬ã«ãã»ãšãã©ãã¹ãŠã®PRNGã¯ãã©ã³ãã ãããã§åæå/ã·ãŒããããããšãæåŸ
ããŠããŸãã ïŒããšãã°ïŒ random.org
ããåºãŠããã©ã³ãã ããããšãããã¢ã«ãŽãªãºã çãªãã®ïŒCS PRNGãããã·ã¥é¢æ°ãªã©ïŒããåºãŠããã©ã³ãã ãããã«ã€ããŠã¯ãç¹ã«éæ³ã®ãããªãã®ã¯ãããŸããã
åãã¹ããŒã ããã®PRNGã®ã³ã¬ã¯ã·ã§ã³ã«ã€ããŠããã¹ãŠç¬èªã®ã©ã³ãã ããããã·ãŒããããŠãããšèããã®ã¯ããªãç°¡åã§ãã ç§ãã¡ãè¡ã£ãŠããããšã¯ãç·ïŒããšãã°ã 2 ^ 255ãã€ã³ãã®ç·ïŒã _n_ééãèŠæ±ããå Žåã«ãããééãå¥ã®ééãšéãªã確çãèšç®ã§ããŸãã ããã¯ããªãåºæ¬çãªç¢ºçã§ãâïŒç§ãç解ããŠããããã«ïŒåçæ°åŠãå«ãè«æã«èª°ãè奮ããŠããªãã®ã§ãããã«ã€ããŠè«æãçºè¡šã§ãããã©ããã¯ããããŸããã ïŒ @lemireã¯åæããªããããããŸããïŒïŒ
[ç§ã¯ãããªããäžè¬çã«ãã¹ãã§ã¯ãªãããšã¯ãã©ã³ãã ãªããããããèªäœããåºãŠããPRNGãã·ãŒãããããšã§ãããšäž»åŒµããŸãã ããã¯ç§ã«ã¯ããŸãã«ãè¿èŠªçžå§Šã ãšæããŸãã]
確ãã«ãé©åã«èšèšããã_SeedSequence_ã®ãããªãã®ã䜿çšãããšãä»»æã®åæã·ãŒããååŸããã¢ã«ãŽãªãºã ã®ãµã€ã¯ã«ã§éè€ããŠã¯ãªããªãè€æ°ã®éå§ç¹ãæç»ããæ¹æ³ã«ãªãããšã¯æããã§ãã ãããŠããããç¬ç«ããã¹ããªãŒã ãååŸããå¯äžã®çŸå®çãªæ¹æ³ã§ããå Žåã¯ãããã§ãã ããã䟿å©ã«ããã®ã¯APIèšèšã®åé¡ã§ãã
ç§ãããŸãã¯ã£ããããŠããªãã®ã¯ãåæåãããPRNGã®çŸåšã®ç¶æ
ãååŸããã¹ããªãŒã IDã§ããã·ã¥ããã¯ã¹ããŠããµã€ã¯ã«å
ã®æ°ããç¶æ
ã«ãžã£ã³ãããããšãã©ãã»ã©å®å
šããšããããšã§ããããã¯ãããªããææ¡ããŠãããšæã£ãŠãããã®ã§ãïŒåŸã§ç§ã¯ããã«ã€ããŠééã£ãŠãããããããªããšæããŸããïŒã jumped()
ã®å€±æã瀺ãããã«ããµã€ã¯ã«å
ã§ååã«åé¢ãããŠããããšã ããèŠå ã§ã¯ãããŸããã jumped()
ã¯ãéè€ããªãã·ãŒã±ã³ã¹ã®é ãéšåã«éä¿¡ãããããšãä¿èšŒããŸãã ãžã£ã³ããé©åã«éžæãããŠããªãå Žåãæåã®éšåãšéåžžã«åŒ·ãçžé¢ããå¯èœæ§ãããéšåã«ãããŸããã è¯ããžã£ã³ããšã¯äœããç¥ãã«ã¯ãåã¢ã«ãŽãªãºã ã®å
éšã«é¢ããç¥èãå¿
èŠã«ãªãå ŽåããããŸãã PCGã®å Žåã¯æããã«ããŸããã§ããã
åºæ¬çã«ãPRNGãé·ç§»é¢æ°ããã³åºåé¢æ°ãšèãããšããã®new_state = seed_seq(old_state||streamID)
ã¯ã1ã€ã®ã¹ãããã§ãããããããã1ã€ã®é·ç§»é¢æ°ã«ãããŸããã ãã®seed_seq
é¢é£ããæäœããåPRNGã¢ã«ãŽãªãºã ïŒãŸãã¯ãã®éé¢æ°ïŒã®é·ç§»é¢æ°ãšååã«ç°ãªãããšã確èªããå¿
èŠããããããããä»ã®ããšã確èªããå¿
èŠããããŸãã ç§ã¯ãèšããããæ§ç¯ããããã®ã䜿çšããããšã¯æããªãã§ãããwyhash
åæåããããã«wyrand
ã ããªããèšãããã«ãããªãã¯ããèªèº«ã®ããã«ããããæäŸããããã«PRNGèªäœã䜿çšããããããŸããã ãã®ããããã¹ãŠã®PRNGã«ã€ããŠãããä¿èšŒããããã«ããã€ãã®èª¿æ»ãå¿
èŠã ãšæããŸãïŒèªåã§è¡ãå¿
èŠããªãããšãæãã§ãã調æ»ïŒã
äžæ¹ã new_state = seed_seq(old_state||streamID)
ã¯ããã®ç¹ã§ãè€æ°ã®ã¹ããªãŒã ã«å¯Ÿãã_SeedSequence_ã®äœ¿çšç®çãããæªããªãå¯èœæ§ããããŸãã2ã€ã®ç¶æ
ãé çªã«åŒãåºããŸãã ãããããªããç§ã¯C ++ã®çµéšã«é Œã£ãŠãããããããªãã®å®è£
ã§ããããŠç§ãã¡ã®ãã¹ãŠã®ã¢ã«ãŽãªãºã ã«ã€ããŠPractRandã§ããã€ãã®çµéšçãã¹ããè¡ã£ãŠãããããã·ã³ã°ã«ã¹ããªãŒã ã®å¯Ÿå¿ç©ããæªããªãããšã瀺ããŠã倧äžå€«ã§ãããã
ããã·ã¥ãžã£ã³ããæ©èœããããšãPRNGã調æŽãªãã§çæããããã®ããã€ãã®ãŠãŒã¹ã±ãŒã¹ãéããããããéåžžã«äŸ¿å©ã§ãã ã¹ããªãŒã IDã䜿çšããã«ã¯ãéä¿¡ãŸãã¯äºåå²ãåœãŠãå¿
èŠã§ãã dask
ã¯éå»ã«ãã®ãããªãã®ãæ±ããŠããŸããã
æ£ããããšãè¡ãã®ã«äŸ¿å©ãªãé©åãªã·ãŒãã®ã¿ã«äŸåããé©åãªä»£æ¿æ段ãããå Žåã¯ãããã©ã«ãã®éžæåºæºãšããŠèšå®å¯èœãªã¹ããªãŒã ãåé€ããå¿ èŠããããŸãã ååã«å€§ããªç¶æ 空éãæã€ããã©ã«ãã®ã¢ã«ãŽãªãºã ãå¿ èŠã§ãã
ãšã¯ããã 63ãããã®ããã·ã¥ã䜿çšããŠã·ãŒã±ã³ã·ã£ã«ã¹ããªãŒã IDïŒ range(N)
ïŒããPCG32
å¢åãå°åºããããšã¯æ©èœããŠããããã«èŠããŸãã 8192ã®ã€ã³ã¿ãŒãªãŒããããã¹ããªãŒã ã¯ãPractRandã2TiBã«æž¡ããŸãã PCGãžã§ãã¬ãŒã¿ãŒã®ã¹ããªãŒã IDãå
¬éããå Žåã¯ãä»ã®æ段ã䜿çšããŠç¬ç«ããã¹ããªãŒã ãåçŸå¯èœã«ååŸããããšãææ¡ãããšããŠãããã®ææ³ã䜿çšããŠå¢åãå°åºããããšããå§ãããŸãã
ç§ãããŸãã¯ã£ããããŠããªãã®ã¯ãåæåãããPRNGã®çŸåšã®ç¶æ ãååŸããã¹ããªãŒã IDã§ããã·ã¥ããã¯ã¹ããŠããµã€ã¯ã«å ã®æ°ããç¶æ ã«ãžã£ã³ãããããšãã©ãã»ã©å®å šããšããããšã§ããããã¯ãããªããææ¡ããŠãããšæã£ãŠãããã®ã§ãïŒåŸã§ç§ã¯ããã«ã€ããŠééã£ãŠãããããããªããšæããŸããïŒã
ç§ã¯ããããææ§ã«èªåèªèº«ãè¡šçŸããŸããããããããPRNGã®çŸåšã®ç¶æ ãèªå·±åã·ãŒãã«äœ¿çšããããšãææ¡ããã€ããã¯ãããŸããã§ããã
ããããFWIWãSplitMixã¯ãããè¡ããŸããããã¯ã split()
æäœãè¡ãããšã§ãã ãããŠãç§ã¯ããããããããã®ã奜ãã§ã¯ãããŸããã
ããã¯æ
å ±ãå€ããããããããŸããããSplitMixã®split()
é¢æ°ã«ãã£ãŠç§ãææãæããïŒããããç§ãæ¬æ¥ãããææãæããïŒçç±ã«ã€ããŠå°ãã話ãããŸãã æŽå²çãªã¡ã¢ãšããŠãSplitMixãšPCGã¯ã»ãŒåæã«ç¬ç«ããŠèšèšãããŸããïŒSplitMixã¯2014幎10æ20æ¥ã«å
¬éãããŸãããã pcg-random.org
ã¯2014幎8æã«å
¬éããã2014幎9æ5æ¥ã«PCGããŒããŒã«ãªã³ã¯ãããŸããïŒã PCGãšSplitMixïŒããã³Vignaã®xor shift *ãxorshift +ãå«ãä»ã®ããŸããŸãªPRNGâ 2014幎ã«äžçã«ãªãªãŒã¹ããããã®ïŒã®éã«ã¯ããã€ãã®é¡äŒŒç¹ããããŸãã ãã¹ãŠã«ãã¹ã¯ã©ã³ããªã³ã°åºåé¢æ°ã«ãã£ãŠä¿®æ£ããããããªãåçŽãªãååã§ã¯ãªãç¶æ
é·ç§»é¢æ°ããããŸãã ç§ãPCGã®è«æãæžããŠãããšããäžéšã®äººã
ãæãã§ããããšãç¥ã£ãŠããã®ã¯split()
é¢æ°ã§ãããããããè¡ãããã®è¯ãæ¹æ³ãèŠã€ããããšãã§ããŸããã§ããã 代ããã«ãåã¹ãããã§å·ŠãŸãã¯å³ã«ç§»åã§ãã_k_ãããPRNGãããå Žåã_k_ã¹ãããå
ã§ã以åã®ç¶æ
ã«å°éã§ããå¿
èŠããããšããç°¡åãªèšŒæãäœæããŸãããããã«ãããã³ã³ã»ããå
šäœã蚌æãããŸããæããããªãã£ãã ãã®èŠ³å¯ã¯ãããè«æã«å
¥ããŸããã§ããã ãããããã®èšŒæã®åã«ç§ã®èããçèããçµæãè«æã®æçµãã©ããã«è¿ãè泚ã§ãPCGã®åºåã¯ãã®ç¶æ
ã®ããã·ã¥/ã¹ã¯ã©ã³ãã«/é åã§ãã£ããããå°ãæ°ãŸããã«ææ¡ããŸããããããããæãããããžã§ãã¬ãŒã¿ãŒãç¬èªã®åºåã§åã·ãŒãããŠããããåé¿ããããšãã§ããŸãã PRNGãç¬èªã®ç¶æ
ã§åã·ãŒãããããšã¯ãPRNGã®èª€çšã®äžçš®ã§ãããšåºãèããããŠããããããã®ãããªæ°ãŸããã¯ã¬ãã¥ãŒæ
åœè
ã«ãšã£ãŠèµ€æã«ã¯å€§ãããããšèãããããæçµããŒãžã§ã³ããåé€ããŸããããããã䜿çšããçµéšã®ãªã人ã
ããç§ãã¡ãèŠããã®ã®ã
SplitMixã®è«æãèªãã§ã奜ããªãã®ãããããèŠã€ãããŸãããã split()
ãèŠãŠããšãŠãã³ã£ããããŸããã ããã¯ç§ãåºæ¬çã«åè«ã ãšæã£ãŠããäœããããŠããããããã°ã€ãã³ãã«ããŸããã æ°å¹ŽåŸãç§ã¯ããªãããã®çš®ã®æäœãããŠãããšãã«äœãèµ·ãããã«ã€ããŠããæè¡çãªæ·±ãã§æžãããšã«åãæãããŸããã
å šäœçãªãã€ã³ãã¯ãç¶æ 空éãååã«å€§ããå ŽåïŒãããŠãSplitMixã¯ã»ãšãã©ååã§ã¯ãªãå ŽåïŒãããã·ã¥é¢æ°ãä»ããèªå·±åã·ãŒãã§åé¿ã§ããå¯èœæ§ããããšããããšã§ãã ããã¯è¯ãèãã§ã¯ãªããšä»ã§ãæããŠããŸãã ã©ã³ãã ãããã³ã°ïŒãã®ç¶æ³ã§æ±ã£ãŠãããã®ïŒã«ã¯ãã挞è¿ç¢ºçããŒãã§ã¯ãªããããé¢æ°ã°ã©ãã®æãé«ãããªãŒãæãé·ããµã€ã¯ã«ã«æ ¹ãããŠããªãããªã©ã®ããããã£ããããããå®å šãªä¿¡é ŒãåŸãã®ã¯é£ãããšæããŸããèšèšè ããã®ãããªç ç¶ãèšèšã«ååšããªãããšã瀺ãããã«å¿ èŠãªäœæ¥ã«è¡ã£ãŠããªãéãã
楜ãã¿ã®ããã«ãSplitMixã®å°ããªããŒãžã§ã³ã®ç¶æ
空éã®ãã³ãã次ã«ç€ºããŸãã next()
ãšsplit()
ãçµã¿åããã3ã€ã®ç°ãªãïŒãããŠå³å¯ã«åºå®ãããïŒæ¹æ³ãæ¢ã£ãŠããŸãã
Testing: SplitMix16: void advance() { rng = rng.split();}
Finding cycles...
- state 00000000 -> new cycle 1, size 4, at 000043b0 after 516 steps
- state 00000050 -> new cycle 2, size 41, at 00002103 after 2 steps
- state 000000cd -> new cycle 3, size 4, at 0000681a after 6 steps
- state 00000141 -> new cycle 4, size 23, at 00004001 after 11 steps
- state 00000dee -> new cycle 5, size 7, at 00007436 after 4 steps
- state 00008000 -> new cycle 6, size 90278, at 5e5ce38c after 46472 steps
- state 00030000 -> new cycle 7, size 6572, at 12c65374 after 10187 steps
- state 00030016 -> new cycle 8, size 3286, at 65d0fc0c after 402 steps
- state 00058000 -> new cycle 9, size 17097, at 2a2951fb after 31983 steps
- state 08040000 -> new cycle 10, size 36, at 08040000 after 0 steps
- state 08040001 -> new cycle 11, size 218, at 08040740 after 360 steps
- state 08040004 -> new cycle 12, size 10, at 38c01b3d after 107 steps
- state 08040006 -> new cycle 13, size 62, at 38c013a0 after 39 steps
- state 08040009 -> new cycle 14, size 124, at 08045259 after 24 steps
- state 08040019 -> new cycle 15, size 32, at 38c06c63 after 151 steps
- state 08040059 -> new cycle 16, size 34, at 38c00217 after 17 steps
- state 08040243 -> new cycle 17, size 16, at 38c06e36 after 13 steps
- state 123c8000 -> new cycle 18, size 684, at 77d9595f after 194 steps
- state 123c8002 -> new cycle 19, size 336, at 5de8164d after 141 steps
- state 123c9535 -> new cycle 20, size 12, at 123c9535 after 0 steps
- state 139f0000 -> new cycle 21, size 545, at 743e3a31 after 474 steps
- state 139f0b35 -> new cycle 22, size 5, at 139f0b35 after 0 steps
- state 139f1b35 -> new cycle 23, size 5, at 68d3c943 after 8 steps
Cycle Summary:
- Cycle 1, Period 4, Feeders 32095
- Cycle 2, Period 41, Feeders 188
- Cycle 3, Period 4, Feeders 214
- Cycle 4, Period 23, Feeders 180
- Cycle 5, Period 7, Feeders 12
- Cycle 6, Period 90278, Feeders 1479024474
- Cycle 7, Period 6572, Feeders 102385385
- Cycle 8, Period 3286, Feeders 5280405
- Cycle 9, Period 17097, Feeders 560217399
- Cycle 10, Period 36, Feeders 413
- Cycle 11, Period 218, Feeders 51390
- Cycle 12, Period 10, Feeders 1080
- Cycle 13, Period 62, Feeders 4113
- Cycle 14, Period 124, Feeders 4809
- Cycle 15, Period 32, Feeders 2567
- Cycle 16, Period 34, Feeders 545
- Cycle 17, Period 16, Feeders 87
- Cycle 18, Period 684, Feeders 95306
- Cycle 19, Period 336, Feeders 100263
- Cycle 20, Period 12, Feeders 7
- Cycle 21, Period 545, Feeders 163239
- Cycle 22, Period 5, Feeders 12
- Cycle 23, Period 5, Feeders 34
- Histogram of indegrees of all 2147483648 nodes:
0 529334272
1 1089077248
2 528875520
3 131072
4 65536
Testing: SplitMix16: void advance() { rng.next(); rng = rng.split();}
Finding cycles...
- state 00000000 -> new cycle 1, size 36174, at 6b34fe8b after 21045 steps
- state 00000002 -> new cycle 2, size 4300, at 042a7c6b after 51287 steps
- state 0000000f -> new cycle 3, size 11050, at 0b471eb5 after 4832 steps
- state 0000001d -> new cycle 4, size 38804, at 2879c05c after 16280 steps
- state 00000020 -> new cycle 5, size 4606, at 46e0bdf6 after 7379 steps
- state 00046307 -> new cycle 6, size 137, at 0a180f87 after 89 steps
- state 00081c25 -> new cycle 7, size 16, at 177ed4d8 after 27 steps
- state 0044c604 -> new cycle 8, size 140, at 5e1f125b after 44 steps
- state 006e329f -> new cycle 9, size 18, at 006e329f after 0 steps
- state 13ebcefc -> new cycle 10, size 10, at 13ebcefc after 0 steps
Cycle Summary:
- Cycle 1, Period 36174, Feeders 975695553
- Cycle 2, Period 4300, Feeders 766130785
- Cycle 3, Period 11050, Feeders 110698235
- Cycle 4, Period 38804, Feeders 251133911
- Cycle 5, Period 4606, Feeders 43723200
- Cycle 6, Period 137, Feeders 4101
- Cycle 7, Period 16, Feeders 172
- Cycle 8, Period 140, Feeders 2310
- Cycle 9, Period 18, Feeders 124
- Cycle 10, Period 10, Feeders 2
- Histogram of indegrees of all 2147483648 nodes:
0 529334272
1 1089077248
2 528875520
3 131072
4 65536
Testing: SplitMix16: void advance() { rng.next(); rng = rng.split(); rng = rng.split();}
Finding cycles...
- state 00000000 -> new cycle 1, size 40959, at 0069b555 after 49520 steps
- state 00000031 -> new cycle 2, size 1436, at 5f619520 after 2229 steps
- state 000003a4 -> new cycle 3, size 878, at 18d1cb99 after 1620 steps
- state 0000046c -> new cycle 4, size 2596, at 46ba79c0 after 1591 steps
- state 0000c6e2 -> new cycle 5, size 24, at 0212f11b after 179 steps
- state 000af7c9 -> new cycle 6, size 61, at 40684560 after 14 steps
- state 00154c16 -> new cycle 7, size 110, at 29e067ce after 12 steps
- state 0986e055 -> new cycle 8, size 4, at 2b701c82 after 7 steps
- state 09e73c93 -> new cycle 9, size 3, at 352aab83 after 1 steps
- state 19dda2c0 -> new cycle 10, size 1, at 78825f1b after 2 steps
Cycle Summary:
- Cycle 1, Period 40959, Feeders 2129209855
- Cycle 2, Period 1436, Feeders 5125630
- Cycle 3, Period 878, Feeders 7077139
- Cycle 4, Period 2596, Feeders 5997555
- Cycle 5, Period 24, Feeders 24221
- Cycle 6, Period 61, Feeders 1774
- Cycle 7, Period 110, Feeders 1372
- Cycle 8, Period 4, Feeders 23
- Cycle 9, Period 3, Feeders 4
- Cycle 10, Period 1, Feeders 3
- Histogram of indegrees of all 2147483648 nodes:
0 829903716
1 684575196
2 468475086
3 132259769
4 32192209
5 58402
6 17026
7 1982
8 261
9 1
Testing: SplitMix16: void advance() { rng.next(); rng.next(); rng = rng.split();}
Finding cycles...
- state 00000000 -> new cycle 1, size 55038, at 3e57af06 after 30005 steps
- state 00000005 -> new cycle 2, size 376, at 4979e8b5 after 6135 steps
- state 0000001e -> new cycle 3, size 10261, at 0cd55c94 after 1837 steps
- state 0000002d -> new cycle 4, size 3778, at 7f5f6afe after 3781 steps
- state 00000064 -> new cycle 5, size 2596, at 3bc5404b after 5124 steps
- state 0000012b -> new cycle 6, size 4210, at 525cc9f3 after 397 steps
- state 00000277 -> new cycle 7, size 1580, at 410010c8 after 1113 steps
- state 00001394 -> new cycle 8, size 916, at 7b20dfb0 after 193 steps
- state 00063c2d -> new cycle 9, size 51, at 6e92350b after 121 steps
- state 058426a6 -> new cycle 10, size 8, at 058426a6 after 0 steps
- state 0e5d412d -> new cycle 11, size 1, at 0e5d412d after 0 steps
- state 4c2556c2 -> new cycle 12, size 1, at 4c2556c2 after 0 steps
Cycle Summary:
- Cycle 1, Period 55038, Feeders 2027042770
- Cycle 2, Period 376, Feeders 28715945
- Cycle 3, Period 10261, Feeders 49621538
- Cycle 4, Period 3778, Feeders 13709744
- Cycle 5, Period 2596, Feeders 15367156
- Cycle 6, Period 4210, Feeders 10418779
- Cycle 7, Period 1580, Feeders 1782252
- Cycle 8, Period 916, Feeders 744273
- Cycle 9, Period 51, Feeders 2351
- Cycle 10, Period 8, Feeders 24
- Cycle 11, Period 1, Feeders 0
- Cycle 12, Period 1, Feeders 0
- Histogram of indegrees of all 2147483648 nodes:
0 529334272
1 1089077248
2 528875520
3 131072
4 65536
ç
ããããããã ç§ã¯æ°å¹Žåã«èªåã§ãããã®ç·ã«æ²¿ã£ãŠããã€ãã®ææ¡ãæã¡èœãšããã®ã§ãç§ãã¡ã¯äœãè¯ããã®ãéããã®ã§ã¯ãªãããšå¿é ããŸããã :-)
PCGã¹ããªãŒã ã®å¢åãå°åºããããã®ããã·ã¥ã¢ãââããŒãã«é¢ããæçµçãªèãã¯ãããŸããïŒ ãããç¬ç«ããã¹ããªãŒã ãååŸããããã®äž»ãªã¡ã«ããºã ã§ãããã©ããã¯ããŠããã ãã®æ©èœãžã®ã¢ã¯ã»ã¹ãå®å šã«åé€ããããšãé€ãã°ãããã¯ã誀çšãããããã·ãŒã±ã³ã·ã£ã«ã¹ããªãŒã IDãé²ãããã«ç§ãã¡ãããããããšã®ããã«æããŸãã
奜å¥å¿ãããPCG64ã§2ã€ã®ç¶æ ãã©ãã ãé¢ããŠããããç¥ãïŒç°¡åãªïŒæ¹æ³ã¯ãããŸããïŒ
ã¯ããå ¬éããŠããŸãããïŒ http ïŒ
奜å¥å¿ãããPCG64ã§2ã€ã®ç¶æ ãã©ãã ãé¢ããŠããããç¥ãïŒç°¡åãªïŒæ¹æ³ã¯ãããŸããïŒ
ã¯ããå ¬éããŠããŸãããïŒ http ïŒ
C ++ãœãŒã¹ã§ã¯ãdistanceé¢æ°ã¯ã¹ããªãŒã éã®è·é¢ã瀺ããæãè¿ãã¢ãããŒãã®ãã€ã³ãã瀺ããŸãïŒã¹ããªãŒã éã®å¯äžã®éãã¯è¿œå ãããå®æ°ã§ãïŒã
ã¡ãªã¿ã«ãåºç€ãšãªãLCGã®å Žåãè·é¢ã䜿çšããŠãäœçœ®ãšã®çžé¢é¢ä¿ãèšç®ã§ããŸãã çãè·é¢ã¯æããã«æªãã§ãïŒãããŠPRNGã«ã¯ãŸã£ããæªãã§ãïŒãã1ããããèšå®ããã ãã®è·é¢ãè¯ããããŸããããã®ãã2 ^ 64ïŒ 0x10000000000000000
ïŒã«ãžã£ã³ãããŸãã .jumped
ã¯æªãèãã§ãã ç§ã®PCGã®ããããšãªã¹ãã«ã¯ã2ã€ã®ç¶æ
éã®è·é¢ã調ã¹ãè·é¢ãã©ãã»ã©ã©ã³ãã ã«èŠãããã瀺ãã independence_score
ãé¢æ°ãèšè¿°ããŠããŸãïŒããã³ã°éã¿ãªã©ã䜿çšããŸããçæ³çã«ã¯ãçŽååãå¿
èŠã§ãããããã¯0ãšååã«ãªãããããã¯èªç±ã«åæ£ãããŸãïŒã
PCG64ã§jumped
ã_keep_ãã1ã€ã®æ¹æ³ã¯ã n * 0x10000000000000000
ãžã£ã³ãããã®ã§n * 0x9e3779b97f4a7c150000000000000000
ãªãã .jumped(3).jumped(5) == .jumped(8)
ïŒãåŸãããŸãã
ïŒã 0x10000000000000000
é²ãã§ã¯ãããªãããšããã®ã¯ããŸãããã®ããã«åå¿ããªãã§ãã ããããšããããšãæ¿ç¥ããŠindependence_score
ãååšããå¯èœæ§ãããã®ã¯
PCGã¹ããªãŒã ã®å¢åãå°åºããããã®ããã·ã¥ã¢ãââããŒãã«é¢ããæçµçãªèãã¯ãããŸããïŒ ãããç¬ç«ããã¹ããªãŒã ãååŸããããã®äž»ãªã¡ã«ããºã ã§ãããã©ããã¯ããŠããã ãã®æ©èœãžã®ã¢ã¯ã»ã¹ãå®å šã«åé€ããããšãé€ãã°ãããã¯ã誀çšãããããã·ãŒã±ã³ã·ã£ã«ã¹ããªãŒã IDãé²ãããã«ç§ãã¡ãããããããšã®ããã«æããŸãã
Murmur3ãããµãŒã«éãããšããå§ãããŸãã æå³çãªåªåãªãã«ã誀ã£ãŠåæ§ã®ã¹ããªãŒã ãäœæããå¯èœæ§ã¯ãããŸããã ïŒç·šéïŒ128ãããããŒãžã§ã³ãå¿
èŠã ãšæããŸãããäžååãšäžååãæ··åšãããããšãã§ããŸããå®æ°ãè¿œå ããŸãã誰ãã0x9e3779b97f4a7c15f39cc0605cedc835
ïŒÏã®å°æ°éšåïŒãæããŠããŸããã 0xb7e151628aed2a6abf7158809cf4f3c7
ïŒeã®å°æ°éšåïŒãåé¡ãããŸããããŸãã¯ãã©ã³ãã ã«èŠããæ°ã§ããïŒ
wyhashïŒhttps://github.com/wangyi-fudan/wyhashïŒã¯ãBigCrushãšPractRandãééããæéã§æãåçŽãªãã®ãªã®ã§ããå§ãããŸãã cã³ãŒãã¯æ¬¡ã®ããã«åçŽã§ã
inline uint64_t wyrand(uint64_t *seed){
*seed+=0xa0761d6478bd642full;
__uint128_t t=(__uint128_t)(*seed^0xe7037ed1a0b428dbull)*(*seed);
return (t>>64)^t;
}
@ wangyi-fudanããããå šåå°ã ãšèªåã«çŽåŸãããããšã¯ã§ããŸããã
ç§ã®éãããç¥èã§ç³ãèš³ãããŸããïŒãªãPRNGã«å
šåå°ãå¿
èŠ/奜ãŸããã®ã§ããïŒ
ããã€ãã®èª¬æã«æè¬ããŸãïŒ-ïŒ @ imneme
@ wangyi-fudanã64ãããintãã64ãããintãžã®ããã·ã¥é¢æ°ãå šåå°ã§ãªãå ŽåïŒã€ãŸãã1察1ã®é¢æ°ïŒãäžéšã®çµæã¯è€æ°åçæãããäžéšã¯ãŸã£ããçæãããŸããã ããã¯äžçš®ã®ãã€ã¢ã¹ã§ãã
äœãèšãããã®ãç解ããã ãã ãã64ãããã®ä¹±æ°ãžã§ãã¬ãŒã¿ãŒRã®å Žåã1.2 * 2 ^ 32ã®ä¹±æ°ïŒhttp://mathworld.wolfram.com/BirthdayAttack.htmlïŒã®åŸã«1åã®è¡çªãäºæ³ãããŸãã 2 ^ 64ã®ä¹±æ°ã§ã¯ãå€ãã®è¡çªãçºçããã®ã¯èªç¶ãªããšã§ãã è¡çªã¯èªç¶ã§ãããå šåå°ã¯èªç¶ã«ã©ã³ãã ã§ã¯ãããŸããã ã®ã£ã³ãã«ããŒãã«ïŒããšãã°ã3ãããPRNGïŒã8ãã¬ã€ã«å ã§0ã®å€ã§ãããšå€æãããå Žåã5ã€ã®éãŒãã芳å¯ããåŸããããŠãŒãã«å€§ããªè³ããããŸãã
@ wangyi-fudanããã®ã³ã³ããã¹ãã§ã¯ãã¹ããªãŒã IDã䞊ã¹æ¿ããŠã1,2,3ã®ãããªã¹ããªãŒã ãããã©ã³ãã ã«èŠããããã«ããæ¹æ³ã«ã€ããŠè©±ããŠããŸããïŒå¥åãããæ£åžžïŒã ãã®ããã»ã¹ã§ã®è¡çªã«ã¯çŸåŸ³ã¯ãããŸããã
äžè¬çãªPRNGã®å Žåãã©ã³ãã ãããã³ã°ã«åºã¥ãPRNGãšã©ã³ãã å¯éãããã³ã°ïŒ1察1é¢æ°ïŒã«åºã¥ãPRNGã®éãã確èªããå¿ èŠããããŸãã ç§ã¯ããã«ã€ããŠæžããŸããããä»ã®äººãããã§ãã ãµã€ãºãå°ãããããã©ã³ãã ãããã³ã°ã«åºã¥ãPRNGã¯ãã€ã¢ã¹ã瀺ããä»ã®ææ³ã«åºã¥ãPRNGãããæ©ã倱æããŸãã ãµã€ãºã倧ãããšãããããçš®é¡ã®æ¬ é¥ãæ€åºããã®ãé£ãããªãå¯èœæ§ããããŸãã
_n_ééãèŠæ±ããå Žåã«ãããééãå¥ã®ééãšéãªã確çãèšç®ã§ããŸãã ããã¯ããªãåºæ¬çãªç¢ºçã§ãâïŒç§ãç解ããŠããããã«ïŒåçæ°åŠãå«ãè«æã«èª°ãè奮ããŠããªãã®ã§ãããã«ã€ããŠè«æãçºè¡šã§ãããã©ããã¯ããããŸããã
ç§ã¯ããªããããšãŒã«ã»ã¬ã¯ã€ã€ãŒã§ãªããã°ãªããªããšæããŸãã ;-) 15ããŒãž
ã¯ãã圌ãåºæ¬ã説æãããšããããã¯å€§äžå€«ã ãšèããããŸãïŒ
@rkern @imnemeã·ã³ãã«ãã¯ããœãããŠã§ã¢ãšæ°åŠã®äž¡æ¹ã®æ©èœã§ãã åçŽãªäœæ¥ã«æéãåããªã人ããããšããããšã¯ãççŸãã蚌æ ãšèŠãªãããã¹ãã§ã¯ãããŸããã
@lemire ïŒ _ã³ã³ãã¥ãŒã¿ãŒç§åŠè ãæ¹å€ããæ¹æ³_ãšåŒã°ãããç§ã奜ããªãŠãŒã¢ã¢ã®äœåããããããããŸãã ãã®äœåã®èåŸã«ããæ ¹æ¬çãªèãæ¹ã¯ãçè«å®¶ã¯æŽç·Žã奜ã¿ãå®éšå®¶ã¯åçŽãã奜ããšãããã®ã§ãã ãããã£ãŠãèŽè¡ãå®éšå®¶ã®1人ã§ããå Žåã圌ãã¯åçŽãã«åã¶ã§ãããããèŽè¡ãçè«å®¶ã®1人ã§ããå Žåãããã»ã©å€ãã¯ãããŸããã
ããã©ã«ãã®BitGenerator
ã¯PCG64
ã§ãã æãããã®ããè²¢ç®ãããããšãããããŸããã ãããŠã¹ã¿ããïŒ
ãã®ã¹ã¬ããã«éåžžã«è§ŠçºãããŠãç§ã¯å ±åããããã€ãã®ãã¥ãŒã¹ããããŸãâŠ
å€ãã®ç¹ã§ã pcg64
ã¯ããªãè¯ãã§ãã ããšãã°ãçµ±èšçå質ã®éåžžã®æž¬å®ã§ã¯ãã¯ãªãŒã³ãªå¥åº·ç¶æ
ãåŸãããŸãã ããŸããŸãªæ¹æ³ã§ãã¹ããããŠããŸãã æè¿ã§ã¯ãPractRandã䜿çšããŠåãã¿ãã€ããŸã§å®è¡ããŸããã éåžžã®ãŠãŒã¹ã±ãŒã¹ã§ããŸãæ©èœããŸãã
ãããããã®ã¹ã¬ããã§çºçããç ç¶ã¯ç§ã«ã¯ããåããŸããã§ããã 確ãã«ãããŸãããã®ããã«ä¿æããªãã§ãã ããã
ããã§ãçŽ25æ¥åã«ãPCGãã¡ããªãŒã®æ°ããã¡ã³ããŒãèšèšããããšãèãå§ããŸããâŠ
ç§ã®ç®æšã¯ãçŸåšã®pcg64
ããªã¢ã³ãã®ä»£ããã«ãªãå¯èœæ§ã®ããæ°ããPCGãã¡ããªãŒã¡ã³ããŒãèšèšããããš
pcg64
ãšã»ãŒåããããéãïŒãŸãã¯éãïŒã¯ãã§ãããã€ãã®ããã«ãã§ããã ãæ©ãæé«ã®å質ãåŸãããšããããããã¬ãŒããªãããããŸãã é床ããŸã£ããæ°ã«ããªãå Žåã¯ãåºåé¢æ°ã«ããã«å€ãã®ã¹ããããè¿œå ããŠãããé«åºŠã«ã¹ã¯ã©ã³ãã«ãããåºåãçæã§ããŸãããPCGã®ãã€ã³ãã¯ãåºç€ãšãªãLCGããã»ãŒååãã§ãããããå¿ èŠãããŸããã§ããã 1ãã€å¢å ããã«ãŠã³ã¿ãŒã®ãããªãã®ã§è¡ãã®ãšåããããå€ãã®åªåãããŸãã
æåãå ±åã§ããããšãããããæããŸãã ç§ãæåã«ããã«ã€ããŠèããŠããçŽ25æ¥åãç§ã¯å®éã«äŒæäžã§ããã çŽ10æ¥åã«æ»ã£ããšããèªåãæã£ãŠããã¢ã€ãã¢ãè©ŠããŠã¿ããšãããããŸãæ©èœããŠããããšãããããŸããã ãã®åŸã®æéã¯ãäž»ã«ããŸããŸãªçš®é¡ã®ãã¹ãã«è²»ããããŸããã æšæ¥ã¯ååæºè¶³ããŠããã®ã§ãã³ãŒããC ++ããŒãžã§ã³ã®PCGã«
FWIWãæ°ããåºåé¢æ°ã¯æ¬¡ã®ãšããã§ãïŒ64ãããåºåã®å ŽåïŒïŒ
uint64_t output(__uint128_t internal)
{
uint64_t hi = internal >> 64;
uint64_t lo = internal;
lo |= 1;
hi ^= hi >> 32;
hi *= 0xda942042e4dd58b5ULL;
hi ^= hi >> 48;
hi *= lo;
return hi;
}
ãã®åºåé¢æ°ã¯ãåºã䜿çšãããŠããxorshift-multiplyã«è§ŠçºãããŠããŸãã ä¹æ°ã®éžæã¯ãïŒaïŒããžãã¯å®æ°ã®æ°ãæããããšãããã³ïŒbïŒé åãå ã«æ»ãããªãããã«ããããšïŒäžäœãããã«ã¢ã¯ã»ã¹ã§ããªãå ŽåïŒã§ããããã©ã³ãã åããã- PCGåºåé¢æ°ãéåžžæã€ãããèªäœãã®å質ã
0xda942042e4dd58b5
ããã®PRNGïŒããã³ãã¹ãŠã®cm_
ãã¬ãã£ãã¯ã¹ä»ã128ãããç¶æ
PCGãžã§ãã¬ãŒã¿ãŒïŒã®LCGä¹æ°ã§ããå ŽåããããŸãã æ¯èŒãããš0x2360ed051fc65da44385df649fccf645
ã§äœ¿çšãããpcg64
ããã®å®æ°ã¯ãåå
è©Šéšæ§ã®ç¹ã§ã¯ãŸã å®éã«ã¯ããªãè¯ãã§ããã128ãããÃ64ããããããç°¡åã§ãããããä¹ç®ã«ãããšå®ãã§ã128ãããÃ128ãããã ç§ã¯ãã®LCGå®æ°ãæ°å¹Žéåé¡ãªã䜿çšããŠããŸããã å®äŸ¡ãªä¹æ°ããªã¢ã³ãã䜿çšããå Žåãåœä»€ã¬ãã«ã®äžŠåæ§ãé«ããããã«ãåºåé¢æ°ãå埩åŸã®ç¶æ
ã§ã¯ãªãå埩åã®ç¶æ
ã§å®è¡ããŸãã
ç§ã¯ããã培åºçã«ãã¹ããïŒPractRandãšTestU01ïŒãæºè¶³ããŠããŸãã ãã¹ãã«ã¯ããã®ã¹ã¬ããã§æŠèª¬ãããŠããã·ããªãªãå«ãŸããŠããŸããïŒããšãã°ãã®ã£ã³ã°ãžã§ãã¬ãŒã¿ãŒãã·ãŒã±ã³ã·ã£ã«ã¹ããŒã ã§äœ¿çšãããã2 ^ 64ã ãé²ããŠãåºåãã€ã³ã¿ãŒãªãŒãããŸãâ4ã€ã®ã®ã£ã³ã°ãš8192ã®ã®ã£ã³ã°ã8TBãŸã§åé¡ãªããã¹ãããŸãããã¹ããªãŒã ãšãã®å察åŽã®åå°ã®å¯Ÿå¿ç©ãšããŠïŒã
é床ãã¹ããšãã³ãããŒã¯ã«ã€ããŠè©³ãã説æããããšãã§ããŸããã ç¹å®ã®ãã³ãããŒã¯ã§ãããPRNGãå¥ã®PRNGãããéãå®è¡ããããã©ããã«åœ±é¿ãäžããããŸããŸãªèŠå ããããŸãããå šäœãšããŠããã®ããªã¢ã³ãã¯ãå€ãã®å Žåãå°ãéããæã«ã¯ã¯ããã«éããæã«ã¯å°ãé ããªãããã§ãã ã³ã³ãã€ã©ãã¢ããªã±ãŒã·ã§ã³ãªã©ã®èŠå ã¯ããã³ãããŒã¯ã®å€åæ§ã«ã¯ããã«å€§ããªåœ±é¿ãåãŒããŸãã
C ++ããããŒã®ãŠãŒã¶ãŒã¯ããã®æ°ãããã¡ããªã¡ã³ããŒã«_now_ãšããŠpcg_engines::cm_setseq_dxsm_128_64
ãšããŠã¢ã¯ã»ã¹ã§ããŸãã å°æ¥ã®ããæç¹ã§ã pcg64
ãpcg_engines::setseq_xsl_rr_128_64
ãããã®æ°ããã¹ããŒã ã«åãæ¿ããŸãã ç§ã®çŸåšã®èšç»ã¯ãPCG2.0ããŒãžã§ã³ã®ãã³ãã®äžéšãšããŠä»å¹Žã®å€ã«ããããããšã§ãã
å šäœãšããŠãç§ã¯ãã®æ°ãã家æã«ãšãŠãæºè¶³ããŠããŸããå€ã®åŸåã®ããæç¹ã§ããã®ã¹ã¬ãããåç §ããŠããå¯èœæ§ãé«ãããã詳现ãªããã°æçš¿ããããŸãã
ãã¡ããããããã©ãããããèããªããã°ãªããŸããã ããªããããã䜿ããã©ããã«é¢ä¿ãªããç§ã¯å®éã«ããªãã®é床ãã³ãããŒã¯ã§ãããè¯ããªããæªããªãããèŠãããã«ããªãèå³ããããŸãã
@imnemeé«éã®ãã«64ãããä¹ç®åšãå¿ èŠã«ãªãã®ãåé¿ã§ããŸããïŒ ïŒããã¯x64ã§ã¯è¶ é«éã§ãããäžéšã®åŒ±ãã¢ãŒããã¯ãã£ã§ã¯å°ãé ããªããŸããïŒ
@lemire ïŒ128ãããÃ64ãããã®ä¹ç®ãããã¯ãx86ã§2ã€ã®ä¹ç®åœä»€ã䜿çšããŠå éšçã«å®è¡ãããŸãïŒäžäœãããã§64ãããÃ64ãããâ128ãããã®çµæãããã³64ãããÃ64 -äžäœãããã®ããããäž¡æ¹ã®ä¹ç®ã䞊è¡ããŠå®è¡ã§ããããã2ã€ã®çµæãå ç®ããå¿ èŠããããŸããïŒ
ããã§ãã128ãããÃ128ããããããåªããŠããå¯èœæ§ããããŸãã ã©ãã ãè¯ããªããã¯ããã®æç¹ã§åœä»€ã¹ã±ãžã¥ãŒãªã³ã°ãã©ãã ãããŸããããã«äŸåããŸããã
ARMã§ã¯ã64ãããÃ64ãããâ128ãããã®çµæã¯å®éã«ã¯2ã€ã®åœä»€ã§ãã
ïŒãã¡ããã2ã€ã®64ãããLCGãçµã¿åãããŠãããããæ··åããããšã¯å®å šã«å¯èœã§ããååšããå¯èœæ§ããããããŸãæ©èœãããã¹ãŠã®PRNGã®ã¹ããŒã¹ã¯ããªã巚倧ã§ããïŒ
ç§ãã¡ã®ãã¬ãŒã ã¯ãŒã¯ã§ã®è¿ éã§æ±ãå®è£ ã¯ãå°ãªããšã64ãããLinuxã§ã¯ãããã©ãŒãã³ã¹ããããã«åäžããããšã瀺åããŠããŸãã
Time to produce 1,000,000 64-bit unsigned integers
************************************************************
MT19937 5.42 ms
PCG64 2.59 ms
PCG64DXSM 2.41 ms
Philox 4.37 ms
SFC64 2.07 ms
numpy 5.41 ms
dtype: object
64-bit unsigned integers per second
************************************************************
MT19937 184.39 million
PCG64 386.01 million
PCG64DXSM 415.02 million
Philox 228.88 million
SFC64 483.94 million
numpy 184.79 million
dtype: object
å°ãªããšããã®ã³ã³ããã¹ãã§ã¯ããã³ããäžããäºåå埩ç¶æ
ããåºåããŠãããšæããŸãã æåã¯ãããçç¥ããåºæ¬çã«PCG64
1.0ãšåãããã©ãŒãã³ã¹ãåŸãŸããã æ¬åœã®åå©ã¯128ããããšãã¥ã¬ãŒã·ã§ã³ã®äžã§ãããšç§ã¯æããããããæžãçããããšãã§ãããéèŠãªãã©ãããã©ãŒã ã§ããããã¹ãããè¯ãæ¹æ³ããªãã
@imnemeããã«ãšã£ãŠã®æ¬åœã®è³ªåã¯ã1.0ã¢ã«ãŽãªãºã ãå®è£
ããnumpy.random.PCG64
ãšããååã§ã©ãã»ã©ã€ã©ã€ã©ããããšããããšã ãšæããŸãã ãªãªãŒã¹ã¯éè¿ã§ããã§ã«é
ããŠããã®ã§ãçŸæç¹ã§ã¯ã¢ã«ãŽãªãºã ãå€æŽããã€ããã¯ãããŸããã 32ããããã©ãããã©ãŒã ã§ã®ããã©ãŒãã³ã¹ãç¹ã«åªããŠããå Žåã¯ã次ã®ãªãªãŒã¹ã§PCG64DXSM
ãè¿œå ããæ°ãªãªãŒã¹åŸã«ããã©ã«ããåæ€èšããå¯èœæ§ããããšæããŸãã
ããã¯ããªãã®éžæã§ãïŒ
PCG64ã®1.0ããŒãžã§ã³ã®çºéã«åé¡ã¯ãããŸããã ä»ã®å€ãã®äººã ããã®å€çš®ã䜿çšããŠããŸãã
DXSMããªã¢ã³ãã«ã¯ããã®ã¹ã¬ããã§çºçãããšããžã±ãŒã¹äœ¿çšã®åé¡ãåé¿ã§ãããšããå©ç¹ããããšæããŸããïŒçµå±ã®ãšããããããååšããçç±ã¯ã»ãšãã©ãããŸãïŒãäžæ¹ã§ãé ãããšããæ¬ ç¹ããããŸããããŒãã£ãŒã 1ãææªæºã®PRNGããŠãŒã¶ãŒã«åºè·ããã®ã¯éåžžã«ç¡è¬ã«æãããããããŸããïŒããã¯ãããå®çžŸã®ããPCGããªã¢ã³ããšåãã¢ã€ãã¢ã«åºã¥ããŠããŸããïŒã
ïŒãšã¯ãããç¡è¬ãã®å¯èœæ§ããããšã®éé£ã«ãããããããããã_my_ã®éžæã ã£ãå Žåã¯ãããããæ°ãããã®ãåºè·ããŸããNumpyã§èµ·åããŠå®è¡ãããŸã§ã®é
延ã¯ãããããã ãšæããŸãããªã¹ã¯ã¯éåžžã«äœãããã§ã«BigCrushã§åŸ¹åºçã«ãã¹ããããPractRandã§16 TBãŸã§ãã¹ãããïŒãµã€ãºã®4åã®1ã§ããcm_mcg_dxsm_64_32
ãå«ã[ã¹ããªãŒã ãªãã32ãããåºå]ïŒã1é±é以å
ã«32TBã«
[ããã©ãŒãã³ã¹ãå°ãè¯ããªã£ãã®ã¯ããããã 5幎åãäºåå埩ç¶æ ã®äœ¿çšã¯ã128ãããä¹æ°ã䜿çšãã128ããããµã€ãºã®æ²èŠ³è«ã§ããã ããããããã¯ãç§ããã¹ãããŠãããã·ã³ã§ãç§ã䜿çšããŠãããã³ãããŒã¯ã§ããã]
2.0ããªã¢ã³ããåç
§ããããã«ãã®ååã䜿çšããå Žåã¯ã1.0ããªã¢ã³ãã«PCG64
ãšããååã䜿çšããããšã«ã€ããŠè©³ãã説æããŸããã
@rkernãããåãªãåœåã®åé¡ã§ããå ŽåãPCG64DXSMãšPCG64ã¯ããããããŸãåºå¥ããŸããã
ãã€ãã人ã«ãšã£ãŠã¯ã確ãã«ã @imnemeããC ++ããŒãžã§ã³ã§ãã®ååã§2.0ããªã¢ã³ããããã¢ãŒããããšãã«ã1.0å®è£
ã«PCG64
ãšããååãä»ããªãããšã奜ããã©ããçåã«æã£ãŠããŸãã ç§ã¯ãååãç·©ããšããããšã¯ãäžéšã®äººã
ãnumpyã®PCG64
ããã¹ãããããã2.0ããŒãžã§ã³ã«ã€ããŠpcg-random.orgã§è¡ããã䞻匵ãšæ¯èŒããå¯èœæ§ããããšããäºå®ã«ææã§ãã ããã»ãžã§ã³ãã³ã®PRNGã«ã€ããŠã®ã»ãŒãã¹ãŠã®äŒè©±ãåç
§ããŠãã ããã
PCGããŒããŒã®ã»ã¯ã·ã§ã³6.3ã«ã¯ã次ã®ããã«æžãããŠããŸãã
ãžã§ãã¬ãŒã¿ãŒã«ã¯ãå®è¡ããé åã«åºã¥ããããŒã¢ããã¯åã衚瀺ãããŸãããPCGã©ã€ãã©ãªã®ãŠãŒã¶ãŒããããã®ããŒã¢ããã¯ã«ãã£ãŠãã¡ããªãŒã¡ã³ããŒãéžæããããšã¯ãã£ãã«ãªãããšã«ã泚æããŠãã ããã ã©ã€ãã©ãªã¯ãåºç€ãšãªãå®è£ ã§ã¯ãªããããããã£ã«åºã¥ããŠååä»ããžã§ãã¬ãŒã¿ãŒãæäŸããŸãïŒããšãã°ãäžæã®ã¹ããªãŒã ãæã€æ±çš32ããããžã§ãã¬ãŒã¿ãŒã®å Žåã¯pcg32_uniqueïŒã ããããã°ãããã©ãŒãã³ã¹ãããã«åäžããå°æ¥ã®å®¶æãçºèŠãããŠè¿œå ããããšãã«ïŒã§ããã°ä»ã®äººã®çºèŠã®ããã«ïŒããŠãŒã¶ãŒã¯ã·ãŒã ã¬ã¹ã«ãããã«åãæ¿ããããšãã§ããŸãã
ãããŠãCããã³C ++ã©ã€ãã©ãªã¯ãã®ããã«æ§æãããŠããŸãã ã©ã€ãã©ãªã¯æäŸããŸã
pcg64
ãããªäŸ¿å©ãªãšã€ãªã¢ã¹ãæäŸããé«ã¬ãã«ã®ã€ã³ã¿ãŒãã§ã€ã¹ããã®ããã«ããŠããšã€ãªã¢ã¹ãæŽæ°ããŠæ°ãã家æãæãããã«ããããšãã§ããŸãããå€ãçµæãæ£ç¢ºã«åçŸããããŠãŒã¶ãŒã¯ãäœã¬ãã«ã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠã以åã¯äŸ¿å©ãªé«ãã§å°éã§ãã家æãéžæããããšãã§ããŸãã -ã¬ãã«ã®ãšã€ãªã¢ã¹ã
PCG64
ãšããPRNGãåºè·ããå Žåã¯ãããã¥ã¡ã³ãã§ãã©ã®ç¹å®ã®PCGããªã¢ã³ãã§ããããã€ãŸããã©ã®ãã¡ããªã¡ã³ããŒã«å¯Ÿå¿ããããäœäœã§ç€ºãã ãã§ååã ãšæããŸãã -ã¬ãã«CãŸãã¯C ++ã©ã€ãã©ãªã€ã³ã¿ãŒãã§ã€ã¹ã
ããã©ã«ãã®ãžã§ãã¬ãŒã¿ãŒã¯ã httpsïŒ//github.com/numpy/numpy/pull/13840ã§np.random.default_gen()
ãšããŠå®è£
ãããŠããŸãã ïŒå°æ¥ã®åç
§ã®ããã«@ rkern ãPRãæ瀺çã«åŒã³åºãããšã¯ããããè¯ãããšã§ã-ããã¯ãªã³ã¯ãæäŸããã ãã®å Žåãéç¥ããªããããGitHubã§ããããèŠéããã¡ã§ããïŒ
1ã€ã®ãã€ããŒãªåé¡ïŒä»£ããã«ãããnp.random.default_generator()
ãšåŒã¶ã®ã¯ã©ãã§ããïŒ gen
ã¯ãç§ã«ã¯çããã/èªæã§ã¯ãªããšæããŠããŸãã ä»ã®äººã®èããæ°ã«ãªããŸãã
代ããã«ãã®np.random.default_generatorïŒïŒãåŒã³åºãã®ã¯ã©ãã§ããïŒ
åãèãnp.random.default_generator()
ãã default_rng
éãã§ã¿ãŸããã
ðç§ã®ãããªdefault_rng
ããè¯ãdefault_gen
ããŸãã«ããã ç§ã¯ãŸã default_generator
åŸããŠããŸããããããã®ããããã«æºè¶³ããŠããŸãã
ïŒ+1ïŒ default_rng()
ã
æãåèã«ãªãã³ã¡ã³ã
ãã®ã¹ã¬ããã«éåžžã«è§ŠçºãããŠãç§ã¯å ±åããããã€ãã®ãã¥ãŒã¹ããããŸãâŠ
ããã¯ã°ã©ãŠã³ã
å€ãã®ç¹ã§ã
pcg64
ã¯ããªãè¯ãã§ãã ããšãã°ãçµ±èšçå質ã®éåžžã®æž¬å®ã§ã¯ãã¯ãªãŒã³ãªå¥åº·ç¶æ ãåŸãããŸãã ããŸããŸãªæ¹æ³ã§ãã¹ããããŠããŸãã æè¿ã§ã¯ãPractRandã䜿çšããŠåãã¿ãã€ããŸã§å®è¡ããŸããã éåžžã®ãŠãŒã¹ã±ãŒã¹ã§ããŸãæ©èœããŸãããããããã®ã¹ã¬ããã§çºçããç ç¶ã¯ç§ã«ã¯ããåããŸããã§ããã 確ãã«ãããŸãããã®ããã«ä¿æããªãã§ãã ããã
ããã§ãçŽ25æ¥åã«ãPCGãã¡ããªãŒã®æ°ããã¡ã³ããŒãèšèšããããšãèãå§ããŸããâŠ
ãŽãŒã«
ç§ã®ç®æšã¯ãçŸåšã®
pcg64
ããªã¢ã³ãã®ä»£ããã«ãªãå¯èœæ§ã®ããæ°ããPCGãã¡ããªãŒã¡ã³ããŒãèšèšããããšpcg64
ãšã»ãŒåããããéãïŒãŸãã¯éãïŒã¯ãã§ãããã€ãã®ããã«ãã§ããã ãæ©ãæé«ã®å質ãåŸãããšããããããã¬ãŒããªãããããŸãã é床ããŸã£ããæ°ã«ããªãå Žåã¯ãåºåé¢æ°ã«ããã«å€ãã®ã¹ããããè¿œå ããŠãããé«åºŠã«ã¹ã¯ã©ã³ãã«ãããåºåãçæã§ããŸãããPCGã®ãã€ã³ãã¯ãåºç€ãšãªãLCGããã»ãŒååãã§ãããããå¿ èŠãããŸããã§ããã 1ãã€å¢å ããã«ãŠã³ã¿ãŒã®ãããªãã®ã§è¡ãã®ãšåããããå€ãã®åªåãããŸãã
ãã¿ãã¬
æåãå ±åã§ããããšãããããæããŸãã ç§ãæåã«ããã«ã€ããŠèããŠããçŽ25æ¥åãç§ã¯å®éã«äŒæäžã§ããã çŽ10æ¥åã«æ»ã£ããšããèªåãæã£ãŠããã¢ã€ãã¢ãè©ŠããŠã¿ããšãããããŸãæ©èœããŠããããšãããããŸããã ãã®åŸã®æéã¯ãäž»ã«ããŸããŸãªçš®é¡ã®ãã¹ãã«è²»ããããŸããã æšæ¥ã¯ååæºè¶³ããŠããã®ã§ãã³ãŒããC ++ããŒãžã§ã³ã®PCGã«
詳现
FWIWãæ°ããåºåé¢æ°ã¯æ¬¡ã®ãšããã§ãïŒ64ãããåºåã®å ŽåïŒïŒ
ãã®åºåé¢æ°ã¯ãåºã䜿çšãããŠããxorshift-multiplyã«è§ŠçºãããŠããŸãã ä¹æ°ã®éžæã¯ãïŒaïŒããžãã¯å®æ°ã®æ°ãæããããšãããã³ïŒbïŒé åãå ã«æ»ãããªãããã«ããããšïŒäžäœãããã«ã¢ã¯ã»ã¹ã§ããªãå ŽåïŒã§ããããã©ã³ãã åããã- PCGåºåé¢æ°ãéåžžæã€ãããèªäœãã®å質ã
ãã®ä»ã®å€æŽ
0xda942042e4dd58b5
ããã®PRNGïŒããã³ãã¹ãŠã®cm_
ãã¬ãã£ãã¯ã¹ä»ã128ãããç¶æ PCGãžã§ãã¬ãŒã¿ãŒïŒã®LCGä¹æ°ã§ããå ŽåããããŸãã æ¯èŒãããš0x2360ed051fc65da44385df649fccf645
ã§äœ¿çšãããpcg64
ããã®å®æ°ã¯ãåå è©Šéšæ§ã®ç¹ã§ã¯ãŸã å®éã«ã¯ããªãè¯ãã§ããã128ãããÃ64ããããããç°¡åã§ãããããä¹ç®ã«ãããšå®ãã§ã128ãããÃ128ãããã ç§ã¯ãã®LCGå®æ°ãæ°å¹Žéåé¡ãªã䜿çšããŠããŸããã å®äŸ¡ãªä¹æ°ããªã¢ã³ãã䜿çšããå Žåãåœä»€ã¬ãã«ã®äžŠåæ§ãé«ããããã«ãåºåé¢æ°ãå埩åŸã®ç¶æ ã§ã¯ãªãå埩åã®ç¶æ ã§å®è¡ããŸãããã¹ã
ç§ã¯ããã培åºçã«ãã¹ããïŒPractRandãšTestU01ïŒãæºè¶³ããŠããŸãã ãã¹ãã«ã¯ããã®ã¹ã¬ããã§æŠèª¬ãããŠããã·ããªãªãå«ãŸããŠããŸããïŒããšãã°ãã®ã£ã³ã°ãžã§ãã¬ãŒã¿ãŒãã·ãŒã±ã³ã·ã£ã«ã¹ããŒã ã§äœ¿çšãããã2 ^ 64ã ãé²ããŠãåºåãã€ã³ã¿ãŒãªãŒãããŸãâ4ã€ã®ã®ã£ã³ã°ãš8192ã®ã®ã£ã³ã°ã8TBãŸã§åé¡ãªããã¹ãããŸãããã¹ããªãŒã ãšãã®å察åŽã®åå°ã®å¯Ÿå¿ç©ãšããŠïŒã
é床
é床ãã¹ããšãã³ãããŒã¯ã«ã€ããŠè©³ãã説æããããšãã§ããŸããã ç¹å®ã®ãã³ãããŒã¯ã§ãããPRNGãå¥ã®PRNGãããéãå®è¡ããããã©ããã«åœ±é¿ãäžããããŸããŸãªèŠå ããããŸãããå šäœãšããŠããã®ããªã¢ã³ãã¯ãå€ãã®å Žåãå°ãéããæã«ã¯ã¯ããã«éããæã«ã¯å°ãé ããªãããã§ãã ã³ã³ãã€ã©ãã¢ããªã±ãŒã·ã§ã³ãªã©ã®èŠå ã¯ããã³ãããŒã¯ã®å€åæ§ã«ã¯ããã«å€§ããªåœ±é¿ãåãŒããŸãã
å¯çšæ§
C ++ããããŒã®ãŠãŒã¶ãŒã¯ããã®æ°ãããã¡ããªã¡ã³ããŒã«_now_ãšããŠ
pcg_engines::cm_setseq_dxsm_128_64
ãšããŠã¢ã¯ã»ã¹ã§ããŸãã å°æ¥ã®ããæç¹ã§ãpcg64
ãpcg_engines::setseq_xsl_rr_128_64
ãããã®æ°ããã¹ããŒã ã«åãæ¿ããŸãã ç§ã®çŸåšã®èšç»ã¯ãPCG2.0ããŒãžã§ã³ã®ãã³ãã®äžéšãšããŠä»å¹Žã®å€ã«ããããããšã§ããæ£åŒãªçºè¡š
å šäœãšããŠãç§ã¯ãã®æ°ãã家æã«ãšãŠãæºè¶³ããŠããŸããå€ã®åŸåã®ããæç¹ã§ããã®ã¹ã¬ãããåç §ããŠããå¯èœæ§ãé«ãããã詳现ãªããã°æçš¿ããããŸãã
ããªãã®éžæ...
ãã¡ããããããã©ãããããèããªããã°ãªããŸããã ããªããããã䜿ããã©ããã«é¢ä¿ãªããç§ã¯å®éã«ããªãã®é床ãã³ãããŒã¯ã§ãããè¯ããªããæªããªãããèŠãããã«ããªãèå³ããããŸãã