# Mathematically Random Trips - Methods

## Equations

First the equations themselves:

Initial inputs:

Rear = Radius of the Sphere in question

Slat = Starting latitude (in radians - -pi/2 < Slat <= pi/2)

Slon = Starting longitude (in radians - -pi < Slon <= pi)

Bmin = Lower bearing bound (in radians - 0 <= Bmin <= Bmax)

Bmax = Upper bearing bound (in radians - Bmin <= Bmax <= 2*pi)

Dmin = Lower distance bound (0 <= Dmin <= Dmax)

Dmax = Maximum distance bound (Dmin <= Dmax <= pi*Rear)

Randomizers:

Zber = Random number seed for Bearing (0 <= Zber <= 1)

Zdis = Random number seed for Distance (0 <= Zdis <= 1)

Intermediate Variables:

Rber = Random Bearing within given parameters

Rdis = Random Distance within given parameters

Dlon = Change in Longitude from Start to Finish (-pi < Dlon <= pi )

Final Values:

Flat = Finishing Latitude (in radians - -pi/2 < Flat <= pi/2)

Flon = Finishing Longitude (in radians - -pi < Flon <= pi)

Equations (computed in order):

Rber = (Bmax-Bmin)*Zber+Bmin

Rdis = Rear*acos(Zdis*cos[Dmax/Rear]+[1-Zdis]*cos[Dmin/Rear])

{Final Result} Flat = asin(cos[Rber/Rear]*sin[Slat]+sin[Rber/Rear]*cos[Slat]*cos[Rber])

Dlon = sign(sin[Dber])*acos([cos{Rber/Rear}-sin{Slat}*sin{Flat}]/[cos{Slat}*cos{Slon}])

{Final Result} Flon = Slon+Dlon-2*pi*floor([Slon+Dlon+pi]/[2*pi])

Now, since most navigation is done in degrees minutes and seconds
rather than radians, some conversion of your starting position into radians
at the begining is necessary and back to DMS at the end. But that conversion
is trivial so I won't repeat it here.

If anybody finds any errors in the above, please let me know!!

## Programs

Here are a couple of the quickbasic programs I use for finding
random spots:

**randspgr.bas**

Plotted many points within a certain heading and distance range from an origin,
used to test if I had the math right

**randspot.bas**

This is the most general of the lot, lets you specify your starting point
and ranges for the distances and bearing you want a random spot within

**rloc.bas**

This does finds a random spot within a certain distance using a much less efficient
method (generate random spots anywhere in the world until you get one close
enough).

**allworld.bas**

This one was modified to be preset to have a range for distance and bearing
which results in random spots anywhere on the Earth

The most current is of course the Javascript
version.