Nr_Narumium【GO】乱数生成法の確認Tweetgolangで乱数を扱うならmath/randパッケージがありますが、そのまま使っていいものかわからなかったので色々見て確認してみます。法、メルセンヌ・ツイスタ線形合同法いきなり横道にそれますが乱数を使う時に「それって線形合同法じゃないよね?」といわれるような風潮があります。この辺の理由も直感的に分かりにくかったので簡単に書いてみます。A、B(C)、Mは英語の方のwikiを参考にしました。---11035275903774015756628240841147902781*/}2nの剰余は2n-1のマスクビットで得られるのでそっちを使います。見る偶数と奇数が交互にくるってやつでしょうか。奇数*X+奇数の下位ビットをマスクしているので最下位ビットが交互に来るのはしょうがない。実際には全てのビットを使うわけではないですが、こういった周期性が問題になるようです。2の累乗を最大値にしてプロットしてみると周期性の問題がよくわかります。本筋に戻ってrandのソースを見ていきます。x}これは線形合同法の出典[4]にあったやつの変形っぽい。Seed()を見ると607個のスタックに詰めつつ、273離れたインデックス2つ(tap,feed)を用意している。rng.vec[rng.tap]を返している。これはラグ付フィボナッチ法のようです。(273,607)の組み合わせは有名なものみたいなのでそこから調べればよかった。ついでにシード値の設定は以下のようなものがある。big.NewInt(math.MaxInt64))rand.Seed(seed.Int64())メルセンヌ・ツイスタmath/randでは特に問題は起きなかったけど乱数作るならとりあえずメルセンヌツイスタじゃないかという風潮もある。GitHubでライブラリを探すとcpmech/goslとseehuhn/mt19937がありました。必要があるならこれらを使ってみてもいいと思います。コメントをキャンセルメールアドレスが公開されることはありません。