export module RandomEx {

	/**
	 * 取得隨機布林值
	 */
	export function GetBool() {
		return GetInt() >= 0;
	}

	/**
	 * 取得隨機整數(回傳min ~ max - 1)
	 * @param min
	 * @param max
	 */
	export function GetInt(min: number = Number.MIN_VALUE, max: number = Number.MAX_VALUE): number {
		return Math.floor(Math.random() * (max - min)) + min;
	}

	/**
	 * 取得隨機小數
	 * @param min
	 * @param max
	 */
	export function GetFloat(min: number = Number.MIN_VALUE, max: number = Number.MAX_VALUE): number {
		return Math.random() * (max - min) + min;
	}

	/**
	 * 隨機取得複數個不重複回傳
	 * @param num 取得數量
	 * @param items 陣列
	 */
	export function GetMultiNoRepeat(num: number, items: any[]): any[] {
		let result: any[] = [];
		for (let i: number = 0; i < num; i++) {
			let ran: number = Math.floor(Math.random() * items.length);
			let item = items.splice(ran, 1)[0];
			if (result.indexOf(item) == -1) {
				result.push(item);
			}
		}
		return result;
	}

	/**
	 * 根據權重取得複數個不重複回傳
	 * @param prize 獎項
	 * @param weights 機率
	 * @param count 數量
	 */
	export function GetMultiNoRepeatByWeight(prize: any[], weights: number[] = null, count: number = 1): any[] {
		if (weights === null) {
			weights = [];
			for (let i: number = 0; i < prize.length; i++) {
				weights.push(1);
			}
		}
		let target: any[] = [];
		for (let i: number = 0; i < count; i++) {
			let results: number[] = RandomEx.GetPrizeByWeight(prize, weights);
			prize.splice(results[0], 1);
			weights.splice(results[0], 1);
			target.push(results[1]);
		}
		return target;
	}


	/**
	 * 根據權重隨機取值
	 * @param prize 獎項
	 * @param weights 機率
	 */
	export function GetPrizeByWeight(prize: any[], weights: number[]): any[] {
		if (prize.length !== weights.length) {
			console.error(`GetWeight error -> prize.length:${ prize.length } !== weights.length:${ weights.length }`);
			return null;
		}
		let totalWeight: number = 0;
		for (let i: number = 0; i < weights.length; i++) {
			totalWeight += weights[i];
		}
		let random: number = RandomEx.GetInt(0, totalWeight) + 1;
		let nowWeight: number = weights[0];
		for (let i: number = 0; i < weights.length; i++) {
			if (nowWeight >= random) {
				return [i, prize[i]];
			}
			nowWeight += weights[i + 1];
		}
	}
}
