随机列表洗牌器 - 免费在线列表随机化工具
随机列表洗牌器采用Fisher-Yates洗牌算法,为姓名、学生、团队或任务等任意列表进行随机排序,该算法从数学上保证每一种可能的排列顺序出现的概率完全相等,不存在系统性偏差。工具适合教师课堂抽签点名、比赛分组、活动抽奖以及其他需要公平决策的场合免费使用,无需注册账号。
随机列表洗牌器
输入要打乱的项目,每行一项。空行将自动删除。
文档
什么是随机列表打乱工具?
随机列表打乱工具是一种接收一个列表中的各项,并按新的随机顺序重新排列的工具。可以每行输入一个姓名、任务或其他任何内容,工具会将它们重新排列,使每一种可能的顺序出现的机会均等。该工具使用 Fisher–Yates 洗牌算法,这是一种广为人知、能产生无偏随机顺序的算法。
如何使用随机列表打乱工具
- 将列表输入或粘贴到文本框中,每行一个项目。
- 点击“随机排列列表”。项目会立即重新排列。
- 查看按钮下方的打乱列表,项目已按新的顺序编号。
- 再次点击“随机排列列表”,进行一次新的独立洗牌。
- 点击“复制结果”复制新的顺序,或点击“清除”重新开始。
输入内容中的空行会自动移除,因此多余的换行不会在结果中生成空项目。
费舍尔–耶茨洗牌算法如何工作?
费舍尔–耶茨洗牌会遍历列表一次,从最后一个项目开始,逐步向前处理。每一步都会从列表中尚未放置的部分随机选取一个项目,并将其交换到当前位置。
费舍尔–耶茨洗牌公式
对于包含 n 个项目的列表,位置编号从 0 到 n − 1:
1for i from n − 1 down to 1:
2 choose a random whole number j, where 0 ≤ j ≤ i
3 swap the items at positions i and j
4循环运行 n − 1 次,因此整个洗牌大约需要 n 步。这称为线性时间,记作 O(n)。由于该算法恰好考虑每个位置一次,并且每次都从不断缩小且定义明确的项目集合中抽取,因此 n!(n 的阶乘,即 n × (n − 1) × ... × 1)种可能的排列顺序,每一种成为结果的机会都相同。
示例:打乱包含四个项目的列表
从位置 0 到 3 上的四个项目开始:苹果、香蕉、樱桃、枣。
- i = 3:随机选取的 j = 0。交换位置 3 和 0 → 枣、香蕉、樱桃、苹果
- i = 2:随机选取的 j = 2。将一个位置与自身交换不会改变任何内容 → 枣、香蕉、樱桃、苹果
- i = 1:随机选取的 j = 0。交换位置 1 和 0 → 香蕉、枣、樱桃、苹果
最终顺序:香蕉、枣、樱桃、苹果。
四个项目共有 4! = 24 种可能的顺序。在每次洗牌中,每一种顺序(包括这一种)出现的机会都是 1/24。
为什么不直接交换随机选出的项目对?
一种看起来更简单的方法是随机选两个位置并交换,重复多次。它看似随机,其实不然。早期的一些计算机洗牌程序就是这样做的,它们悄悄地偏向某些顺序,而任何单次运行看上去都没有问题。Fisher–Yates 洗牌算法避免了这一点,因为每一项只移动一次,移到的位置取自一个精确逐步缩小的候选集合,这正是每种最终顺序概率相等的原因。
Fisher–Yates 洗牌算法源自何处?
统计学家罗纳德·费希尔(Ronald Fisher)和弗兰克·耶茨(Frank Yates)于 1938 年在一本统计用表中描述了这种方法,用于设计实验时手工洗牌。1964 年,理查德·杜斯滕费尔德(Richard Durstenfeld)将它改写成适合计算机的版本,使列表可以原地重新排序,无需再用第二个列表记录剩余的项。唐纳德·克努斯(Donald Knuth)在其 1969 年出版的《计算机程序设计艺术》(The Art of Computer Programming)一书中收录了这个计算机版本,因此它有时也被称为 Knuth 洗牌算法。
列表打乱工具的常见用途
- 确定学生在课堂上进行展示或回答问题的顺序
- 为比赛设置对阵表,或确定游戏中的轮流顺序
- 将一组人随机分成若干队伍
- 从候选名单中选择餐厅、电影或任务,而不偏向任何一个选项
普通洗牌并不总是合适。如果某些项目需要比其他项目更频繁地出现,加权选择更适合。如果每个类别都需要得到保证的代表,分层抽样比进行一次简单的随机洗牌更合适。
常见问题
这种洗牌真的随机吗?
它依赖网页浏览器的伪随机数生成器(PRNG),这是一种公式,产生的数列在实际应用中表现得像随机数。对于课堂点名顺序、赛事种子排位或挑选一部电影,这已经足够。但它并非为密码学设计,也不适用于赌博系统,或任何金钱、安全依赖不可预测性的场合;这些场合需要经过认证的随机数生成器。
工具会将我的列表发送到服务器吗?
洗牌本身完全在浏览器中使用 JavaScript 运行,因此重新排列列表不需要网络请求。当前列表也会写入网页地址,因此重新加载页面或添加书签不会丢失列表。如果复制、分享或重新打开该地址,列表也会随地址一起传递,包括传递给之后加载该页面的任何服务器。如果这点很重要,请避免在列表中放入敏感信息。
重复项目会怎样?
重复项目会被保留。如果输入中“Sam”出现两次,打乱后的输出中仍会出现两次,只是可能位于不同位置。
我可以打乱多少个项目?有数量限制吗?
工具没有内置数量限制。由于洗牌以线性时间运行,即使是很长的列表,在任何现代设备上也能在不到一秒的时间内完成重新排序。
打乱与排序有何不同?
排序依据固定规则排列项目,例如按字母顺序排列;对于相同的输入,它总是产生相同的结果。打乱则以随机方式排列项目,即使输入完全相同,几乎每次也会产生不同的顺序。
可以多次打乱同一个列表吗?
可以多次打乱。每次点击“随机排列列表”都会重新运行算法,并且独立于之前的洗牌。对于较短的列表,顺序偶然重复是可能的;对于较长的列表,重复的可能性会变得极低。
参考文献
- 美国国家标准与技术研究院。Dictionary of Algorithms and Data Structures: Fisher-Yates shuffle。NIST DADS,Fisher-Yates 洗牌算法 — 该算法将每个元素与剩余范围内的一个随机元素交换,运行时间为线性;Fisher 和 Yates,1938 年;Durstenfeld,1964 年。
- MDN Web Docs(Mozilla)。Math.random()。MDN,Math.random() — 浏览器的伪随机数在密码学意义上并不安全。