From b9783b1f0cb0c3881dd1c3ea77dcc99e3d56b054 Mon Sep 17 00:00:00 2001 From: Timi Date: Wed, 3 Dec 2025 11:50:32 +0800 Subject: [PATCH] add Toolkit.setRandomInterval --- src/utils/Toolkit.ts | 65 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/src/utils/Toolkit.ts b/src/utils/Toolkit.ts index 58af531..375c3c8 100644 --- a/src/utils/Toolkit.ts +++ b/src/utils/Toolkit.ts @@ -142,15 +142,25 @@ export default class Toolkit { } /** - * 生成随机数 + * 生成随机数(整数) * - * @param min 最小值 - * @param max 最大值 + * @param min 最小值 + * @param max 最大值 */ public static random(min = 0, max = 100): number { return Math.floor(Math.random() * (max + 1 - min)) + min; } + /** + * 生成随机数(浮点数) + * + * @param min 最小值 + * @param max 最大值 + */ + public static randomDouble(min = 0, max = 1): number { + return Math.random() * (max - min) + min; + } + /** * Base64 数据转文件 * @@ -334,4 +344,53 @@ export default class Toolkit { } return value; }; + + /** + * 设置随机间隔执行 + * + * @param config 配置对象 + * @param config.handler 处理函数,如果提供了 min 和 max,则会接收随机数作为参数 + * @param config.handleRate 执行概率,0-1 之间,默认 1(总是执行) + * @param config.interval 间隔时间(毫秒) + * @param config.min 随机数最小值(可选),提供时会生成随机数传给 handler + * @param config.max 随机数最大值(可选),提供时会生成随机数传给 handler + * @returns 定时器 ID + * + * @example + * ```js + * // 简单的随机执行 + * setRandomInterval({ + * handler: () => console.log('executed'), + * handleRate: 0.5, + * interval: 1000 + * }) + * + * // 带随机数参数的执行 + * setRandomInterval({ + * handler: (value) => console.log('random value:', value), + * handleRate: 1, + * min: 0, + * max: 100, + * interval: 1000 + * }) + * ``` + */ + public static setRandomInterval(config: { + handler: Function | ((value: number) => void); + handleRate?: number; + interval?: number; + min?: number; + max?: number; + }): NodeJS.Timeout { + const { handler, handleRate = 1, interval, min, max } = config; + return setInterval(() => { + if (Math.random() < handleRate) { + if (min !== undefined && max !== undefined) { + (handler as (value: number) => void)(this.randomDouble(min, max)); + } else { + (handler as Function)(); + } + } + }, interval); + } }