random.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import baseRandom from './_baseRandom.js';
  2. import isIterateeCall from './_isIterateeCall.js';
  3. import toFinite from './toFinite.js';
  4. /** Built-in method references without a dependency on `root`. */
  5. var freeParseFloat = parseFloat;
  6. /* Built-in method references for those with the same name as other `lodash` methods. */
  7. var nativeMin = Math.min,
  8. nativeRandom = Math.random;
  9. /**
  10. * Produces a random number between the inclusive `lower` and `upper` bounds.
  11. * If only one argument is provided a number between `0` and the given number
  12. * is returned. If `floating` is `true`, or either `lower` or `upper` are
  13. * floats, a floating-point number is returned instead of an integer.
  14. *
  15. * **Note:** JavaScript follows the IEEE-754 standard for resolving
  16. * floating-point values which can produce unexpected results.
  17. *
  18. * **Note:** If `lower` is greater than `upper`, the values are swapped.
  19. *
  20. * @static
  21. * @memberOf _
  22. * @since 0.7.0
  23. * @category Number
  24. * @param {number} [lower=0] The lower bound.
  25. * @param {number} [upper=1] The upper bound.
  26. * @param {boolean} [floating] Specify returning a floating-point number.
  27. * @returns {number} Returns the random number.
  28. * @example
  29. *
  30. * _.random(0, 5);
  31. * // => an integer between 0 and 5
  32. *
  33. * // when lower is greater than upper the values are swapped
  34. * _.random(5, 0);
  35. * // => an integer between 0 and 5
  36. *
  37. * _.random(5);
  38. * // => also an integer between 0 and 5
  39. *
  40. * _.random(-5);
  41. * // => an integer between -5 and 0
  42. *
  43. * _.random(5, true);
  44. * // => a floating-point number between 0 and 5
  45. *
  46. * _.random(1.2, 5.2);
  47. * // => a floating-point number between 1.2 and 5.2
  48. */
  49. function random(lower, upper, floating) {
  50. if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
  51. upper = floating = undefined;
  52. }
  53. if (floating === undefined) {
  54. if (typeof upper == 'boolean') {
  55. floating = upper;
  56. upper = undefined;
  57. }
  58. else if (typeof lower == 'boolean') {
  59. floating = lower;
  60. lower = undefined;
  61. }
  62. }
  63. if (lower === undefined && upper === undefined) {
  64. lower = 0;
  65. upper = 1;
  66. }
  67. else {
  68. lower = toFinite(lower);
  69. if (upper === undefined) {
  70. upper = lower;
  71. lower = 0;
  72. } else {
  73. upper = toFinite(upper);
  74. }
  75. }
  76. if (lower > upper) {
  77. var temp = lower;
  78. lower = upper;
  79. upper = temp;
  80. }
  81. if (floating || lower % 1 || upper % 1) {
  82. var rand = nativeRandom();
  83. return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
  84. }
  85. return baseRandom(lower, upper);
  86. }
  87. export default random;