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]; } } }