Jokru February 2016

batch random number between 5 digit and 6 digit numbers

Simple as getting a random number from 10000 to 999999 I am not sure how to do this and most instructions didn't work. I'm fairly new to batch.

Answers


Matthew Strawbridge February 2016

Although you can use %RANDOM% in a batch file to get a random number, it will be between 0 and 32767.

The traditional approach of %RANDOM% * n / 32767 won't give you a smooth distribution for n = 999999-10000 = 989999 ... it will cover the range, but there will be big gaps.

Similarly, you can't just add lots of calls to %RANDOM% together because the sum of the random values is not itself uniformly distributed.

I recommend switching to PowerShell 2.0, where you will be able to use the Get-Random Cmdlet across the full range of integers. Either that, or write a simple program in another language just to generate the random number, and then call it from your batch file.

Edit:

You can do this to get a random number between 10000 and 999999:

set /a rnd=(((%random% * 32768) + %random%) %%990000) + 10000

It's not perfectly uniform, but may be good enough for your purposes.

Given the question title, perhaps you're actually looking for a number between 100000 and 999999 (i.e. 5 or 6 digits). In this case you could use this:

set /a rnd=(((%random% * 32768) + %random%) %%900000) + 100000

Unlike the approach using addition, this uses two random numbers (one for the higher-order bits and one for the lower-order bits), which should give a uniform distribution between 0 and 1073741823; the non-uniformity comes from the wrap-around you get from the modulus (%%) operation. You could avoid this, too, if you used a loop and rejected any candidate random values above 1073700000 (=900000 * 1193).


Magoo February 2016

@ECHO Off
:: Generate linear random number into variable %1
:: length is %2 digits
:: maxvalue %3 (optional. string of %2 9s if omitted)
:: minval %4 (optional, 0 if omitted)
:: to set minval but not maxval, use "" as %3
SETLOCAL ENABLEDELAYEDEXPANSION 
SET $digits=%2
SET $maxval=%~3
SET $minval=%4
IF NOT DEFINED $digits GOTO :EOF
IF DEFINED $maxval GOTO maxvalset
:maxvallp
SET "$maxval=9%$maxval%"
IF "!$maxval:~%2!"=="" GOTO maxvallp
SET "$maxval=%$maxval:~1%"

:maxvalset
IF NOT DEFINED $minval SET /a minval=0
:minvallp
SET "$minval=0%$minval%"
IF "!$minval:~%2!"=="" GOTO minvallp
SET "$minval=%$minval:~1%"

:minvalset
SET "$chosen="
SET /a $count=%2

:getdigit
SET /a $digit=%RANDOM%
IF %$digit% gtr 32759 GOTO getdigit
SET /a $digit=%$digit:~-1%

SET "$chosen=%$chosen%%$digit%"
SET /a $count-=1
IF %$count% gtr 0 GOTO getdigit

IF "%$chosen%" gtr "%$maxval%" GOTO minvalset
IF "%$chosen%" lss "%$minval%" GOTO minvalset

:slzlp
IF %$chosen:~0,1%==0 IF %$chosen% neq 0 SET "$chosen=%$chosen:~1%"&GOTO slzlp

endlocal&set "%1=%$chosen%"
GOTO :EOF

Here's a routine that will generate a random number with linear distribution of any length with maximum and minimum.

Its use expects some intelligence on the part of the user. Sure - asking for a number between 0 and 99 then adding 1 will be a whole lot faster than asking for a number between 1 and 100. It's also not bullet-proof and assumes the parameters with which it is provided are valid.

Each step is trivial - the variable names and labels should provide appropriate clues to their purpose. In essence, a string of random digits of the appropriate length is built and discarded if out-of-range. The magic number 32759 is chosen to make sure that the random number chosen as a basis for the digits generated are 0..32759 which will yield a linear distribution mod 10 assuming the random number generator is linear.

Post Status

Asked in February 2016
Viewed 3,832 times
Voted 11
Answered 2 times

Search




Leave an answer