# Modulo Bias

Say you have a function `rand(1,3)`

that returns a random number 1, 2, or 3 and it does a good job and returns each number with a 1/3 probability.

Now lets say for some reason you only need the numbers 0 or 1.

If you want to use your `rand(1,3)`

function you’ll have to make it do something with the number 3. As an engineer you may intuitively use the modulo operator like this:

`rand(1,3) % 2`

to get the following results:

```
When rand(1,3) returns 1
1 % 2 = 1
```

```
When rand(1,3) returns 2
2 % 2 = 0
```

```
When rand(1,3) returns 3
3 % 2 = 1
```

Uh oh. Suddenly number 2 has a 2/3 probability and number 1 only has a 1/3 probability. Not an even probability of each number.

That is modulo bias.

The more generalized rule for our example is that for `rand(1,a) % n`

*n* must be divisible into *a* with a remainder of zero or else there is a possibility of modulo bias. Put differently *a* mod *n* should = 0.

Here are other examples:

```
100 mod 50 = 0
rand(1,100) % 50 // even probability of each number
```

```
100 mod 52 = 48
rand(1,100) % 52 // not even probability of each number
```

You may be thinking that you’d never do this but imagine writing some code to pick a “random” one of 52 playing cards. It’s not unimaginable that you might write it with bias if you didn’t know better.

I would love to play at that casino.

Posted