var baseRandom = require('./_baseRandom'),

isIterateeCall = require('./_isIterateeCall'),
toFinite = require('./toFinite');

/** Built-in method references without a dependency on `root`. */ var freeParseFloat = parseFloat;

/* Built-in method references for those with the same name as other `lodash` methods. */ var nativeMin = Math.min,

nativeRandom = Math.random;

/**

* Produces a random number between the inclusive `lower` and `upper` bounds.
* If only one argument is provided a number between `0` and the given number
* is returned. If `floating` is `true`, or either `lower` or `upper` are
* floats, a floating-point number is returned instead of an integer.
*
* **Note:** JavaScript follows the IEEE-754 standard for resolving
* floating-point values which can produce unexpected results.
*
* @static
* @memberOf _
* @since 0.7.0
* @category Number
* @param {number} [lower=0] The lower bound.
* @param {number} [upper=1] The upper bound.
* @param {boolean} [floating] Specify returning a floating-point number.
* @returns {number} Returns the random number.
* @example
*
* _.random(0, 5);
* // => an integer between 0 and 5
*
* _.random(5);
* // => also an integer between 0 and 5
*
* _.random(5, true);
* // => a floating-point number between 0 and 5
*
* _.random(1.2, 5.2);
* // => a floating-point number between 1.2 and 5.2
*/

function random(lower, upper, floating) {

if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
  upper = floating = undefined;
}
if (floating === undefined) {
  if (typeof upper == 'boolean') {
    floating = upper;
    upper = undefined;
  }
  else if (typeof lower == 'boolean') {
    floating = lower;
    lower = undefined;
  }
}
if (lower === undefined && upper === undefined) {
  lower = 0;
  upper = 1;
}
else {
  lower = toFinite(lower);
  if (upper === undefined) {
    upper = lower;
    lower = 0;
  } else {
    upper = toFinite(upper);
  }
}
if (lower > upper) {
  var temp = lower;
  lower = upper;
  upper = temp;
}
if (floating || lower % 1 || upper % 1) {
  var rand = nativeRandom();
  return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
}
return baseRandom(lower, upper);

}

module.exports = random;