Reservoir sampling implementation. Reservoir sampling is a family of randomized algorithms for randomly choosing a sample of k items from a list S containing n items, where n is either a very large or unknown number. If question is unclear let me know I will reply asap. Looking for code review, optimizations and best practice. 


    public final class ReservoirSampling<T> {
    
    	private final int k;
    
    	/**
    	 * Constructs ReservoirSampling object with the input sample size.
    	 * 
    	 * @param k		the number of sample elements needed.
    	 * @throws IllegalArgumentException if k is not greater than 0.
    	 */
    	public ReservoirSampling(int k) {
    		if (k <= 0) {
    			throw  new IllegalArgumentException("The k should be greater than zero");
    		}
    		this.k = k;
    	};
    
    	/**
    	 * Returns a list of random `k` samples from the input list.
    	 * 
    	 * @param	list of elements from which we chose the k samples from.
    	 * @return 	the list containing k samples, chosen randomly.
    	 * @throws  NullPointerException if the input list is null.
    	 */
    	public List<T> sample(List<T> list) {
    		final List<T> samples = new ArrayList<T>(k);
    		int count = 0;
    		final Random random = new Random();
    		for (T item : list) {
    			if (count < k) {
    				samples.add(item);
    			} else {
    				// http://en.wikipedia.org/wiki/Reservoir_sampling
    				// In effect, for all i, the ith element of S is chosen to be included in the reservoir with probability
    				// k/i.
    				int randomPos = random.nextInt(count);
    				if (randomPos < k) {
    					samples.set(randomPos, item);
    				}
    			}
    			count++;
    		}
    		return samples;
    	}
    	
    	
    	
    	public static void main(String[] args) {
    		List<Integer> list = new ArrayList<Integer>();
    		list.add(1);
    		list.add(2);
    		list.add(3);
    	
    		ReservoirSampling<Integer> reservoirSampling = new ReservoirSampling<Integer>(3);
    		System.out.print("Expected: 1 2 3, Actual: ");
    		for (Integer i : reservoirSampling.sample(list)) {
    			System.out.print(i + " ");
    		}
    		
    		System.out.println();
    		
    		System.out.print("Expected: random output: ");
    		list.add(4);
    		list.add(5);
    		list.add(6);
    		for (Integer i : reservoirSampling.sample(list)) {
    			System.out.print(i + " ");
    		}
    	}
    }