Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Results 1 to 10 of 10
  1. #1
    New to the CF scene
    Join Date
    Nov 2012
    Posts
    1
    Thanks
    0
    Thanked 0 Times in 0 Posts

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

  • #2
    Supreme Master coder! Philip M's Avatar
    Join Date
    Jun 2002
    Location
    London, England
    Posts
    18,015
    Thanks
    203
    Thanked 2,538 Times in 2,516 Posts
    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
    Last edited by Philip M; 11-14-2012 at 08:31 AM.

    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.

  • #3
    New Coder
    Join Date
    Jun 2008
    Posts
    62
    Thanks
    0
    Thanked 12 Times in 12 Posts
    What about
    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);
    }
    Last edited by Labrar; 11-14-2012 at 09:06 AM.

  • #4
    Supreme Master coder! Philip M's Avatar
    Join Date
    Jun 2002
    Location
    London, England
    Posts
    18,015
    Thanks
    203
    Thanked 2,538 Times in 2,516 Posts
    Labrar - please post Javascript code within code tags. Not php tags! That is likely to confuse beginners.

    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.

  • #5
    New Coder
    Join Date
    Jun 2008
    Posts
    62
    Thanks
    0
    Thanked 12 Times in 12 Posts
    Sorry. How? is it [JS], [JavaScript] ???

    Edit: got it
    Is there any button to do this?
    Last edited by Labrar; 11-14-2012 at 09:07 AM.

  • #6
    Banned
    Join Date
    Oct 2012
    Posts
    81
    Thanks
    0
    Thanked 4 Times in 4 Posts
    Edit:
    wrong solution
    Last edited by minder; 11-14-2012 at 09:34 AM.

  • #7
    Senior Coder
    Join Date
    Dec 2010
    Posts
    2,398
    Thanks
    12
    Thanked 570 Times in 563 Posts
    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)

  • #8
    Banned
    Join Date
    Oct 2012
    Posts
    81
    Thanks
    0
    Thanked 4 Times in 4 Posts
    yep you're right - deleted my post

  • #9
    Master Coder felgall's Avatar
    Join Date
    Sep 2005
    Location
    Sydney, Australia
    Posts
    6,640
    Thanks
    0
    Thanked 649 Times in 639 Posts
    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;
    }
    Last edited by felgall; 11-14-2012 at 09:49 AM.
    Stephen
    Learn Modern JavaScript - http://javascriptexample.net/
    Helping others to solve their computer problem at http://www.felgall.com/

    Don't forget to start your JavaScript code with "use strict"; which makes it easier to find errors in your code.

  • #10
    Supreme Master coder! Philip M's Avatar
    Join Date
    Jun 2002
    Location
    London, England
    Posts
    18,015
    Thanks
    203
    Thanked 2,538 Times in 2,516 Posts
    Yet another good example of a different way to skin a cat.

    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.


  •  

    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •