Full Question is:
Write a method to randomly generate a set of m integers from an array of size
n. Each element must have equal probability of being chosen`
This question is picked from “Crack the coding interview” and the solution is this:
We can swap the element with an element at the beginning of the array and then “remember” that the array now only includes elements
jand greater. That is, when we picksubset[0]to bearray[k], we replacearray[k]with the first element in the array. When we picksubset[1], we considerarray[0]to be “dead” and we pick a random elementybetween 1 and arraysize(). We then set subset[1] equal toarray[y], and setarray[y]equal to array[1]. Elements 0 and 1 are now “dead”.Subset[2]is now chosen fromarray[2]througharray[array size()], and so on.
My question is that if we’re shrinking the array from which we’re picking random numbers then probability of each number being picked 1/remaining_num_elements. How does it stay equal for all the elements?
Think about it like you’re picking
mrandom numbers from a bag ofnnumbers, with the firstjelements representingthe numbers in your handand the remaining elements representingthe numbers still in the bag. (You iteratejfrom 0 tom - 1to pull out numbers, as your book suggests.j, then, represents the number of integers that you have already pulled out of the bag.)If you’re picking
mintegers from a bag in real life, then every time you pick a new number, you take from the bag only and not from your hand. Thus, theremaining_num_elementsshrinks at each step.When you think this way, it should be simple to see that this method guarantees that each element has equal probability of being chosen.