# Pseudorandom Distribution

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.

# Uniform Distribution

```
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.