free path length = 1; move left (-1) or right (+1) with equal probability
time step |
-8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | n | [x2] | <x2> |
0 | 1 | 1 | 0 | 0 | ||||||||||||||||
1 | 1 | 1 | 2 | 2 | 1 | |||||||||||||||
2 | 1 | 2 | 1 | 4 | 8 | 2 | ||||||||||||||
3 | 1 | 3 | 3 | 1 | 8 | 24 | 3 | |||||||||||||
4 | 1 | 4 | 6 | 4 | 1 | 16 | 64 | 4 | ||||||||||||
5 | 1 | 5 | 10 | 10 | 5 | 1 | 32 | 160 | 5 | |||||||||||
6 | 1 | 6 | 15 | 20 | 15 | 6 | 1 | 64 | 384 | 6 | ||||||||||
7 | 1 | 7 | 21 | 35 | 35 | 21 | 7 | 1 | 128 | 896 | 7 | |||||||||
8 | 1 | 8 | 28 | 56 | 70 | 56 | 28 | 8 | 1 | 256 | 2048 | 8 |
<x2>/t = const
program diff1 ! 1-dim. diffusion simulation ! Einstein & Smoluchowski ! Ulrich Schmitt, 2003-01-17 implicit none integer, parameter :: nsteps = 8 ! number of steps integer, dimension(-nsteps:nsteps) :: nx = 0 ! relative positions, accumulators integer :: icount1, icount2, icount_rate, ix, irun, istep, nruns real, dimension(nsteps) :: rnd ! random numbers real, dimension(nsteps) :: sx=0., sx2=0. ! sum of deviations, sum of squares real :: cpu_time print *, 'Number of runs?' read *, nruns call system_clock(icount1, icount_rate) ! initial CPU time do irun = 1, nruns ix = 0 ! initial position call random_number(rnd) ! get a sequence of random numbers do istep = 1, nsteps if (rnd(istep) < 0.5) then ! random move ix = ix - 1 ! left else ix = ix + 1 ! right end if sx (istep) = sx(istep) + ix sx2(istep) = sx2(istep) + ix**2 end do nx(ix) = nx(ix) + 1 ! accumulate end do call system_clock(icount2) ! final CPU time cpu_time = real(icount2 - icount1)/icount_rate ! seconds print *, 'CPU time/s', cpu_time print '(/, 9(1x, i6, 1x, i1))', nx print '(/, 8(1x, f8.5))', sx/nruns ! mean deviations print '(/, 8(1x, f8.5))', sx2/nruns ! mean squared deviations end
Number of runs? 256000 CPU time/s 2.694000 (PC 150 MHz) 1045 0 7886 0 27954 0 56149 0 69777 0 56166 0 28034 0 7997 0 992 -0.00085 -0.00288 -0.00323 -0.00045 0.00062 0.00099 0.00305 0.00233 1.00000 2.00255 2.99662 3.99728 4.98916 5.99683 7.00541 7.99697