純粋なrandom関数は、引数に渡したseed値に対して、同じseedには必ず同じ値を返す。
一つ前の乱数を再びseedにするやり方で、いくつもの乱数を純粋に取り出せるよ。
もちろん初期値が一緒なら、起動するたびに同じ答えが返るけど。
で、初期値を起動するたびに変えたいってのを純粋にやるなら、IOモナド使うことになる。
手続き系とFPどっちのが分かりやすくなるかは、ケースバイケースだから使い分けろ、ってのは正しい。
追記:
ってよく見ると、ランダム値列の作り方じゃなくて、あくまでどうやって返す関数書くか、ってことか。
それならIOモナド使うまでもないので、自分的に書きやすいScalaでfp形式で書いてしまうけど
val rands = Seq(10,20,1,6,8,0,0,0,20,10)
def f(xs: Seq[Int]) = xs.slice(0, xs.scanLeft(0){_ + _} takeWhile {_ <= 50} size)
f(rands)
でいけると思う。
「ランダムな整数がランダムな個数引数に渡されて、それらを添字順にひとつずつ足して行き、50を超えたらそれまでの配列の中身を返す」みたいなのってどうやって書くんだろう。 ...
純粋関数型のrandom関数は、入れたseedに対して必ず同じ数を返すので、一つ前の乱数を再びseedにするなら、純粋に書けるよ。 もちろん初期値がずっと一緒なら、起動するたびに同じ答え...
forループは全部再帰に直せるので再帰を使う。 f(a, b, total)みたいな関数を考える。 aはまだ読んでない値のリスト、bは既に読んだ値のリスト、totalは読んだ値の総和を意味している。 つ...