/*******************************************************************************
 * Copyright 2019 Observational Health Data Sciences and Informatics
 * 
 * This file is part of WhiteRabbit
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package org.ohdsi.utilities;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class RandomUtilities {
	public static <T> List<T> sampleWithoutReplacement(List<T> items, int sampleSize) {
		if (sampleSize > items.size()) {
			return items;
		}
		Random random = new Random();
		List<T> sample = new ArrayList<T>();
		for (int i = 0; i < sampleSize; i++)
			sample.add(items.remove(random.nextInt(items.size())));
		return sample;
	}
	
	public static int[] sampleWithoutReplacement(int minValue, int maxValue, int sampleSize) {
		if (sampleSize > (maxValue - minValue + 1)) {
			int[] sample = new int[maxValue - minValue + 1];
			for (int i = minValue; i <= maxValue; i++)
				sample[i - minValue] = i;
			return sample;
		} else {
			Random random = new Random();
			int[] sample = new int[sampleSize];
			for (int i = 0; i < sampleSize; i++) {
				int number = random.nextInt(maxValue - minValue + 1);
				while (contains(sample, number))
					number = random.nextInt(maxValue - minValue + 1);
				sample[i] = number;
			}
			return sample;
		}
		
	}
	
	private static boolean contains(int[] sample, int number) {
		for (int i : sample)
			if (i == number)
				return true;
		return false;
	}
	
}
