anchor.diff:      let maze = model.mazeGenerator()
       let xdim, ydim = Maze.dimensions maze
       let revealed = [Left;Right;Up;Down] |> List.collect (fun d -> newReveals maze d (0,0)) |> Set.ofList
  -    { model with maze = Some(maze); currentPosition = (0,0); messages = []; revealed = revealed; eventGen = eventsFor maze (xdim * ydim / 8) }, []
  +    let r = new Random()
  +    let goal =
  +      match (r.Next(xdim), r.Next(ydim)) with
  +      | (0,0) -> (xdim-1, ydim-1) // never want goal in start position, so just pick opposite corner in this rare case. Could recur instead but why bother?
  +      | x,y -> x,y
  +    { model with maze = Some(maze); currentPosition = (0,0); messages = []; revealed = revealed; eventGen = eventsFor maze (xdim * ydim / 5); goal = goal; steps = 0 }, []
     | Move(dir) ->
       let boundsCheck maze (x, y) =
         let w, h = Maze.dimensions maze
  
positive.code:   | SwitchAlgorithm of Algorithm
  
  let init _ =
    { maze = None; mazeGenerator = (fun () -> Maze.create 1); algorithm = Algorithm.All |> List.last; currentPosition = (0,0); messages = []; revealed = Set.empty; eventGen = (fun _ -> None) }, [(fun d -> d (SwitchAlgorithm (Algorithm.All |> List.last))); (fun d -> d Refresh)]
  
  let update msg model =
    match msg with
  
negative.code:     node <- node'
    maze
  
  let eventsFor (maze: Maze.data) n =
    let r = new Random()
    let table = [|
  