コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

rubyで乱数使うときはrand()よりもRandomを使った乱数生成のほうがわかりやすい

Rubyには古くから乱数生成に rand() があるが、Ruby1.9.3以降の場合は Random クラスのほうが自明な部分多いなと思ったのでメモがてら

環境情報

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]

書きやすさポイント

乱数値のSeed設定が明白

rand() の場合、srand({{seed値}}) で設定をして rand({{上限値}}) をすると上限値に合わせた乱数が出てくるのだけれど、乱数再現したい場合などに、意図していないところで呼び出されたりしているとその回数分意図とずれてしまう。

その点 Random クラスは Random.new({{seed値}}) なので、生成したインスタンスをちゃんと管理すれば乱数再現が容易に可能

並列して使える

randの場合は並列すると、その並列が呼び出した順番に応じて内容が変わってしまうため、並列の順番も再現しないと乱数再現ができないなどハードルがあがる。

その点 Random クラスは その並列処理ごとにインスタンスを作ればよく、乱数の呼び出しも独立してるため、意図した乱数取得が可能です。

テストしやすい

前述の並列してつかえるのと同様のメリットがあり、意図したタイミング始まりの乱数データを作ることができる。

randの場合は明示的にコードにsrandしてから呼ばれるタイミングに依存するため、テスト対象とは異なる部分で呼ばれてしまうとsrandで設定したseed値と呼び出し順番が合致してても、テスト対象外で呼ばれていたりすると意図しない乱数値が取れてしまう場合がある。

その点 Random クラスの場合は、使われるスコープを区切ることができるので、副作用を受けにくいというのが利点としてあります。

参考サイト