43 lines
1.0 KiB
TypeScript
43 lines
1.0 KiB
TypeScript
/**
|
||
* 生成指定范围内的随机整数 [min, max]
|
||
*/
|
||
export function randomInt(min: number, max: number): number {
|
||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||
}
|
||
|
||
/**
|
||
* 从数组中随机选取一个元素
|
||
*/
|
||
export function randomPick<T>(arr: T[]): T {
|
||
return arr[Math.floor(Math.random() * arr.length)];
|
||
}
|
||
|
||
/**
|
||
* 从数组中随机选取 n 个不重复元素(Fisher-Yates,无 sort 偏置)
|
||
*/
|
||
export function randomPickN<T>(arr: readonly T[], n: number): T[] {
|
||
return sampleWithoutReplacement(arr, n);
|
||
}
|
||
|
||
/**
|
||
* 无放回抽样,不改变入参数组
|
||
*/
|
||
export function sampleWithoutReplacement<T>(
|
||
arr: readonly T[],
|
||
n: number,
|
||
): T[] {
|
||
return shuffle([...arr]).slice(0, Math.min(n, arr.length));
|
||
}
|
||
|
||
/**
|
||
* 打乱数组(Fisher-Yates)
|
||
*/
|
||
export function shuffle<T>(arr: T[]): T[] {
|
||
const result = [...arr];
|
||
for (let i = result.length - 1; i > 0; i--) {
|
||
const j = Math.floor(Math.random() * (i + 1));
|
||
[result[i], result[j]] = [result[j], result[i]];
|
||
}
|
||
return result;
|
||
}
|