擬似乱数生成器を作ろうとしてみたメモ
アルゴリズムは色々ある
擬似乱数 - Wikipedia
xorshiftがシンプルで良さそう
基本的に、それらの乱数のアルゴリズムは整数を生成するもの
各種の言語処理系には、大抵$ [0, 1)の実数を生成するAPIが多いが?
そこで整数から実数に変換する
どうやって?
整数から実数に変換する方法
単純に割り算する
例えば8ビットの符号なし整数なら、256で割ることで$ [0, 1)になる
golangの標準ライブラリ(math/rand)がこれだった
JavaScriptのライブラリ davidbau/seedrandom ではいささか面倒なことをやっていた
たぶん32ビットじゃなくてもっと長いビット数の整数を作ろうとしているんだな
ただこのライブラリのコード自体は、色々なアルゴリズムが見られるので面白い
ついでにgolangのmath/randのアルゴリズムを読んでみた
ざっくりまとめ
数百の長さの配列に予めランダムな値を詰めておく
整数iとjを用意しておく
iとjを動かし、配列のi番目とj番目の値を足して、それを乱数の値とする
配列のi番目の値をその乱数の値で置き換える
これはオリジナルのアルゴリズムなんだろうか?
TypeScriptでxorshift32を作ってみた
https://www.typescriptlang.org/play?#code/DYUwLgBAnhC8EEYAMSBQBjA9gOwM6QCc4IAmCAKnIgGYTVUAzAV23TAEscICBDbAEwAUASgBcEbEwC2AIxBEA3qggroxQTAB6EDRAA8exNWHDlqmPF3bdAPhuIA7CbMqLOre-2GArM9XdwJgJsdzsbJGEIAHpuVABfeiw8SB4CXihxSVl5AG0AXWJ8xkwiQVBIdmIkAG4ISsMSGrqAambIpX8k3ExQADpgTABzQV4BEVM4oA