JavaScript函数:在指定范围和数字限制内生成随机整数

时间:2012-11-14 06:01:43

标签: javascript

我需要一个函数,在用户指定的数字范围(介于-9999到9999之间)和用户指定的数字限制(1到4位数字)内生成一个完全随机的整数(非常重要)。

示例1:如果用户想要一个介于-9999和9999之间的4位数字,则以下数字将是符合条件的选择-9999到-1000和1000到9999。

示例2:如果用户希望25到200之间的数字是2或3位数,则以下数字将是符合条件的选择25到200。

我写了一个有效的功能,但我不确定它是否是最好的解决方案?有重复的代码,我不认为它是完全随机的?

// Generates a random integer
// Number range
// Min (-9999-9999)
// Max (-9999-9999)
// Digit limit
// Min (1-4)
// Max (1-4)

function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) {    

// Generate a random integer in the number range
var num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber;

// Find number of digits
var n = num.toString();
n = n.length;

// If number is negative subtract 1 from length because of "-" sign
if (num < 0) {
    n--;
}
// End: find number of digits


while ((n > maxDigits) || (n < minDigits)) {
    // Generate a random integer in the number range
    num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber;


    // Find number of digits
    var n = num.toString();
    n = n.length;

    // If number is negative subtract 1 from length because of "-" sign
    if (num < 0) {
        n--;
    }
    // End: find number of digits
}

return num;
}

2 个答案:

答案 0 :(得分:1)

这里是你的函数的一个版本仍然使用完全相同的方法(即,在它得到一个具有正确位数的数字之前一直生成数字),但是删除了代码重复:

function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) {
    var num, digits;
    do {
        num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber;
        digits = Math.abs(num).toString().length;
    } while (digits > maxDigits || digits < minDigits);
    return num;
}

至于你对是否随机的关注,Math.random()方法会给你一个“伪随机”数字,但至少你知道它会在当前所有的数字中起作用浏览器。

答案 1 :(得分:1)

尝试这种功能方法,它会创建一个数组并随机随机播放,因此它会产生“非常随机”的结果。我之前使用过它,效果非常令人满意。

function getLen( v ) { 
  return Math.abs( v ).toString().length; 
};
function randomInteger( min, max ) {
  return ( new Array( ++max - min ) )
    .join('.').split('.')
    .map(function( v,i ){ return [ Math.random(), min + i ] })
    .filter(function( v ){ return getLen( v[1] ) >= getLen( min ) })
    .sort().map(function( v ) { return v[1] }).pop();
}