Possible Duplicate:
how to get uniformed random between a, b by a known uniformed random function RANDOM(0,1)
In the book of Introduction to algorithms, there is an excise:
Describe an implementation of the procedure Random(a, b) that only makes calls to Random(0,1). What is the expected running time of your procedure, as a function of a and b? The probability of the result of Random(a,b) should be pure uniformly distributed, as Random(0,1)
For the Random function, the results are integers between a and b, inclusively. For e.g., Random(0,1) generates either 0 or 1; Random(a, b) generates a, a+1, a+2, …, b
My solution is like this:
for i = 1 to b-a
r = a + Random(0,1)
return r
the running time is T=b-a
Is this correct? Are the results of my solutions uniformly distributed?
Thanks
What if my new solution is like this:
r = a
for i = 1 to b - a //including b-a
r += Random(0,1)
return r
If it is not correct, why r += Random(0,1) makes r not uniformly distributed?
Others have explained why your solution doesn’t work. Here’s the correct solution:
1) Find the smallest number,
p, such that2^p > b-a.2) Perform the following algorithm:
3) If
ris greater thanb-a, go to step 2.4) Your result is
r+aSo let’s try Random(1,3).
So
b-ais 2.2^1 = 2, sopwill have to be 2 so that2^pis greater than 2.So we’ll loop two times. Let’s try all possible outputs:
So 1/4 of the time, we output 1. 1/4 of the time we output 2. 1/4 of the time we output 3. And 1/4 of the time we have to repeat the algorithm a second time. Looks good.
Note that if you have to do this a lot, two optimizations are handy:
1) If you use the same range a lot, have a class that computes
ponce so you don’t have to compute it each time.2) Many CPUs have fast ways to perform step 1 that aren’t exposed in high-level languages. For example, x86 CPUs have the BSR instruction.