Formulas shown below generate values that follow *uniform* *distribution*.

Using simple modulo methods is not considered as a good solution (although used a lot by students) as the module function does not generate all the variables with the same frequency.

### Random integer between [ 0, 1 ]

int r = (int) (rand()/(RAND_MAX + 0.0));

### Random integer between [ 0, 1 )

int r = (int) (rand()/(RAND_MAX + 1.0));

### Random integer between [ 0, N ]

int r = (int) (N * (rand() / (RAND_MAX + 0.0)));

### Random integer between [ 0, N )

int r = (int) (N * (rand()/(RAND_MAX + 1.0)));

### Random integer between [ M, N ]

int r = (int) (Μ + (rand()/(RAND_MAX + 0.0))*(N-M+1));

### Random integer between [ M, N )

int r = (int) (Μ + (rand()/(RAND_MAX + 1.0))*(N-M+1));

### Summary

The general formula is:

int r = (int) (A + (rand()/(RAND_MAX + C))*B);

Values of M, N, K are shown in the following table:

**Range** |
**A** |
**B** |
** C** |

[ 0, 1 ] |
0 |
1 |
0.0 |

[ 0, N ] |
0 |
N |
0.0 |

[ M, N ] |
M |
N – M + 1 |
0.0 |

[ 0, 1 ) |
0 |
1 |
1.0 |

[ 0, N ) |
0 |
N |
1.0 |

[ M, N ) |
M |
N – M + 1 |
1.0 |