PHPでMersenne Twister法で擬似乱数を生成する関数のmt_rand()にバグがあり出力がおかしい、という話が流れてきておもしろかったので簡単にまとめておく
kusanoさんがmt_rand()の実装に9年以上前から1文字違いでバグがあったことを見つけて、数ヶ月後にマージされる(追記: 正確には、PHP版の実装が他と異なっているのは前から知られていたらしい*1 )
PHPに送った1文字修正するプルリクエストがマージされた🎉 mt_rand()の返す値が元のメルセンヌツイスタと異なっていた。https://t.co/Z5WJhHVyNd
— kusanoさん@がんばらない (@kusano_k) February 17, 2016
その後、生成される擬似乱数列が変わってしまうので、後方互換性を壊す変更は議論してからmergeすべきということでrevertされる
この前マージされたPHPのmt_rand()を修正するコミットがリバートされていた(´・ω・`)知らんがなhttps://t.co/zKI1NlT46thttps://t.co/wZldV1Aqiv
— kusanoさん@がんばらない (@kusano_k) February 18, 2016
このrevertコミットに付いているコメントがいろいろとおもしろい
Revert "Fix #71152: mt_rand() returns the different values from origi… · php/php-src@a0724d3 · GitHub
最初のコメントからしてなかなかすごい
"Sure it's broken, but at least it's consistently broken!"
https://github.com/php/php-src/commit/a0724d30817600540946b41e40f4cfc2a0c30f80#commitcomment-16174204
(拙訳: 確かに壊れている。しかし、少なくとも一貫して壊れている)
この後バグを放置するのに怒った人達(?)が途中「PHPは糞」みたいなコメントを何個も書き込んでいて熱い
適当に斜め読みしたところによると、後方互換性を損なう変更なのでよく議論してから大型のリリース中で修正することになるっぽい
愉快なことにPHPのmt_rand()の出力が一貫して間違ったままであることを保証するためのテストが追加されている
PHPのmasterにmt_rand()のテストコードが追加された。
— kusanoさん@がんばらない (@kusano_k) February 19, 2016
Test that mt_rand() consistently produces the wrong resultshttps://t.co/8aNJ5RcqaP
kusanoさん本人の解説記事が出ていたので追記
iwiwiさんが乱数の質についての検証記事を書かれていたので追記
乱数の質としては「壊れていない」ものとあまり変わらないようです
記事にはmt_rand関数の別の罠っぽい挙動が書かれていて面白いです
iwiwi.hatenablog.com