Note: I cannot use any of the built in functions to solve this.
This is the question:
Given a function that returns a random integer number between 1 and 5, create a function that creates a random integer between 1 and 7.
Note: I cannot use any of the built in functions to solve this.
This is the question:
Given a function that returns a random integer number between 1 and 5, create a function that creates a random integer between 1 and 7.
Apparently the following doesn't work. See the linked answer and the other responses as well.
Well, here is an approach I am thinking of. It could be wrong. I am going with the assumption that the result should be randomly distributed within the larger range.
Generate 7 random numbers using the given random functions (that generates numbers [1,5]) and calculate their sum.
This will result in a value between 7 (1 * 7) and 35 (5 * 7).
Because this value is evenly divisible by the target range and randomly distributed, then it seems like it would be valid to collapse the intermediate range [7,35] back to [1,7] without losing uniformity.
Or maybe that's not quite it - but it seems like exploiting a common multiple between the numbers is key.
As it has been answered in Adam Rosenfield's solution a while ago you may try to use an algoritm similar to this one below:
int i;
do
{
i = 5 * (rand5() - 1) + rand5(); // i is now uniformly random between 1 and 25
} while(i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1; // result is now uniformly random between 1 and 7
EDIT: Translation to python:
def rand7():
i = 0;
while True:
i = 5 * (rand5() -1) + rand5()
if i > 21:
break
return i % 7 + 1
import random
def winningFunc():
return originalFuncReturning1to5() + random.randint(0,2)