CodeKitHub
简体中文
生成器工具

免费列表随机排序 / 抽取工具

粘贴一份列表——名单、任务、抽奖名额,什么都行——每行一项,用真正的 Fisher-Yates 洗牌算法把它打乱成公平的随机顺序。打开"抽取模式"还能只随机抽出 N 项,适合抽奖选中奖者、或分配随机顺序而不暴露整份打乱后的名单。

工具介绍

列表随机排序器把一组内容重新排成随机顺序,或从中抽取一个随机子集。难点在于要做到真正无偏:像用随机比较函数给数组排序这类朴素做法,产生的分布是有偏的——某些排列出现的概率会明显高于其他排列。

本工具用的是 Fisher–Yates(Durstenfeld)洗牌算法,这是生成可证明均匀随机排列的标准方法——列表所有可能的排列顺序出现概率完全相等。

为什么使用它?

  • 真正无偏的洗牌——用的是 Fisher–Yates,不是常见的 sort(() => Math.random() - 0.5) 这种会导致结果偏斜的反面做法。
  • 抽取模式:只随机抽出 N 项而不是打乱整份列表,适合抽奖和赠品活动。
  • 打乱前可选去重,处理可能不小心重复的名单。
  • 支持任意文本——姓名、任务、抽奖号码、奖品,每行一项即可。
  • 隐私安全:洗牌全程在浏览器本地完成,不上传任何内容。

使用方法

  1. 把列表粘贴进文本框,每行一项。
  2. 如果名单可能有重复项,可以勾选"打乱前去重"。
  3. 要整体打乱顺序,直接点"打乱顺序";要抽中奖者,勾选"只抽取 N 项"并设置数量。
  4. 复制结果——随时再点一次"打乱顺序"就能得到全新的随机顺序或新一轮抽取。

示例

输入

Alice
Bob
Charlie
Diana
Ethan

输出

一个随机打乱后的顺序,比如 Charlie、Ethan、Alice、Diana、Bob——每次点击"打乱顺序"结果都不同。

如果把抽取模式设为 2,同样的输入可能直接得到 Ethan 和 Alice 两个——这是一次独立的随机抽取,而不是先打乱再取前两个。

为什么朴素的洗牌方式会产生偏差

sort(() => Math.random() - 0.5) 是个看起来对、实际不对的常见技巧:它依赖排序算法以特定次数、特定模式调用比较函数,而现实中的排序实现并不保证这一点。实际效果是:某些排列出现的频率会明显高于其他排列——粗略一看很难发现,但跑很多次统计上是能测出来的。

Fisher–Yates 完全绕开了这个问题:它不依赖排序算法间接产生随机性,而是把每个位置和剩余位置里随机选出的一个位置直接交换恰好一次,无论底层语言的排序实现如何,都能保证均匀性。

随机数生成器 · UUID 生成器

常见问题

为什么不能直接用 array.sort(() => Math.random() - 0.5)?

这行代码是个众所周知的反面案例:JavaScript 的 sort() 并不保证每对元素被比较的次数相同,所以最终顺序会明显偏向某些排列——有些项落在开头或结尾的概率会高于真正随机应有的水平。Fisher–Yates 从算法结构上就完全避免了这个问题,也是本工具实际使用的算法。

这个打乱顺序真的无偏吗?

是的。Fisher–Yates 遍历列表一遍,每一步都把当前项和剩余未打乱部分里一个均匀随机选出的项交换。在随机数源足够好的前提下(JavaScript 的 Math.random()),这在数学上被证明能让每一种可能的排列出现概率完全相等。

打乱模式和抽取模式有什么区别?

打乱模式重排列表里的每一项,把它们全部按新顺序展示给你。抽取模式只随机抽出 N 项并只展示这几项——适合需要选出固定数量的中奖者或样本、又不想暴露整份打乱后名单的场景。

能用来做真实的抽奖活动吗?

对于非正式的赠品和抽奖活动完全没问题,因为随机性确实是均匀的。如果是涉及金钱奖品、受法律监管的抽奖,请查一下当地法规——部分地区要求特定的、可审计的抽签流程。

去重会改变我的原始列表吗?

不会——去重只影响打乱后的输出结果,且只在勾选该选项时生效。你输入的原始列表始终保持原样,可以随时切换选项重新打乱,不用重新输入。

相关工具