# yaox023's blog # Rejection Sampling

## Big to small

If we have a api `rand10` which generate random values from `[1,10]`, then how could we use this api to build an api `rand7` which generates random values from `[0,7]`?

This solution is to use rejection sampling. The main idea is when you generate a number in the desired range, output that number immediately. If the number is out of the desired range, reject it and re-sample again. Because each call of `rand10` should get a result with equal probability, if we get a value bigger than 7, we just roll the dice again, until we get a valid result.

``````// if we already have rand10
function rand7() {
const v = rand10();
if (v <= 7) return v;
else return rand7(); // roll the dice again
}
``````

## Small to big

Now how about simluate big rand by small rand? Say we have an api `rand7`, how to build an api `rand10`?

The idea is, we can make this happen by rolling the dice many times. So if we run the `rand7` twice, we should get a result table like below.

``````  1  2  3  4  5  6  7
1 a  b  c  d  e  f  g
2 h  i  ...
3
4
5
6
7
``````

So each table cell stands for a possible result. Each table cell should have the same possibilities. Now we have 49 cells, so we have `rand49`.

## Implement Rand10() Using Rand7()

Now with all the above information, let's solve the leetcode `Implement Rand10() Using Rand7()` problem.

The problem is to implement big rand by small rand. So the solution is, first make the rand bigger, then choose the valid result.

``````// if we already have rand7
function rand10(): number {
const row = rand7();
const col = rand7();

// cell index in the table
const idx = col + (row-1) * 7

if (idx <= 10) {
return idx;
} else {
rand10();
}
};
``````