2

我需要一个在用户指定的数字范围(-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;
}
4

2 回答 2

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();
}
于 2012-11-14T06:31:35.460 回答
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()方法会给您一个“伪随机”数字,但至少您知道它适用于所有当前的浏览器。

于 2012-11-14T06:22:08.860 回答