...

View Full Version : JavaScript Function: Generate a random integer within specified range AND digit limit



genstonewall
11-14-2012, 07:05 AM
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.


// 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;
}

Philip M
11-14-2012, 08:54 AM
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!)


<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

Labrar
11-14-2012, 09:25 AM
What about
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);
}

Philip M
11-14-2012, 09:32 AM
Labrar - please post Javascript code within code tags. Not php tags! That is likely to confuse beginners.

Labrar
11-14-2012, 10:04 AM
Sorry. How? is it [JS], [JavaScript] ???

Edit: got it :)
Is there any button to do this?

minder
11-14-2012, 10:12 AM
wrong solution

devnull69
11-14-2012, 10:21 AM
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)

minder
11-14-2012, 10:34 AM
yep you're right - deleted my post

felgall
11-14-2012, 10:46 AM
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.


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;
}

Philip M
11-14-2012, 11:04 AM
Yet another good example of a different way to skin a cat. :)



EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum