JavaScript Function: Generate a random integer within specified range AND digit limit
I need a function that generates a completely random integer (very important) within a user specified number range (between -9999 to 9999) and a user specified digit limit (between 1 and 4 digits).
Example 1: If the user wants a number between -9999 and 9999 that's 4 digits, the following numbers would be eligible choices -9999 to -1000 and 1000 to 9999.
Example 2: If the user wants a number between 25 and 200 that's 2 OR 3 digits, the following numbers would be eligible choices 25 to 200.
I wrote a function that works but I am not sure if it's the best solution? There's duplicate code and I don't think it's completely random? Thanks.
Code:
// 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;
}
As you say, the code can be simplified, but otherwise seems to work OK. The number generated is random (actually pseudo-random, but that is the best you can do!)
Code:
<script type = "text/javascript">
// 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) {
var len = 0; // initialise len
while ((len > maxDigits) || (len < 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();
len = n.length;
// If number is negative subtract 1 from length because of "-" sign
if (num < 0) {len--}
// End: find number of digits
}
return num;
}
alert (generateRandomInteger(100, 5000, 3, 4) );
</script>
You need to check that the user data is consistent, e.g. not 10,99,3,4 or an infinite loop is set up.
"Never attribute to malice that which can be adequately explained by stupidity." - Napoleon Bonaparte
__________________
All the code given in this post has been tested and is intended to address the question asked.
Unless stated otherwise it is not just a demonstration.
There's no need for a loop. The following code does it with only one call to Math.random as the number returned always maps to within the required range with the same distribution regardless of what numbers are entered.
Code:
function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) {
var minNum, maxNum, minDigNum, maxDigNum, range, num;
minNum = Math.min(minNumber, maxNumber);
maxNum = Math.max(minNumber, maxNumber);
minDigNum = Math.pow(10,minDigits-1);
if (minNum<0) minDigNum *= -1;
else minDigNum = Math.max(maxNum, minDigNum);
maxDigNum = Math.pow(10,maxDigits-1);
if (maxNum<0) {
maxDigNum *= -1;
if (maxDigNum<minDigNum) maxDigNum = minDigNum = maxNum;
}
else maxDigNum = Math.max(minDigNum, maxDigNum);
range =minDigNum-minNum+maxNum-maxDigNum+2;
if (minDigNum===maxDigNum) range--;
num = Math.floor(Math.random()*range)+minNum;
if (num > minDigNum) num += maxDigNum;
return num;
}