real function urand(iy) integer iy integer ia,ic,itwo,m2,m,mic real*8 halfm,datan,dsqrt real s data m2/0/,itwo/2/ if(m2.ne.0) goto 20 m=1 10 m2=m m=itwo*m2 if(m.gt.m2) goto 10 halfm=m2 ia=8*idint(halfm*datan(1.d0)/8.d0)+5 ic=2*idint(halfm*0.5d0-dsqrt((3.d0)/6.d0))+1 mic=(m2-ic)+m2 s=0.5/halfm 20 iy=iy*ia if(iy.gt.mic) iy=(iy-m2)-m2 iy=iy+ic if(iy/2.gt.m2) iy=(iy-m2)-m2 if(iy.lt.0) iy=(iy+m2)+m2 urand=float(iy)*s return end