hidekatsu-izuno 日々の記録

プログラミング、経済政策など伊津野英克が興味あることについて適当に語ります(旧サイト:A.R.N [日記])

ランダム関数の現在

ハッシュ関数と似たような存在にランダム(乱数)関数がある。

ランダム関数のアルゴリズムと言えば、線形合同法が一番有名だと思われる。そして、このアルゴリズムは下位桁がランダムにならないことでも有名である。ランダム値は基本範囲の最小と最大の値を返すから、余りで割って範囲を制限したいのだが、そうしてしまうとランダムにならない。

この問題に対する解決策としては、ハードウェア乱数生成機を使うか、他の疑似乱数アルゴリズムを使うことになる。前者については Linux であれば /dev/random や /dev/urandom を使うと得られるが、どちらかと言えば暗号化用途でパフォーマンスに優れているわけではない。

品質の良いランダム値を得たければ(日本人が発明したことでも有名な)メルセンヌツイスタが使われてきたが、2003年に発表された Xorshift 以降、様々な選択肢が出てきている。

この話題はあまり追っていなかったので、てっきり Xorshift が現在のスタンダードかと思っていたのだが、その後継アルゴリズム含め問題も指摘されており、今ならば PCG というアルゴリズムを使うのが良いようだ。(numpy で採用されているというのも安心できる)

たまに調べると結構世界が変わっていて驚く。