# JavaScript Function: Generate a random integer within specified range AND digit limit

• 11-14-2012, 06:05 AM
genstonewall
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; }```
• 11-14-2012, 07:54 AM
Philip M
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
• 11-14-2012, 08:25 AM
Labrar
Code:

```function randomizer( min, max, digits ) {         if(isNaN(digits)){digits=4;}         if( min > max ) {                 return( -1 );         }         if( min == max ) {                 return( min );         }           var rands=( min + parseInt( Math.random() * ( max-min+1 ) ) );                 rands=rands.toString();                 var returner='';                 for(var i =0; i<digits; i++){                 returner+=rands[i];                 if(isNaN(rands[i])){digits++;}                 }                 return parseInt(returner); }```
• 11-14-2012, 08:32 AM
Philip M
Labrar - please post Javascript code within code tags. Not php tags! That is likely to confuse beginners.
• 11-14-2012, 09:04 AM
Labrar
Sorry. How? is it [JS], [JavaScript] ???

Edit: got it :)
Is there any button to do this?
• 11-14-2012, 09:12 AM
minder
Edit:
wrong solution
• 11-14-2012, 09:21 AM
devnull69
Not if you read and understand the OP's post

He wants to exclude those random numbers that are not of a certain length

Example: Random number with 3 to 4 digits between -10000 and 10000 would exclude those numbers that are only two digits (like -12 or 98)
• 11-14-2012, 09:34 AM
minder
yep you're right - deleted my post
• 11-14-2012, 09:46 AM
felgall
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; }```
• 11-14-2012, 10:04 AM
Philip M
Yet another good example of a different way to skin a cat. :)