Accorinding to this Stack Overflow answer, user CherryDT pointed out this code:
set /a num=%random% %% 100
does not give a uniform distribution.
The internal dynamic variable %random%
does gives a uniform distribution, but the above code will not be a uniformed random. This code generates a random number between 0 ~ 99, but the result will not be uniform. 0 ~ 67 will occur more than 68 ~ 99 since 32767 MOD 100
= 67
.
To generate a uniform distributed random using the above code, then 100
must be changed. Here is a method to get a number that creates a uniform distribution.
32767 mod (32767 / n)
where n
is an integer, between 0 ~ 32767, the result may be decimal and may not work in batch.
set /a result=(%RANDOM%*100/32768)+1
This method will generate a uniform distribution. It avoids using %
, which is more like "remainder" then "modulus" in a batch script. Without using %
, the result will be uniform.
Alternatively, here is an inefficient, but uniform method.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Change [yourMinNumber]
and [yourMaxNumber]
accordingly to your own values.