/* ## Basics */ module.exports = { // 返回一个随机的布尔值。 boolean: function(min, max, cur) { if (cur !== undefined) { min = typeof min !== 'undefined' && !isNaN(min) ? parseInt(min, 10) : 1 max = typeof max !== 'undefined' && !isNaN(max) ? parseInt(max, 10) : 1 return Math.random() > 1.0 / (min + max) * min ? !cur : cur } return Math.random() >= 0.5 }, bool: function(min, max, cur) { return this.boolean(min, max, cur) }, // 返回一个随机的自然数(大于等于 0 的整数)。 natural: function(min, max) { min = typeof min !== 'undefined' ? parseInt(min, 10) : 0 max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53 return Math.round(Math.random() * (max - min)) + min }, // 返回一个随机的整数。 integer: function(min, max) { min = typeof min !== 'undefined' ? parseInt(min, 10) : -9007199254740992 max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53 return Math.round(Math.random() * (max - min)) + min }, int: function(min, max) { return this.integer(min, max) }, // 返回一个随机的浮点数。 float: function(min, max, dmin, dmax) { dmin = dmin === undefined ? 0 : dmin dmin = Math.max(Math.min(dmin, 17), 0) dmax = dmax === undefined ? 17 : dmax dmax = Math.max(Math.min(dmax, 17), 0) var ret = this.integer(min, max) + '.'; for (var i = 0, dcount = this.natural(dmin, dmax); i < dcount; i++) { ret += ( // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。 (i < dcount - 1) ? this.character('number') : this.character('123456789') ) } return parseFloat(ret, 10) }, // 返回一个随机字符。 character: function(pool) { var pools = { lower: 'abcdefghijklmnopqrstuvwxyz', upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', number: '0123456789', symbol: '!@#$%^&*()[]' } pools.alpha = pools.lower + pools.upper pools['undefined'] = pools.lower + pools.upper + pools.number + pools.symbol pool = pools[('' + pool).toLowerCase()] || pool return pool.charAt(this.natural(0, pool.length - 1)) }, char: function(pool) { return this.character(pool) }, // 返回一个随机字符串。 string: function(pool, min, max) { var len switch (arguments.length) { case 0: // () len = this.natural(3, 7) break case 1: // ( length ) len = pool pool = undefined break case 2: // ( pool, length ) if (typeof arguments[0] === 'string') { len = min } else { // ( min, max ) len = this.natural(pool, min) pool = undefined } break case 3: len = this.natural(min, max) break } var text = '' for (var i = 0; i < len; i++) { text += this.character(pool) } return text }, str: function( /*pool, min, max*/ ) { return this.string.apply(this, arguments) }, // 返回一个整型数组。 range: function(start, stop, step) { // range( stop ) if (arguments.length <= 1) { stop = start || 0; start = 0; } // range( start, stop ) step = arguments[2] || 1; start = +start stop = +stop step = +step var len = Math.max(Math.ceil((stop - start) / step), 0); var idx = 0; var range = new Array(len); while (idx < len) { range[idx++] = start; start += step; } return range; } }