91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
|
|
||
|
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];
|
||
|
}
|
||
|
}
|
||
|
}
|