Given a stream of numbers, generate a random number from the stream. You are allowed to use only O(1) space and the input is in the form of stream, so can’t store the previously seen numbers.
This problem is a variation of Reservoir Sampling.
1) Initialize 'count' as 0, 'count' is used to store count of numbers seen so far in stream.
2) For each number 'x' from stream, do following
…..a) Increment 'count' by 1.
…..b) If count is 1, set result as x, and return result.
…..c) Generate a random number from 0 to 'count-1′. Let the generated random number be i.
…..d) If i is equal to 'count – 1′, update the result as x.
This problem is a variation of Reservoir Sampling.
1) Initialize 'count' as 0, 'count' is used to store count of numbers seen so far in stream.
2) For each number 'x' from stream, do following
…..a) Increment 'count' by 1.
…..b) If count is 1, set result as x, and return result.
…..c) Generate a random number from 0 to 'count-1′. Let the generated random number be i.
…..d) If i is equal to 'count – 1′, update the result as x.
int
selectRandom(
int
x)
{
static
int
res;
// The resultant random number
static
int
count = 0;
//Count of numbers visited so far in stream
count++;
// increment count of numbers seen so far
// If this is the first element from stream, return it
if
(count == 1)
res = x;
else
{
// Generate a random number from 0 to count - 1
int
i =
rand
() % count;
// Replace the prev random number with new number with 1/count probability
if
(i == count - 1)
res = x;
}
return
res;
}
for
(
int
i = 0; i < n; ++i)
printf
(
"Random number from first %d numbers is %d \n"
,
i+1, selectRandom(stream[i]));
To simplify proof, let us first consider the last element, the last element replaces the previously stored result with 1/n probability. So probability of getting last element as result is 1/n.
Let us now talk about second last element. When second last element processed first time, the probability that it replaced the previous result is 1/(n-1). The probability that previous result stays when nth item is considered is (n-1)/n. So probability that the second last element is picked in last iteration is [1/(n-1)] * [(n-1)/n] which is 1/n.
Read full article from Select a random number from stream, with O(1) space | GeeksforGeeks