randomLog.frink

Download or view randomLog.frink in plain text format or (experimental) run in browser


/** Generates numbers in a range from min to max with a logarithmic scale,
    that is, each magnitude is equally probable.  For example:

    randomLog[1e-10, 1e+10]

    will generate numbers across the specified range.  The min and max must
    have the same sign.

    TODO:  Add a clamp to make sure the rounded digits are in the specified
    range after rounding?

    TODO:  Have a "fast" version that doesn't round to specified number of
    digits?

    TODO:  Does this work right with 1 digit?  Test bounds of [1e-10, 1e10, 1]
    which gives some 1e+20 results?!
*/

randomLog[min, max] :=
{
   range = max/min
   if realSignum[range] <= 0
   {
      println["randomLog:  passed invalid range $min - $max."]
      return undef
   }
      
   return min 10^(randomFloat[0, log[range]])
}

/** This is the same as randomLog[min, max] above but rounds to the specified
    number of significant (decimal) digits.

    This calls setPrecision so it cannot currently be used in a secure context.
*/

randomLog[min, max, digits] :=
{
   val = randomLog[min, max]
   if val == undef
      return val
   
   origPrec = getPrecision[]
   try
   {
      setPrecision[digits]
      return 1. val
   }
   finally
      setPrecision[origPrec]
}


Download or view randomLog.frink in plain text format or (experimental) run in browser


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen, eliasen@mindspring.com