Elixirのdoctestはメソッドの近くに出力例と合わせて書けて嬉しい!けど、出力がランダムになるようなのはどうすればいい?
Enum.random([1,2,3])
みたいな関数- //
Enum.sample()
とよく間違える…
- //
結論
:rand.seed(:exsplus, {101, 102, 103})
等として固定する:exsplus
は、アルゴリズムの指定のこと{101, 102, 103}
はそれぞれInteger指定で、各アルゴリズムで初期化に使用される(のでこの度指定する)- //
Enum.random()
のソースをみればいいのでは、ということで見てみた
参考させていただいた資料等
- https://stackoverflow.com/questions/48857468/elixir-doctest-fails-for-function-that-returns-random-values
Enum.random()
ソース- http://marianoguerra.org/tmp/otp/stdlib/rand.html
erlang rand
について
- https://www.erlang.org/doc/man/rand.html#type-seed
rand
のシードについて
その他
ライブラリでは、ランダムな文字列(トークンなど)をどう作っているのか。phx.gen.auth
をみてみる
:crypto.strong_rand_bytes/1
を使っていた- こちらはOS由来とのこと。同じような固定はできない(できなくていい)
iex> :crypto.strong_rand_bytes(1)
"m"
iex> "m" <> <<0>>
<<109, 0>>
iex> <<109>>
"m"