9a7ebada9cf5b827a5c63786bf9ab71a4b533e26100e1c3207ed3461fd5b45856b426d3c0815d132bf89ab50cce61fc8146fc1937162e7c7e482b9502acf3a 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. ## Basics
  3. */
  4. module.exports = {
  5. // 返回一个随机的布尔值。
  6. boolean: function(min, max, cur) {
  7. if (cur !== undefined) {
  8. min = typeof min !== 'undefined' && !isNaN(min) ? parseInt(min, 10) : 1
  9. max = typeof max !== 'undefined' && !isNaN(max) ? parseInt(max, 10) : 1
  10. return Math.random() > 1.0 / (min + max) * min ? !cur : cur
  11. }
  12. return Math.random() >= 0.5
  13. },
  14. bool: function(min, max, cur) {
  15. return this.boolean(min, max, cur)
  16. },
  17. // 返回一个随机的自然数(大于等于 0 的整数)。
  18. natural: function(min, max) {
  19. min = typeof min !== 'undefined' ? parseInt(min, 10) : 0
  20. max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53
  21. return Math.round(Math.random() * (max - min)) + min
  22. },
  23. // 返回一个随机的整数。
  24. integer: function(min, max) {
  25. min = typeof min !== 'undefined' ? parseInt(min, 10) : -9007199254740992
  26. max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53
  27. return Math.round(Math.random() * (max - min)) + min
  28. },
  29. int: function(min, max) {
  30. return this.integer(min, max)
  31. },
  32. // 返回一个随机的浮点数。
  33. float: function(min, max, dmin, dmax) {
  34. dmin = dmin === undefined ? 0 : dmin
  35. dmin = Math.max(Math.min(dmin, 17), 0)
  36. dmax = dmax === undefined ? 17 : dmax
  37. dmax = Math.max(Math.min(dmax, 17), 0)
  38. var ret = this.integer(min, max) + '.';
  39. for (var i = 0, dcount = this.natural(dmin, dmax); i < dcount; i++) {
  40. ret += (
  41. // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。
  42. (i < dcount - 1) ? this.character('number') : this.character('123456789')
  43. )
  44. }
  45. return parseFloat(ret, 10)
  46. },
  47. // 返回一个随机字符。
  48. character: function(pool) {
  49. var pools = {
  50. lower: 'abcdefghijklmnopqrstuvwxyz',
  51. upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  52. number: '0123456789',
  53. symbol: '!@#$%^&*()[]'
  54. }
  55. pools.alpha = pools.lower + pools.upper
  56. pools['undefined'] = pools.lower + pools.upper + pools.number + pools.symbol
  57. pool = pools[('' + pool).toLowerCase()] || pool
  58. return pool.charAt(this.natural(0, pool.length - 1))
  59. },
  60. char: function(pool) {
  61. return this.character(pool)
  62. },
  63. // 返回一个随机字符串。
  64. string: function(pool, min, max) {
  65. var len
  66. switch (arguments.length) {
  67. case 0: // ()
  68. len = this.natural(3, 7)
  69. break
  70. case 1: // ( length )
  71. len = pool
  72. pool = undefined
  73. break
  74. case 2:
  75. // ( pool, length )
  76. if (typeof arguments[0] === 'string') {
  77. len = min
  78. } else {
  79. // ( min, max )
  80. len = this.natural(pool, min)
  81. pool = undefined
  82. }
  83. break
  84. case 3:
  85. len = this.natural(min, max)
  86. break
  87. }
  88. var text = ''
  89. for (var i = 0; i < len; i++) {
  90. text += this.character(pool)
  91. }
  92. return text
  93. },
  94. str: function( /*pool, min, max*/ ) {
  95. return this.string.apply(this, arguments)
  96. },
  97. // 返回一个整型数组。
  98. range: function(start, stop, step) {
  99. // range( stop )
  100. if (arguments.length <= 1) {
  101. stop = start || 0;
  102. start = 0;
  103. }
  104. // range( start, stop )
  105. step = arguments[2] || 1;
  106. start = +start
  107. stop = +stop
  108. step = +step
  109. var len = Math.max(Math.ceil((stop - start) / step), 0);
  110. var idx = 0;
  111. var range = new Array(len);
  112. while (idx < len) {
  113. range[idx++] = start;
  114. start += step;
  115. }
  116. return range;
  117. }
  118. }