#include #include #include #include #ifndef M_PI /* usually defined in math.h, but not in the ANSI standard */ #define M_PI 3.14159265358979323846 #endif int main() { int i, j; extern double drunkard(int nsteps); srand(time(NULL)); for (i = 0; i <= 10; i++) { double total = 0; for (j = 0; j < 100; j++) total += drunkard(i); printf("%d\t%g\n", i, total / 100); } return 0; } double drunkard(int nsteps) /* returns ending distance from origin */ { int i; double x, y; /* current position */ extern double randangle(); x = y = 0; /* start at (0,0) */ for (i = 0; i < nsteps; i++) { double r = randangle(); /* sin(r) is y distance (perhaps negative), cos(r) is x distance */ y += sin(r); x += cos(r); } /* return cartesian distance to origin */ return sqrt(x * x + y * y); } double randangle() /* return a random angle in radians */ { return rand() / (RAND_MAX + 1.0) * 2 * M_PI; }