53 people like it.

Random Walk

Random walk on integers starting at zero. At each step, we either add or subtract one depending on a random coin flip. The code uses Seq.unfold to generate infinite sequence.

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
open System
let ran = Random()

/// Flip a coin with probability p for true
let dice p = ran.NextDouble() <= p

/// Random walk from zero stepping up and down according to dice p
let walk p =
    Seq.unfold (fun z -> let z = if dice p then z+1 else z-1
                         Some (z,z)) 0

/// First n steps
let walkFor n = walk 0.5 |> Seq.take n
namespace System
val ran : Random

Full name: Script.ran
Multiple items
type Random =
  new : unit -> Random + 1 overload
  member Next : unit -> int + 2 overloads
  member NextBytes : buffer:byte[] -> unit
  member NextDouble : unit -> float

Full name: System.Random

--------------------
Random() : unit
Random(Seed: int) : unit
val dice : p:float -> bool

Full name: Script.dice


 Flip a coin with probability p for true
val p : float
Random.NextDouble() : float
val walk : p:float -> seq<int>

Full name: Script.walk


 Random walk from zero stepping up and down according to dice p
module Seq

from Microsoft.FSharp.Collections
val unfold : generator:('State -> ('T * 'State) option) -> state:'State -> seq<'T>

Full name: Microsoft.FSharp.Collections.Seq.unfold
val z : int
union case Option.Some: Value: 'T -> Option<'T>
val walkFor : n:int -> seq<int>

Full name: Script.walkFor


 First n steps
val n : int
val take : count:int -> source:seq<'T> -> seq<'T>

Full name: Microsoft.FSharp.Collections.Seq.take
Next Version Raw view Test code New version

More information

Link:http://fssnip.net/G
Posted:13 years ago
Author:James
Tags: random walk , unfold