2014-06-19

http://anond.hatelabo.jp/20140619010953

純粋なrandom関数は、引数に渡したseed値に対して、同じseedには必ず同じ値を返す。

一つ前の乱数を再びseedにするやり方で、いくつもの乱数純粋に取り出せるよ。

もちろん初期値が一緒なら、起動するたびに同じ答えが返るけど。

で、初期値を起動するたびに変えたいってのを純粋にやるなら、IOモナド使うことになる。

手続き系とFPどっちのが分かりやすくなるかは、ケースバイケースだから使い分けろ、ってのは正しい。

追記:

ってよく見ると、ランダム値列の作り方じゃなくて、あくまでどうやって返す関数書くか、ってことか。

それならIOモナド使うまでもないので、自分的に書きやすScalafp形式で書いてしまうけど

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は読んだ値の総和を意味している。 つ...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん