唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

PHP の mt_rand() は一貫して壊れている(consistently broken)らしい

PHPMersenne Twister法擬似乱数を生成する関数のmt_rand()にバグがあり出力がおかしい、という話が流れてきておもしろかったので簡単にまとめておく

kusanoさんがmt_rand()の実装に9年以上前から1文字違いでバグがあったことを見つけて、数ヶ月後にマージされる(追記: 正確には、PHP版の実装が他と異なっているのは前から知られていたらしい*1 )


その後、生成される擬似乱数列が変わってしまうので、後方互換性を壊す変更は議論してからmergeすべきということでrevertされる

この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()の出力が一貫して間違ったままであることを保証するためのテストが追加されている


kusanoさん本人の解説記事が出ていたので追記

kusano-k.hatenablog.com

iwiwiさんが乱数の質についての検証記事を書かれていたので追記

乱数の質としては「壊れていない」ものとあまり変わらないようです
記事にはmt_rand関数の別の罠っぽい挙動が書かれていて面白いです
iwiwi.hatenablog.com

PHP 7.1 で修正される予定らしいので情報を追記

sucrose.hatenablog.com