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 =
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)
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. ) )
[yourMaxNumber] accordingly to your own values.