随机选择器

从输入列表中随机抽取指定数量的项。支持允许重复抽取、候选项去重、去除空行等选项。 使用 crypto.getRandomValues 加密级随机数生成器配合拒绝采样实现无偏差抽取, 确保每个候选项被选中的概率完全相等。适用于抽奖、随机分组、随机点名、 A/B 测试分配、菜品随机选择等场景。所有处理在浏览器本地完成。

候选项列表(每行一条)0
(不重复,上限 0)
选项
提示:点击「示例」按钮快速体验随机抽取功能

常见问题

随机抽取是如何实现的?公平吗?

本工具使用两种算法:允许重复时采用独立随机选择, 每次从候选池中用 crypto.getRandomValues 独立抽取一项; 不允许重复时采用 Fisher-Yates 部分洗牌算法, 只洗牌前 N 个位置避免全量洗牌。两种方式都使用拒绝采样消除取模偏差—— 当随机值超出最大整数倍范围时重新采样,确保每个候选项被选中的概率完全相等。 相比 Math.random() 的伪随机,crypto API 提供加密级随机性质量。

允许重复和不允许重复有什么区别?

允许重复:每次抽取独立进行,同一个候选项可能被多次选中。 例如从 10 个选项中抽取 5 项(允许重复),结果可能有重复项。适合模拟独立重复试验、 随机生成器等场景。不允许重复:每个候选项最多被选中一次, 抽取数量不能超过候选项数量。适合抽奖、随机分组、随机点名等"不可重复"的场景。

候选项去重和去除空行有什么作用?

去除空行:抽取前过滤掉所有空行(包括纯空格行,如果同时开启了 trim), 避免空行被抽取。候选项去重:抽取前去除重复的候选项, 确保每个候选项只出现一次。这对于不允许重复抽取的场景尤其重要—— 如果候选项本身有重复(如名单中有两个"张三"),去重后才能保证真正的公平抽取。

这个工具适合哪些使用场景?

抽奖:从参与名单中随机抽取获奖者,公平透明; ② 随机分组:将人员随机分配到不同组别,适合团建、课堂活动; ③ 随机点名:课堂随机抽取学生回答问题; ④ A/B 测试分配:将用户随机分配到对照组与实验组; ⑤ 菜品选择:从候选菜品中随机选一家,解决"吃什么"难题; ⑥ 任务分配:随机将任务分配给团队成员。

抽取结果可以复制吗?

可以。点击结果区的「复制结果」按钮即可将抽取结果复制到剪贴板, 每项占一行,方便粘贴到其他应用中使用。复制使用 navigator.clipboard API, 在不支持的环境下会自动降级到 document.execCommand。

数据会上传到服务器吗?

不会。本工具完全在浏览器内运行,所有随机抽取处理由 JavaScript 在你本地执行, 不会发送任何输入文本或抽取结果到服务器。全程零网络请求,可离线使用。 这对于抽奖等需要保密的场景尤其重要——参与名单不会泄露。

Fisher-Yates 部分洗牌是什么意思?

Fisher-Yates 洗牌算法是经典的随机排列算法,时间复杂度 O(n)。 标准 Fisher-Yates 会洗牌整个数组,但当只需要抽取前 N 项时, 可以只洗牌前 N 个位置(部分洗牌),时间复杂度降为 O(k)(k 为抽取数量)。 这在候选项很多但只需抽取少量时显著提升性能。本工具在"不允许重复"模式下 使用部分洗牌,确保抽取效率和公平性兼顾。