Sponsored
Sponsored
The rejection sampling method involves generating a larger range of values than needed using multiple calls to rand7()
, then rejecting any values that fall outside the desired range. The goal is to convert an output range span (like 1 to 7) to another (like 1 to 10). You can do this by mapping combinations of rand7()
outputs together.
The idea is to create a smaller uniform distribution using a larger one and then scale it down to the desired range.
The expected time complexity is O(1), but the actual time depends on the success rate of generating a number that falls within the desired range. The space complexity is O(1) since we only use a limited amount of storage regardless of input size.
1int rand7();
2int rand10() {
3 int result;
4 do {
5 int row = rand7();
6 int col = rand7();
7 result = (row - 1) * 7 + col;
8 } while (result > 40);
9 return 1 + (result - 1) % 10;
10}
This C++ solution uses a similar rejection sampling technique as in C language. By combining calls to rand7()
, it achieves a 49-wide number range and then scales it down to produce numbers between 1 and 10.
This approach explores random walks over a 2D grid formed by two calls to rand7()
. By defining a grid dimension and using rerolls for values that fall outside of a specific boundary, it effectively resamples portions of the distribution space.
We consider a grid of 7x7 points and use this combined space to extract valid outcomes for our 1-10 range.
The average time complexity is O(1) due to expected constant writes, but can vary based on rerolls. The space used is fixed so the space complexity is O(1).
This C solution simulates a random walk over a 2D 7x7 grid. By leveraging grid positions, it discards values outside the boundary, essentially repeating the attempt until a valid number is extracted which can then map consistently to range 1-10.