% --- start of displayed preamble in the book ---

% --- end of displayed preamble in the book ---
vardef randomwalk(expr C,wd,ht,n,l,f,r)=
  save A,B,a,b;pair A,B;a=0;
  draw ((wd,-ht)--(wd,ht)--(-wd,ht)--(-wd,-ht)--cycle) shifted C;
  A=C;
  for i=1 upto n:
    forever:
      b:=a*f+((uniformdeviate 2)-1)*180r;
      B:=A+l*(uniformdeviate 1)*dir(b);
      if (abs(xpart(B-C))>= wd) or  (abs(ypart(B-C))>= ht):
        B:=A+l*(uniformdeviate 2)*dir(b+180);
      fi;
      exitif (abs(xpart(B-C))< wd) and  (abs(ypart(B-C))< ht);
    endfor;
    draw A--B;A:=B;a:=b mod 360;
  endfor;
enddef;
defaultfont:="ptmr8r";
warningcheck:=0;
beginfig(1)
randomwalk(origin,2.5cm,2.5cm,1000,10mm,0,1);
randomwalk((6cm,0),2.5cm,2.5cm,3000,4mm,1,0.3);
endfig;
end;