随机抽牌工具

整副 52 张扑克做一次 Fisher-Yates 洗牌后取前 N 张,同一手牌不会抽到重复牌。用固定种子驱动线性同余发生器,同一种子必然发出同一手牌,可勾选大小王扩到 54 张。

5 张牌 / 种子 20261018 / 不含大小王
黑桃5
黑桃9
梅花4
黑桃K
方块Q
牌堆张数52
已抽取5
剩余张数47
去重后张数5(无重复)
序号牌面花色点数
1黑桃5黑桃5
2黑桃9黑桃9
3梅花4梅花4
4黑桃K黑桃K
5方块Q方块Q

默认示例:抽取 5 张、种子 20261018、不含大小王,抽到黑桃5、黑桃9、梅花4、黑桃K、方块Q。改种子会整手重排,抽取 5 张后牌堆还剩 47 张。

使用方法

  1. 「抽取张数」默认 5,可填 1 到 52 的整数,决定这一手发几张牌;不含大小王时一副牌就是这 52 张,填超过 52 会给出提示。
  2. 「随机种子」默认 20261018,可填 1 到 99999999。同一个种子必然发出同一手牌,换个数字则整手重排。
  3. 「把大小王加入牌堆」默认不勾选。勾选后牌堆从 52 张变成 54 张,小王与大王也可能出现在结果里,同时五张牌的概率分母随之改变。
  4. 在张数或种子输入框里直接按回车即开始抽牌,不必点按钮;改动任一控件都会立刻重算。
  5. 「复制结果」把牌面清单放进剪贴板,「复制对照表」复制制表符表格,「导出 CSV」带 UTF-8 字节序标记,表格软件里不会乱码。
  6. 明细超过六行时会出现「加载更多」;「重置」把张数回到 5、种子回到 20261018,并去掉大小王勾选。

这个工具能解决什么问题

本页要解决的是「从一副牌里抽几张」这件事隐含的两个要求:抽出来的牌不能重复,这一手牌还要能被别人再次核对。第一条排除了逐张独立随机的写法——那种写法会发出两张一模一样的牌,而现实里一副牌只有一张黑桃 A;第二条排除了系统随机源,因为它每次刷新都换结果,发给别人后谁也复核不了。

典型用法有三类:桌游开局前给每人发一手牌、课堂与演示里讲解牌型概率、写单元测试时需要一组稳定不变的扑克输入。前两类要求结果看起来随机且每种成手等可能,第三类要求每次都一样。本页用固定种子的做法同时满足:种子不变就绝不会漂移到另一手牌,换种子就能整手重来。

抽样模型决定了它和站内其它随机工具的分工。随机数生成器取的是放回型样本,同一个数可以出现第二次;随机分组是把已经确定的人或物拆进几个桶;骰子滚动器每次的点数互不相关。本页是不放回抽牌:抽出的每一张都从牌堆里消失,因此结果天然无重复。

对照表的使用前提也要提前说清:它描述的是「随机发五张之后这一手属于哪一类」,所以只有恰好抽五张时可以直接查表,抽其它张数时那张表仅供参考。

这个工具在本站也叫 `随机Playing卡号生成器`(早期自动译名留下的旧称呼),页面标题写的是更通行的说法。

洗牌算法、种子与组合数怎么算

牌堆怎么排。四种花色 黑桃 红桃 梅花 方块 各配十三个点数 A 2 3 4 5 6 7 8 9 10 J Q K,按花色在先、点数在后依次入堆,共 4 × 13 = 52 张。勾选大小王时,小王与大王追加在牌堆末尾,牌堆变成 54 张。

随机序列怎么来。本页用线性同余发生器:从种子出发,每一步把当前值乘以 1103515245、加上 12345,再截取低 31 位,写作 s = (Math.imul(s, 1103515245) + 12345) & 0x7fffffff。乘法必须是 32 位有符号整数乘法(代码里写作 Math.imul),直接写普通乘法会因为超出双精度整数的安全范围而丢位,序列就不再闭环。

洗牌怎么走。整副牌做一次 Fisher-Yates,从最后一张往回推进:

for (i = len - 1; i >= 1; i--) { s = lcg(s); j = Math.floor(s / 2147483647 * (i + 1)); swap(deck[i], deck[j]); }

52 张牌时 i 从 51 走到 1,每一步调用一次递推,整副洗完共 51 次调用;54 张时是 53 次。每一步把当前位置与 0 到 i 之间随机的一张交换,这个方向能保证所有排列等可能出现,改换成正序、且随机数仍按同样的区间取,结果就会偏斜。注意除数固定为 2147483647(二的三十一次方减一),与递推式截取到 31 位相呼应。

结果怎么取。抽 N 张就是洗完之后的前 N 张。因为每张牌在牌堆里只出现一次,切片出来的结果天然不重复,不需要额外去重。剩余张数 = 52 − N(勾选大小王时为 54 − N)。

组合数怎么算。五张牌不计抽牌顺序时,总数是 C(52,5) = 2598960 种。某一类牌型的概率等于它的组合数除以 2598960:一对有 1098240 种,1098240 ÷ 2598960 就是 42.2569%。高牌 1302540 种对应 50.1177%,两类相加已占到九成以上,剩下八种牌型合计不到一成。

为什么不用系统随机源。两者的语义正好相反:系统随机源要「每次都不一样」,固定种子的序列要「每次都一样」。本页是后者——把种子写进文档发给别人,对方输入同一个数字就能得到同一手牌,这在写测试用例、复盘牌局、复现某次演示时是刚需。

完整示例(数值仅作演示)

示例条件:抽取张数 5、不含大小王、种子 20261018。默认这一手是 黑桃5 黑桃9 梅花4 黑桃K 方块Q,抽出 5 张后牌堆剩 47 张,去重后仍是 5 张——这一行也可以当作「没有抽到重复牌」的校验。

换种子不是在上一手的基础上继续往前抽,而是把整副牌重新洗一遍。下表列出四个种子的前五张,用来核对页面的复现能力:

随机种子前五张
20261018黑桃5 黑桃9 梅花4 黑桃K 方块Q
1黑桃A 黑桃8 方块5 方块3 梅花J
42红桃A 梅花8 黑桃9 黑桃6 梅花2
2026梅花Q 红桃4 梅花10 红桃10 红桃J

把这四行在不同设备上各跑一遍,结果应当完全一致:算法只依赖种子与固定的牌堆顺序,不读取时间、不联网、不写本地存储。改张数则只是在同一副洗好的牌上截取更长的切片——把张数改成 3 时得到上面前五张的前三张,改成 10 时则往后多取五张。

上述数值均为演示,不代表任何真实牌局的结果。

五张牌牌型概率对照表

下表的前提是不含大小王、恰好抽五张、不计抽牌顺序,总组合 C(52,5) = 2598960。概率按「该类组合数 ÷ 2598960」给出,保留四位小数:

牌型组合数概率构成要点
皇家同花顺40.0002%同花色的 10 到 A
同花顺360.0014%花色相同且点数连续
四条6240.0240%四张同点数
葫芦37440.1441%三条加一对
同花51080.1965%五张同花色且不连续
顺子102000.3925%点数连续且花色混杂
三条549122.1128%三张同点数
两对1235524.7539%两个不同点数各一对
一对109824042.2569%仅两张同点数
高牌130254050.1177%五张既不同点数也不同花色

十行组合数相加恰好回到 2598960,这是这张表最重要的自检:没有任何一类被漏掉或重复计数。读表时留意两点:其一,这张是人类直觉最容易低估的表——最罕见的皇家同花顺只有 4 种,最常见的却是「什么都没有」的高牌,占到一半;其二,概率描述的是「随机发五张之后这一手属于哪一类」,不是「任意抽到某一张是什么」。

勾选大小王之后,样本空间从 C(52,5) 变成 C(54,5),两张王既可以充当任意点数也可以按本页输出直接当作王使用,十行数字全部失效。想在含王的条件下算概率,请自行按 C(54,5) 重新做分母。

结果边界、舍入与适用说明

常见问题

同一个种子为什么每次发出来的牌都一样?

因为整条随机序列由种子加线性同余递推式推出,没有引入时间或系统随机源。起点相同、牌堆顺序相同,洗出来的牌序就相同。想要每批都换,把种子改成另一个数字即可。

为什么这一手牌里一定不会出现两张一模一样的牌?

因为结果是「整副洗完之后的前 N 张」,同一张牌在牌堆里只有一个位置,切片出来的自然各不相同。逐张独立随机的写法才会抽出两张黑桃 A,那不是一副真实的扑克。

勾选大小王之后,下面的概率表还成立吗?

不成立。表里的概率以 C(52,5) = 2598960 为分母,加入大小王后样本空间变成 C(54,5),十行数字都需要重算。勾选项只是让抽牌结果里可能出现小王与大王。

「一对」的 42.2569% 具体指什么?

指随机发五张牌之后,这一手正好是「仅两张同点数」这类成手的概率,等于 1098240 除以 2598960。它描述的是整手的类别,不是某一张牌的点数,也不是「第一张抽到什么」。

把张数填成 52 会得到什么?

相当于把整副牌洗完之后全部列出,也就是一次洗牌的完整结果。它可以当作一副新牌的开牌顺序来用,或者按人数从头开始依次发牌,发完即止,不需要再做任何抽取。

想把这一手牌发给别人核对,要给他什么?

给三个数即可:抽取张数、随机种子、是否含大小王。三者一致,对方就能在任何设备上抽出完全相同的一手牌,这也是本页坚持用固定种子而不是系统随机源的原因。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具