趣味抽签
给定一组签文/选项(可带权重),点一次抽出一条,给出明确结果提示。适合「谁跟进」「先做哪家」「轻松抽任务」。
何时使用
- 用户要「抽签」「随机选一个」「摇签」「抽人/抽任务」
- 需要可复现的简单随机(同一种子可选,默认真随机)
硬约束
- 选项至少 2 条;不足时拒绝并提示。
- 有权重时按权重抽样;无权重则均匀随机。
- 结果必须可见(文案 + 可选轻动效),并给出成功/失败提示。
- 不调用外部占卜 API;逻辑本地完成。
核心实现
export type Lot = { text: string; weight?: number };
export function drawLot(lots: Lot[]): { ok: boolean; text?: string; message: string } {
const list = (lots || []).filter(l => String(l?.text || '').trim());
if (list.length < 2) {
return { ok: false, message: '至少需要 2 个选项才能抽签' };
}
const weights = list.map(l => (l.weight != null && l.weight > 0 ? l.weight : 1));
const sum = weights.reduce((a, b) => a + b, 0);
let r = Math.random() * sum;
for (let i = 0; i < list.length; i++) {
r -= weights[i];
if (r <= 0) {
const text = list[i].text.trim();
return { ok: true, text, message: `抽中:${text}` };
}
}
const text = list[list.length - 1].text.trim();
return { ok: true, text, message: `抽中:${text}` };
}
验收
['甲','乙','丙']多次抽取,结果落在集合内。- 权重
{A:9,B:1}时 A 明显更常出现。 - 1 条选项时失败提示清晰。