Offline sampling
Given an array of integers, return a random subset of k randome integers. Use as few calls to random() as possible. All subsets should be equally likely.
Solution
- Pick a random integer from the array at random
- To ensure the number is not repeated, swap the picked number towards the start, in the next picking reduce the range of integers to pick from
Code
def offline_sampling(arr, k)
i = 0
result = []
while i<k
r = random(i, k)
result << arr[r]
swap(arr, i, r)
i += 1
end
return result
end
Time complexity
O(n)