PHP ã®å£ãã mt_rand ã®å質ãçµ±è¨çã«æ¤è¨¼ãã
ã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ã¨ä¼¼ã¦éãªãã¢ã«ã´ãªãºã ãå®è£ ããã¦ãããã¨ãçºè¦ãã¦è©±é¡ã® PHP ã® mt_rand é¢æ°ã®å質ãçµ±è¨çã«æ¤è¨¼ãã¾ããï¼æããã¦ï¼PHP ã®ãå£ãããmt_rand ã¯å®å¿ãã¦ä½¿ããã¨ãã§ããã®ã§ããããâ¦â¦ï¼
ã¡ãªã¿ã«ï¼çµè«ããè¨ãã¨ï¼PHP ã®å£ãã mt_rand ã¯ï¼ï¼å°ãªãã¨ããã®ãã¹ãã®ç¯å²ã§ã¯ï¼æ¬å®¶ã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ã¨éè²ãªãå質ãæã£ã¦ããããã§ãï¼ãã ãï¼æå¾ã« PHP ã®ä¹±æ°ã®å¥ã®æ¸å¿µç¹ã«ã¤ãã¦ãç´¹ä»ãã¾ãï¼
å£ãã mt_rand ã¨ã¯
PHP ã® mt_rand ã¯ï¼ドキュメントã«ããã¨ï¼æåãªä¹±æ°çæã¢ã«ã´ãªãºã ãã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ããå©ç¨ãã¦é«å質ã®ä¹±æ°ãçæããé¢æ°ã§ãï¼ã¨ãããï¼ã©ãããä¸é¨ã§ã¯ç¥ããã¦ãããã¨ã¨ãã¦ï¼PHP ã® mt_rand ã®å®è£ ã«ã¯ãã°ãããï¼æ¬å®¶ã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ã¨æåãä¸è´ãã¦ãã¾ããã§ããï¼ãã®ãã°ã®ãã mt_rand ã®å®è£ ããã®è¨äºã§ã¯ãå£ãã mt_randãã¨å¼ã³ã¾ãï¼
ä»å話é¡ã¨ãªã£ã¦ããä¸é£ã®é¨åã¯ï¼
- kusano ãããå£ãã¦ãã mt_rand ãä¿®æ£ãã pull request ãéãï¼ä¸åº¦ãã¼ã¸ãããï¼
- ã§ãï¼å¾æ¹äºææ§ãå´©ãï¼ã¨リバートãããï¼
- ããã©ãããï¼å£ãã¦ãããã¨ãç¶æãããããã«テストãã¤ããï¼
ã¨ãã£ãæãã ã¨æãã¾ãï¼
詳ããã¯ä»¥ä¸ã®ããã°è¨äºã«ã¾ã¨ã¾ã£ã¦ã¾ãã®ã§æ¯éï¼
ãªãæ¬ä¼¼ä¹±æ°ã®å質ã¯éè¦ãªã®ãï¼
æ¬ä¼¼ä¹±æ°ããã¡ããã¨ä¹±æ°ã«è¿ãããã¨ã¯ï¼çµ±è¨çãªå®é¨ãã·ãã¥ã¬ã¼ã·ã§ã³ï¼ç¢ºççã¢ã«ã´ãªãºã ï¼æå·ï¼ã²ã¼ã çã«æ¬ ãããã¨ã®ã§ããªãè¦å ã§ãï¼
ä¾ãã°æè¿ã ã¨ï¼ãã°ã©ãã«åé¡ããªã©ã½ã·ã£ã²ã®ã¬ãã£ã®ç¢ºçã®è©±ãããèãã¾ãï¼æå³çã«ã¬ãã£ã®ç¢ºçãå¼ã£ã¦ããå ´åã¾ã è¯ãï¼â¦â¦è¯ãã¯ãªãã§ããå°ãªãã¨ãéå¶ã®æå³éãã§ã¯ãããããç´ããï¼ã¨ãã¦ï¼æ¬ä¼¼ä¹±æ°ã®æ§è³ªãè¦å ã§ãã°ã¨ãã¦ç¢ºçã®åããèµ·ãã£ã¦ãã¾ãã¨ï¼ã¨ã¦ãæ²æ¨ã ã¨æãã¾ãï¼
BigCrush ãã¹ãã¨ã¯
ããæè¿ã§ã®ä¹±æ°ã®ãã¹ãã¨ãã£ããï¼BigCrush ã ã¨æãã¾ãï¼
ä¾ãã°ï¼Google Chrome で採用ãã話é¡ã«ãªã£ã xorshift128+ ã®ä½è å ¬å¼ãµã¤ãã§ãï¼BigCrush ã§ã®ãã¹ãçµæãï¼èªæ ¢æ°ã«ï¼è¼ã£ã¦ã¾ãï¼
Here quality is measured using the powerful BigCrush suite of tests.
http://xorshift.di.unimi.it/
ã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ä½è ã®æ¾æ¬å çã®æè¿ã®ç 究ã§ãï¼å質ã§çã£å ã«è¨åããããã¹ãã BigCrush ã§ãï¼
XORSHIFT-ADD ã¯128ãããã®å é¨ç¶æ 空éã¨2128-1ã®å¨æã æã¡ã TestU01 ã® bigcrush test ãéãã¾ãã
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/
BigCrush ã¯ï¼çµ±è¨çãªãã¹ãã大éã«å®è¡ãã¾ãï¼æ°å¦çã«è§£æãè¡ããã¨ã®ã§ããã·ãã¥ã¬ã¼ã·ã§ã³çãæ¬ä¼¼ä¹±æ°ãç¨ãã¦å®è¡ãï¼ãæ¬å½ã«ä¹±æ°ã ã£ãããããã確çåå¸ã«ãªãã¯ããã¨ããåå¸ã¨å®éã®çµæããæ¤å®ãè¡ãã¾ãï¼
ã©ãããã¡ãã¥ã¼ããããã¯ï¼Diehard Test の Wikipedia 記事ãè¦ãã¨ã¤ã¡ã¼ã¸ã湧ããããããï¼BigCrush 㯠10 æéè¿ãä¹±æ°ãçæãç¶ã 160 種é¡ã®ãã¹ããå®è¡ãã¾ãï¼ï¼Diehard ãã BigCrush ã®ã»ãããã¹ããè±å¯ï¼
çµæ
PHP ã® mt_rand ã®ã³ã¼ããåãåºãã¦ãã¦ï¼BigCrush ã«æããããã®ã³ã¼ããæ¸ãã¾ããï¼
ä¸è¿°ã® xorshift128+ ã®å ¬å¼ãµã¤ããåèã«ãã¦ï¼é©å½ãª 100 åã®ã·ã¼ã㧠BigCrush ãå®è¡ãï¼è½ã¡ããã¹ãã®æ°ã表ã«ãã¾ããï¼
ã¢ã«ã´ãªãºã | è½ã¡ããã¹ãï¼16000 åä¸ï¼ |
---|---|
å£ãã mt_rand | 230 |
ä¿®æ£æ¸ mt_rand | 236 |
ãªãã¨ï¼ã»ã¨ãã©å·®ãç¡ããã§ããï¼ããããå£ãããã£ã¦å¼ã¶ã®ã失礼ãããããªããããã§ãï¼ä¸è¿°ã® xorshift128+ å ¬å¼ã«è¼ã£ã¦ãã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ã®çµæã¨ããããåè´ãã¦ãã¨æãã®ã§ï¼ãã¹ãã¯æ£ããã§ãã¦ããã®ã§ã¯ãªããã¨æãã¾ãï¼ãã¨ï¼C è¨èªã® stdlib ã® rand ãå®è¡ãã¦ã¿ã¾ãããï¼ãã¡ãã¯ä¸ä¸åè¿ãè½ã¡ãçµæã«ãªãã¾ããï¼ç·å½¢ååæ³ã¯ï¼å³ããï¼
ã¡ãªã¿ã«ï¼ãã£ã¨æå°æªããã¦ã¿ããã¨æãï¼çæããä¹±æ°ã bit reverse ã㦠BigCrush ã«ãããï¼ã¨ãããã¹ããå®è¡ãã¾ãããï¼çµæã¯ãã¯ãæ®ã©å¤ããã¾ããã§ããï¼ï¼ä¾ãã°ï¼XSadd ã¯æ®éã« BigCrush ããã¨éããã®ã®ï¼ãããã£ã¦ reverse ããã¨è½ã¡ã¾ãããããï¼ï¼
表ã®æ°åãããèããã¨åããéãï¼å®ã¯ã¡ã«ã»ã³ãã»ãã¤ã¹ã¿ã¼ã¯æ£ããå®è£ ããã¦ãã¦ã BigCrush ãçµæ§è½ã¡ã¾ãï¼ç¹ã«ï¼å¿ ãè½ã¡ããã¹ãã¨ããã®ã 2 種é¡ãã£ã¦ï¼ããã 100 ã·ã¼ãå ¨é¨ã§è½ã¡ãã®ã§ããã ã㧠200 åè½ã¡ã¦ã¾ãï¼ãã®ç¹ï¼æè¿ã® xorshift128+ï¼xorshift1024* ã¯ï¼åæ§ã®ãã¹ããå®è¡ãã¦ãï¼è½ã¡ããã¹ãã¯æ°ååã¿ããã§ãï¼
BigCrush ãã¹ãã®åºåãåãªãã¸ããªå
ã«置いてますã®ã§ï¼è©³ããçµæãæ°ã«ãªãæ¹ã¯ç´æ¥ã覧ãã ããï¼ç¹ã«ï¼seed = 12345678 で実行した結果ã¯ï¼ä¸è¿°ã®éè¨ã«ã¯å
¥ãã¦ã¾ãããï¼ãã¹ãã§ãã使ããã¦ããï¼例1, 例2ï¼ã¿ãããªã®ã§ç½®ãã¦ã¿ã¾ããï¼æåã«åºåãã¦ã 16 åãããã 2 ã¤ã¨ä¸è´ãã¦ããã®ã§ï¼å£ãã¦ã mt_randã»ä¿®æ£å¾ã® mt_rand å
±ã«ï¼å
¬å¼ã¨ä¸è´ããå®è£
ãåãåºãã¦ãã¨æãã¾ãï¼
éè«ï¼mt_rand ãå¥æ°ããçæããªãï¼å¤åã®æå®ã«ãã£ã¦ã¯ï¼
ããã¯ããå¥ã®è©±é¡ã§ããï¼ãPHP ã® mt_rand ãå¥æ°ããçæããªããã¨ããç¾è±¡ãããåã«å ±åããã¦ãã¾ããï¼ããã§è©±é¡ã«ãªã£ã¦ããコードãå®è¡ããã¨ï¼ç¢ºãã«ä»ã§ãå¥æ°ããåºã¦ãã¾ããï¼ããï¼ã¤ãããªãã§ããâ¦â¦ï¼ï¼ã¨ãããï¼ãããããªãï¼ä½æ BigCrush ã«éãã®â¦â¦ï¼ï¼
ããã¯å®ã¯ï¼mt_rand ã®å¼æ°ã§å¤åãä¸ããããå ´åã«ï¼ä¹±æ°çæå¨ã®åºåãå¤åå ã«ç¸®ãããåºãããããæä½ãï¼ãã¡ããã¡ãéã«å®è£ ããã¦ãããã¨ãåå ã§ãï¼ãã® RAND_RANGE 関数ã§ããï¼ä¾ãã°ï¼2 åã®ç¯å²ã«åºããéï¼åç´ã« 2 ãæããã¨ãã極ãã¦éãªå®è£ ã«ãªã£ã¦ããã®ã§ï¼å¶å¥ãåºå®ããã¦ãã¾ããã§ããï¼RAND_RANGE 㯠mt_rand ã ããããªã㦠rand ã§ã使ããã¦ãã®ã§ï¼ãã£ã¡ã§ãåããã¨ãèµ·ããã¾ãï¼ä»åã® BigCrush ãã¹ãã¯å¤åã®æ¡å¤§ç¸®å°é¨åã¯å¯¾è±¡å¤ã§ãã®ã§ï¼ãã®ç¹ã¯çµæã«è¡¨ãã¾ããã§ãããï¼å¤åãæå®ãã¦ä½¿ãã®ã¯è¦æ³¨æã ã¨æãã¾ãï¼
ã¡ãªã¿ã«ï¼ドキュメントãããèªãã¨ï¼ã注æãã®ã»ã¯ã·ã§ã³ã«ãã®ç¾è±¡ã«é¢ãããã®ã¨æãããè¨è¿°ãããã¾ãï¼
è¦å
64 ãããçã® PHP 㧠max ã 2^32 ãã大ããããã¨ãmt_rand() ã®è¿ãå¤ã®åå¸ã«ãã¤ã¢ã¹ãããããå¶æ°ããã«ãªãã¾ãã max ã mt_getrandmax() ã®è¿ãå¤ãã大ãããªãã¨ã ä¹±æ°çæå¨ã®åºåãã¹ã±ã¼ã«ã¢ããããå¿ è¦ãããããã§ãã
http://php.net/manual/ja/function.mt-rand.php
ãã ãï¼ããã«ã¯å¤åãæ¡å¤§ããéã®è¦åã®ã¿ãæ¸ããã¦ãã¾ããï¼ãã®å®è£ ã§ã¯åççã«ã¯å¤åã®ç¸®å°ã®éã«ãåããèµ·ããã¯ããªã®ã§ï¼ã¤ãããã¨ãèµ·ãã¦ãäºæ¡ãããã¾ã§ã«ãã£ã¦ãä¸æè°ã§ã¯ãªãã¨æãã¾ãï¼
ãã®ç¹ï¼ä¾ãã° C++ ã® std::uniform_int_distribution ã¯ï¼libc++ ã§ã libstdc++ ã§ãï¼å¤åãæ¡å¤§ãããéã¯ãã¡ããï¼ç¸®å°ãããéã«ãå¿ è¦ã«å¿ãã¦ä¹±æ°ãè¤æ°ä½¿ãããã«æ¸ããã¦ãã¾ããï¼å®å¿ï¼