使用方法
列表随机打乱只要三步:
- 把名单粘进「列表(每行一项)」,示例已预填 8 行(一号到八号)。
- 「种子」留 20261007 会得到可复现的顺序;改成 0 则每次都是真随机。
- 点「打乱顺序」(或在列表框里按 Ctrl / Cmd + Enter),下方「打乱结果」立刻给出新顺序。
示例里 8 项配种子 20261007 得到 四号 / 五号 / 六号 / 二号 / 七号 / 一号 / 三号 / 八号;把种子改成 1,顺序变成 三号 / 二号 / 七号 / 八号 / 五号 / 四号 / 一号 / 六号。
列表随机打乱能解决什么
它适合三类需要「可验证随机顺序」的场合:
- 抽签与演讲顺序:先公示种子再打乱,谁都无法事后质疑「是不是排好的」。
- 测试数据打散:把样本顺序打乱做交叉验证前的准备,用固定种子保证同一次实验可复现。
- 分组前的预处理:先随机整体排序,再按顺序切段,就能得到稳定可查的分组。
它不做去重、不排序、不抽取子集。要去重请用行去重工具,要选几个请用随机抽取,要排序请用按字母排序。
原理和变量
① 用了哪个算法:洗牌用 Fisher-Yates(Knuth shuffle)——循环变量 i 从 a.length − 1 递减到 1,每次在 [0, i] 之间取整数 j = Math.floor(rnd() * (i + 1)),交换 a[i] 与 a[j]。
② 为什么不用 sort 随机排序:arr.sort(function () { return Math.random() - 0.5; }) 是流传最广的错误写法。它有两个毛病:比较函数对同一对元素会给出互相矛盾的结果,违反排序的一致性前提;而 V8 的 TimSort 在小于 22 个元素时走二分插入排序,元素位置越接近中间越容易被「留在原地」。结果就是 n 种排列概率不等。
③ 均匀性怎么保证:正确实现下每个下标只在它那一轮被抽一次,等价于把 n! 种排列等概率地选一个。n = 5 时是 120 种,n = 8 时是 40320 种,n = 12 时是 479001600 种。
④ 输入怎么变成输出:种子通过 mulberry32 初始化一个 32 位状态,每次调用先做 a = a + 0x6D2B79F5 再混合位运算,返回 [0, 1) 的小数。种子固定时这条序列完全确定,所以 8 项在种子 20261007 下永远得到 四号 / 五号 / 六号 / 二号 / 七号 / 一号 / 三号 / 八号。
⑤ 边界与阈值:列表为空时报「请先粘贴至少一行内容」;只有一行时提示「1 项无需打乱」但仍原样输出;种子超过 2147483647 或不是整数会被当作无效,自动退回真随机;单次上限 2000 行。
⑥ 常见误用的正确解释:一是用 sort 随机法,分布不均;二是以为同一种子在不同浏览器会得到不同结果——mulberry32 是纯整数运算,跨浏览器结果一致;三是把种子当成安全随机源,它只是伪随机,涉及抽奖公证应改用密码学随机数。
完整示例
演示输入:8 行名单(一号到八号),种子 20261007。
- 输出顺序:四号 / 五号 / 六号 / 二号 / 七号 / 一号 / 三号 / 八号
- 同一颗种子再点一次「打乱顺序」,结果完全相同,用来验证可复现性
- 换种子 1:三号 / 二号 / 七号 / 八号 / 五号 / 四号 / 一号 / 六号,与上面完全不同
- 种子改 0:每次结果都变,无法复现
8 项共有 40320 种排列,上述任意一条都只是其中一种,出现概率相同。
输入范围与对照表
下表列出 1 到 12 项的排列总数,可以用来判断「重排一次」到底有多少种可能:
| 项数 n | 可能排列数 n! | 说明 |
|---|---|---|
| 1 | 1 | 唯一结果,无需打乱 |
| 2 | 2 | 可直接穷举核对 |
| 3 | 6 | 可直接穷举核对 |
| 4 | 24 | 可直接穷举核对 |
| 5 | 120 | 可直接穷举核对 |
| 6 | 720 | 可直接穷举核对 |
| 7 | 5040 | 可直接穷举核对 |
| 8 | 40320 | 可直接穷举核对 |
| 9 | 362880 | 排列数已超十万 |
| 10 | 3628800 | 排列数已超十万 |
| 11 | 39916800 | 排列数已超十万 |
| 12 | 479001600 | 排列数已超十万 |
输入范围:列表 1 到 2000 行,每行最长 200 个字符;种子 0 到 2147483647 的整数,0 表示不固定。
结果边界和舍入
三条边界说明:
- 只打乱顺序,不改内容:每行文本原样保留,前后空格也不裁,行数不变——所以「保留空行」模式下空行也会参与洗牌,可能被挪到中间。
- 伪随机不是安全随机:种子固定的序列可被推算,涉及奖金、摇号等需要公证的场合请用密码学随机数,本页不承担该职责。
- 结果不落盘:页面刷新或关闭后输入与结果都不保留,需要留档请点「复制结果」。
常见问题
种子是做什么用的?
种子决定伪随机序列的起点。同一个种子永远得到同一个打乱结果,方便复现与公示;填 0 则每次真随机。
为什么不能用 sort 加随机数打乱?
比较函数返回随机值时对同一对元素可能自相矛盾,会让排序结果出现明显偏斜,靠近中间的元素更容易留在原位。
打乱会改变我的文本内容吗?
不会。只改变行与行的先后顺序,每行文字本身一字不动。
空行会被打乱吗?
选「保留空行」时空行也参与洗牌;选「丢弃空行」时空行在打乱前就被移除。
同一批数据在不同浏览器结果一样吗?
一样。本页的伪随机算法只用整数运算,不依赖浏览器实现差异。
最多能打乱多少行?
单次上限 2000 行,每行最长 200 个字符,超出会提示并截断。
这能用来抽奖吗?
不建议。伪随机可被推算,且无法提供公证记录。抽奖请使用密码学随机数并留存证据。
会上传我的名单吗?
不会。打乱与结果展示全部在浏览器本地完成,数据不出本机。