使用方法
- 在「玩法」里选双色球或大乐透。两者结构不同:双色球是红球 33 选 6 加蓝球 16 选 1(共 7 个号),大乐透是前区 35 选 5 加后区 12 选 2(共 7 个号),切换玩法后号码范围和每区个数会一起改变。
- 在「生成注数」填 5(示例值),允许 1~50 的整数。一注就是一个完整号码组合,例如双色球的一注是「6 个红球 + 1 个蓝球」。
- 想避开某些号码时,在「排除号码」里按 03,17,29 这样的格式填,最多 5 个。被排除的号码会从对应玩法的红球(或前区)号池里剔除,剩余号码仍然等概率抽取。
- 两个选项默认都勾选:「注内号码升序排列」让每注号码从小到大排列,便于与开奖号码逐位比对;「注与注之间不重复」保证同一批里不会出现两注完全相同的号码。
- 点「生成号码」生成,或在输入框里直接按 Enter。「复制全部」按行带走全部号码;「导出 CSV」下载带 BOM 的表格文件,用 Excel 打开不会乱码;「复制对照表」把下方奖级概率表按 TSV 复制,可直接粘进电子表格。
这个工具能解决什么问题
一是把「随手写几个号」换成可验证的等概率抽样。手写号码往往落在 1~31(生日、纪念日),双色球红球最大到 33、大乐透前区最大到 35,手写很容易永远不碰 32 以上的号,分布明显偏斜。这个彩票数字生成器对红球/前区的每一个号码都给出相同的被抽中机会。
二是批量准备号码,避免人工重复。要在多期投注里一次写 20、30 注时,手工编号很容易写重、写漏、写超范围。「注与注之间不重复」勾选后,程序用集合判重剔除完全相同的组合,不用事后核对。
三是把中奖难度换算成看得懂的数字。很多人对「一千七百万分之一」没有直观概念,本页把它换算成「约合 1 / 17,721,088」「每天买一注连续 50 年约 0.103%」这类可比较的量,帮你在做投入决定前先看清数量级。
四是快速排除特定号码。想避开上一期开出的号、或不想用某些数字时,把它们填进「排除号码」,剩余号池重新计算组合数后继续等概率抽样,整个过程仍然是可复现的。
本页不做这些事:不预测走势、不分析冷热号、不做遗漏统计、不承诺任何中奖可能。要生成其它随机序列,可以用页面底部的「随机数字生成器」「随机顺序生成器」;要把已有名单随机排成队列,可以用「列表随机打乱」。
生成原理:区间划分与 Fisher–Yates 不重复抽样
结构决定算法。双色球与大乐透都属于「分区不重复抽样」:同一区内不能重复取号,而且每区抽取个数是固定的。这个彩票数字生成器先用一张结构表把玩法拆成区间,双色球记为 red: 1–33 取 6、blue: 1–16 取 1;大乐透记为 front: 1–35 取 5、back: 1–12 取 2。代码对每个区间分别调用同一个抽样函数,所以两种玩法共用一套逻辑,只有参数不同。
抽样用部分 Fisher–Yates 洗牌。标准做法是把 1 到 N 的号池按顺序摆好,然后从下标 0 开始,每一步在「当前位置到末尾」之间随机挑一个下标交换过来,重复 k 次就得到 k 个互不相同的号码。这种方式和「随机抽一个、抽到重的就重抽」等价,但不会因为重复而空转,抽取次数恰好是 k 次。注意它不是 sort(function () { return Math.random() - 0.5 })——后者在多数浏览器引擎里会退化成分布明显不均的伪洗牌,号码会出现可见偏斜。
随机源用拒绝采样消除取模偏差。本工具取随机数用 crypto.getRandomValues(new Uint32Array(1)),得到 0~4294967295 的均匀整数。直接写 n % 33 会因为 4294967296 不能被 33 整除而让前若干个数多出现一次;所以先算接受上限 Math.floor(4294967296 / 33) * 33 = 4294967241,落在 4294967241 之后的取值丢弃重抽,接受率 99.9999987%,换来严格均匀的下标。
组合数从区间直接相乘得到。双色球红球是 33 选 6 的组合数 C(33,6) = 1,107,568,蓝球 16 选 1 是 16 种,两者独立相乘得总组合数 1,107,568 × 16 = 17,721,088;大乐透前区 C(35,5) = 324,632、后区 C(12,2) = 66,总组合数 324,632 × 66 = 21,425,712。这也解释了为什么彩票设计成「分区 + 不重复」:每区不允许重复、区与区独立,才能让每一注等势——即每种组合出现的概率完全相同。
依据的规则。号码取值范围与开奖结构遵循《中国福利彩票「双色球」游戏规则》(红球 1–33 选 6,蓝球 1–16 选 1)与《超级大乐透游戏规则》(前区 1–35 选 5,后区 1–12 选 2);洗牌遵循 Fisher–Yates(也称 Knuth shuffle)洗牌算法;随机数遵循 W3C Web Cryptography API 的 getRandomValues 定义。
完整示例(数值仅作演示)
示例条件与打开页面时的默认值一致:玩法双色球、生成 5 注、勾选升序与注间去重、不排除号码。此时号池为红球 33 个、蓝球 16 个,未加任何限制的组合数为:
- 红球部分
C(33,6) = 1,107,568种; - 蓝球部分
C(16,1) = 16种; - 一注总组合数
1,107,568 × 16 = 17,721,088,约 1.77×107 种; - 单注中一等奖(6 红 + 1 蓝全中)的概率
1 / 17,721,088 ≈ 5.643×10−8,也就是 0.000005643%; - 单注命中任意一个奖级的概率约 6.709%(各奖级组合数合计 1,188,988,除以总组合数);
- 若每天都买 1 注、连续买 50 年,共 365 × 50 = 18,250 注,中一等奖的概率约 0.103%——仍低于千分之二。
把默认条件举例说明:假设这次生成的第 1 注是下面这一组,它就是「红球 6 个互不相同且在 1–33 内、蓝球 1 个且在 1–16 内」的那种结构,共 7 个号:
第 1 注 05 11 18 24 29 33 + 07 第 2 注 02 09 14 21 27 31 + 12 第 3 注 03 08 16 22 28 30 + 04 第 4 注 01 07 13 19 25 32 + 15 第 5 注 06 10 17 23 26 33 + 09
如果改成大乐透,结构换成前区 35 选 5、后区 12 选 2,一注仍是 7 个号,但总组合数变成 324,632 × 66 = 21,425,712,约 2.14×107 种,比双色球多出约 21%。这些数字全部由下方对照表逐行列出,你可以按 C(n,k) 自行复核。
玩法结构、组合数与各奖级概率对照表
下表按奖级逐行列出中奖条件、对应的组合数、单注概率与「约合多少分之一」。默认显示前 12 行,点「加载更多」看全部 15 行;「导出 CSV」下载带 BOM 的全表。
| 玩法 | 奖级 | 中奖条件 | 组合数 | 单注概率 | 约合 |
|---|---|---|---|---|---|
| 双色球 | 一等奖 | 6 红 + 1 蓝 | 1 | 5.643×10−8 | 1 / 17,721,088 |
| 双色球 | 二等奖 | 6 红 + 0 蓝 | 15 | 8.465×10−7 | 1 / 1,181,406 |
| 双色球 | 三等奖 | 5 红 + 1 蓝 | 162 | 9.142×10−6 | 1 / 109,389 |
| 双色球 | 四等奖 | 5 红 + 0 蓝 或 4 红 + 1 蓝 | 7,695 | 4.342×10−4 | 1 / 2,303 |
| 双色球 | 五等奖 | 4 红 + 0 蓝 或 3 红 + 1 蓝 | 137,475 | 7.758×10−3 | 1 / 129 |
| 双色球 | 六等奖 | 2/1/0 红 + 1 蓝 | 1,043,640 | 5.889×10−2 | 1 / 17 |
| 大乐透 | 一等奖 | 5 + 2 | 1 | 4.667×10−8 | 1 / 21,425,712 |
| 大乐透 | 二等奖 | 5 + 1 | 20 | 9.335×10−7 | 1 / 1,071,286 |
| 大乐透 | 三等奖 | 5 + 0 | 45 | 2.100×10−6 | 1 / 476,127 |
| 大乐透 | 四等奖 | 4 + 2 | 150 | 7.001×10−6 | 1 / 142,838 |
| 大乐透 | 五等奖 | 4 + 1 | 3,000 | 1.400×10−4 | 1 / 7,142 |
| 大乐透 | 六等奖 | 3 + 2 | 4,350 | 2.030×10−4 | 1 / 4,925 |
| 大乐透 | 七等奖 | 4 + 0 | 6,750 | 3.150×10−4 | 1 / 3,174 |
| 大乐透 | 八等奖 | 3 + 1 或 2 + 2 | 127,600 | 5.956×10−3 | 1 / 168 |
| 大乐透 | 九等奖 | 3 + 0 / 2 + 1 / 1 + 2 / 0 + 2 | 1,287,281 | 6.008×10−2 | 1 / 17 |
- 「组合数」是在本玩法全部 17,721,088(或 21,425,712)种组合里,满足该奖级条件的组合有多少个。例如双色球二等奖要求 6 红全中、蓝球不中,蓝球有 15 种不中的选法,所以是 15 个组合。
- 「约合」把概率换算成「平均每多少注出一个」,比百分数更直观:双色球六等奖约合 1 / 17,一等奖约合 1 / 17,721,088。
- 各奖级互斥且穷尽所有中奖组合,把「组合数」一列相加,双色球得 1,188,988(占 6.709%),大乐透得 1,429,197(占 6.670%)。
输入范围、边界与取整说明
- 生成注数 1~50 的整数。0、负数、小数、字母和空值都会被拒绝并给出具体提示。上限 50 是因为一次渲染 50 注已经足够覆盖常见的批量需求,再多会让结果区过长、复制和导出都变慢。
- 排除号码最多 5 个,且必须是本玩法红球(前区)范围内的整数。双色球允许 1–33、大乐透允许 1–35;填
34在双色球下会被判越界并指出。蓝球/后区不参与排除,这是刻意设计——蓝球只有 16(12)个号,排除后对概率的扰动比例过大,容易让人误以为「排除了号就能提高命中」。重复填同一个号码只算一个。 - 排除后组合数实时变化。双色球排除 e 个红球后,红球组合数是
C(33−e, 6)。例如排除 3 个号后剩 30 个红球,C(30,6) = 593,775,一注总组合数变为593,775 × 16 = 9,500,400。号码池变小不等于更容易中——你同时也放弃了被排除号码开出的那些结果。 - 升序排列只影响显示。双色球红球 6 个、蓝球 1 个;大乐透前区 5 个、后区 2 个。勾选「注内号码升序排列」后按数值从小到大输出,与官方开奖号码的书写习惯一致,方便逐位核对;关闭后按抽取顺序输出,号码集合本身不变。
- 注间去重会牺牲一点随机性。勾选后程序保证 50 注互不相同(用字符串键做集合判重)。在总组合数上千万的前提下,随机重复的概率极低,去重几乎不改变结果分布,只是让批量名单更整齐。
- 单注概率与注数成正比,但增长极慢。这个彩票数字生成器只负责把号码池等概率打散,买 n 注不同号码,中一等奖的概率是
n / 17,721,088。买 50 注约 2.82×10−6,买 500 注也只有 2.82×10−5,仍在十万分之几的量级。
常见问题
用这个工具选号,中奖概率真的会提高吗?
不会。开奖是等概率的独立事件,任何一注号码在每一期被开出的概率都相同,与你用什么方法选号无关。本工具只是把「人选」换成「机器等概率抽」,避免手写号码偏在 1–31 这类人为偏差,它不能预测结果,也不能改变 1 / 17,721,088 这个概率。
为什么双色球和大乐透的总组合数差这么多?
因为选号范围不同。双色球红球 C(33,6) = 1,107,568 乘蓝球 16 得 17,721,088;大乐透前区 C(35,5) = 324,632 乘后区 C(12,2) = 66 得 21,425,712。前区号码更多、后区要选两个,所以大乐透的一等奖概率略低(4.667×10−8 对 5.643×10−8)。
「注与注之间不重复」和「注内号码升序」有什么区别?
前者约束两注之间不能完全相同,作用在整批结果上;后者只改变单注内部号码的书写顺序,是 6 个(或 5 个)号按从小到大排还是按抽取顺序排。一个影响你拿到几注不同的号,另一个只影响这注号看起来顺不顺眼。
排除几个号码,是不是更容易中?
不是。排除号码会让组合空间变小,但你也同时排除了被排除号码真正开出的那些结果,命中概率并不会上升。举例:双色球排除 3 个红球后总组合从 17,721,088 降到 9,500,400,看起来「空间小了」,但这时你中一等奖的前提变成「开奖号里不含你排除的那 3 个」,两者相抵,实际概率不升反微降。
「热号」「冷号」「走势图」对选号有帮助吗?
对提高概率没有帮助。每一期开奖都是独立的等概率事件,历史出现频率不会改变下一期的分布;某个号码「很久没出」也不代表它「该出了」。走势图能帮你避开很多人共同选的号,从而万一中奖时少分一些奖金,但这属于改变收益结构,不是提高中奖概率。
用生日选号有什么问题?
生日只覆盖 1–31,而双色球红球最大到 33、大乐透前区最大到 35,用生日选号会永远避开 32 及以上的号码,分布被人为截断。更重要的是,很多人的生日集中在上半年、集中在几个月份,一旦中奖,与你分同一个奖池的人更多,单注奖金会被摊薄。
生成的号码会上传或保存吗?
不会。随机数来自浏览器 crypto.getRandomValues,抽样、排序、去重和导出全部在当前页面完成,没有任何网络请求,也不写入浏览器存储;刷新页面后结果区会回到那段固定的演示值。想自己验证,可打开开发者工具的 Network 面板观察点击生成时没有新请求。
导出的 CSV 用 Excel 打开为什么能正常显示中文?
因为导出时在文件开头写入了 UTF-8 BOM(字节 EF BB BF),Excel 读到它就会按 UTF-8 解析,不会把中文显示成乱码。也正因如此,本页只导出 CSV/TSV,不导出「带 BOM 的 JSON」——JSON 规范不允许开头出现 BOM,否则 JSON.parse 会直接报错。