使用方法
- 「生成数量」默认 10,范围 1 到 50,步长 1。光标停在框里按回车立即重抽一次。
- 「抽样口径」二选一:均匀是 51 项等概率,按人口加权是人口多的州更容易出现。两者是两套完全不同的概率,结果分布差别很大。
- 「是否允许重复」决定抽中之后放不放回。允许重复时同一个州可能连着出现两次;不允许重复时抽一项就从候选里剔掉一项。
- 「输出字段」可选州名(中文加英文)、缩写、缩写加人口、缩写加面积或全部字段;「结果排序」可选抽取顺序、字母序、加入联邦顺序、人口降序、面积降序。
- 「随机种子」默认 20260101,范围 1 到 2147483646,步长 1。种子与其余选项都相同时,抽出的序列逐项一致;改一位数字就换一批。
- 「排除名单」默认写着 AK 与 HI 两行,每行写一个中文州名、英文州名或两字母缩写,大小写不敏感。按 Ctrl+Enter(Mac 上 Cmd+Enter)重新生成,清空后点「立即生成」会填回示例。
- 结果区第一行给出本次抽样的口径说明,下面按你选的字段逐行列出。「复制结果」复制整段文字,「复制表格」复制完整对照表的制表符版本。
- 工具区下方就是那张 51 项完整表,默认显示 12 行,点「加载更多」展开全部,点「导出 CSV」存成带 BOM 的文件。
这个随机美国州名生成器能解决什么问题
「随机抽一个州」听起来只有一种做法,实际上至少有两种,而且它们的分布完全不同。均匀口径下 51 项等概率,每一项都是 1.96 个百分点;按人口加权时加利福尼亚占 11.93 个百分点,怀俄明只占 0.17 个百分点,两者相差 68.54 倍。本站这一页把两种口径都摆出来,就是为了让「随机」这件事先被说清楚再动手。
第一类是造测试数据。批量生成地址、订单、门店记录时,州名字段若按均匀分布造,会造出一个与现实人口完全不符的样本:怀俄明和加利福尼亚出现次数一样多,任何按州聚合的统计都会失真。按人口加权抽出的样本才接近真实分布。
第二类是抽签与分组。课堂点名、团建分组、抽奖这类场景要的恰恰是公平,也就是 51 项等概率的均匀口径;这时若误用了按人口加权,大州会被反复抽中,小州几乎轮不到。
第三类是做示例与占位内容。写文档、做演示数据、填表单样例时,需要的是几个读起来像真的州名,这时用均匀口径加固定种子最省事:种子一记,下次还能复现同一串结果。
第四类是排除特定项。阿拉斯加与夏威夷在物流、配送时效的样例里经常要剔除;本页的排除名单支持中文州名、英文州名与两字母缩写三种写法,填进去就从候选池里摘掉。
计算原理与变量说明
候选池是 51 项:50 个州加华盛顿特区。另有 5 个有人居住的领地不在这 51 项之内,它们的居民是美国公民但没有国会投票代表,本页不纳入抽取。
2020 年普查给出的全国合计是人口 331455055、面积 9833518 km²。人口最多的是加利福尼亚 39538223、得克萨斯 29145505、佛罗里达 21538187;人口最少的是怀俄明 576851,与加利福尼亚相差 68.54 倍。面积最大的是阿拉斯加 1723337 km²;面积最小的「州」是罗得岛 4001 km²——哥伦比亚特区只有 177 km²,但它不是州。阿拉斯加除以罗得岛是 430.726568358 倍。
伪随机数的生成只用一条线性同余式,每次抽一项推进一次:
s = (Math.imul(s, 1103515245) + 12345) & 0x7fffffff,然后 r = s / 2147483647 得到 [0, 1) 区间里的数。这里必须用按位与把结果压回 31 位,写成 s * 1103515245 + 12345 会因为超出双精度能精确表示的整数范围而丢掉低位,序列也就不再是同一个序列。
均匀口径取 Math.floor(r * arr.length),直接把 r 映射到候选下标。按人口加权则先求候选池的人口总和,令 t = r * 总和,再顺着人口累计值找到第一个超过 t 的那一项。两者的差别只在这一步:前者按项数等分区间,后者按人口等分区间。
不允许重复时,每抽中一项就把它从候选数组里摘掉,下一次推进随机数时数组长度已经少一。所以数量超过候选池大小时本页直接报错,不会静默地把数量压到可用项数。
每个州都有一个两字母的 USPS 缩写。早期邮政系统用过 Ala.、Calif.、Colo.、Penn. 这类长短不一的写法,1963 年才统一成两字母。FIPS 州代码则是 01 到 56 的编号,含领地与特区,编号并不连续,例如没有 03、07,14 到 15 之间也跳号。
完整示例(数值仅作演示)
打开页面时的默认值是数量 10、均匀口径、允许重复、输出州名、不排序、种子 20260101,排除名单写着 AK 与 HI,候选池因此是 49 项。抽出的一列是:爱达荷、亚拉巴马、爱达荷、新墨西哥、肯塔基、得克萨斯、马里兰、蒙大拿、新墨西哥、亚拉巴马。爱达荷与新墨西哥各出现两次,正是「抽完放回」的直接结果。
把「是否允许重复」改成不允许重复,同样这颗种子会抽出 10 个互不相同的州——因为每抽一项候选池就少一项,后续的下标映射全部右移。这不是换了随机源,是换了抽样方式。
把「抽样口径」改成按人口加权,同一颗种子下的分布立刻偏向大州:加利福尼亚、得克萨斯、佛罗里达这类人口上千万的州出现频率明显升高,怀俄明、佛蒙特这类人口不足百万的州可能几十次才轮到一次。加权概率与均匀概率之比,加利福尼亚是 6.08362836102,也就是它在大州口径下比在均匀口径下容易出现六倍多。
51 个州与特区对照表
下表是人口最多的前 12 项,人口占比按全国合计 331455055 计算。完整 51 项表在工具区,含 FIPS 代码与加入年份,可展开并导出。
| 中文州名 | 英文州名 | 缩写 | 2020 人口 | 人口占比 | 面积 km² |
|---|---|---|---|---|---|
| 加利福尼亚 | California | CA | 39538223 | 11.93 | 423967 |
| 得克萨斯 | Texas | TX | 29145505 | 8.79 | 695662 |
| 佛罗里达 | Florida | FL | 21538187 | 6.50 | 170312 |
| 纽约 | New York | NY | 20201249 | 6.09 | 141297 |
| 宾夕法尼亚 | Pennsylvania | PA | 13002700 | 3.92 | 119280 |
| 伊利诺伊 | Illinois | IL | 12812508 | 3.87 | 149995 |
| 俄亥俄 | Ohio | OH | 11799448 | 3.56 | 116098 |
| 佐治亚 | Georgia | GA | 10711908 | 3.23 | 153910 |
| 北卡罗来纳 | North Carolina | NC | 10439388 | 3.15 | 139391 |
| 密歇根 | Michigan | MI | 10077331 | 3.04 | 250487 |
| 新泽西 | New Jersey | NJ | 9288994 | 2.80 | 22591 |
| 弗吉尼亚 | Virginia | VA | 8631393 | 2.60 | 110787 |
四种排序给出的第一名互不相同:按字母序第一是 Alabama、最后是 Wyoming;按加入联邦顺序第一是特拉华(1787 年 12 月 7 日批准宪法)、第五十是夏威夷(1959 年 8 月 21 日);按人口第一是加利福尼亚;按面积第一是阿拉斯加。
结果边界、舍入与适用说明
- 数量留空、写成小数、小于 1 或大于 50 时分别给出对应提示,不自动夹到边界值——静默夹取会让你以为填的 60 生效了。
- 种子留空、写成小数或超出 1 到 2147483646 时分别给出对应提示;种子只取整数,填 12.7 不会被当成 13。
- 不允许重复且数量大于可用项数时报出「可用 N 项、你填了 M」,不自动缩小数量。可用项数会随排除名单变化,先把所有项都排掉会导致候选池为空并报错。
- 排除名单每行只认中文州名、英文州名或两字母缩写三种写法,匹配不到时报出行号与原文,不做模糊匹配——写 Calif. 这种 1963 年以前的老写法会被判为无效。
- 排除名单被清空时不会报错,而是把示例 AK 与 HI 填回去再抽。
- 人口占比按全国合计 331455055 归一化,保留两位小数。51 项人口相加为 331449281,与合计值相差 5774,两位小数下占比不受影响。
- 加权抽样用的是候选池内人口之和,不是全国合计。排除部分州之后,剩余项的概率会重新归一化。
- 本页的随机数是确定性伪随机,用线性同余式推进,够做示例与抽样,不能当密码学随机用。
常见问题
均匀抽样和按人口加权到底差多少?
差很多。均匀口径下每一项都是 1.96 个百分点;按人口加权时加利福尼亚是 11.93 个百分点、怀俄明只有 0.17 个百分点,两者相差 68.54 倍。加利福尼亚的加权概率与均匀概率之比是 6.08362836102,也就是它在加权口径下容易出现六倍多。
为什么说是 51 项而不是 50 个州?
因为候选池含华盛顿特区:50 个州加哥伦比亚特区共 51 项,特区人口 689545、面积 177 km²。另有 5 个有人居住的领地不在其中,本页不纳入抽取。
面积最小的州是哪个?
只看 50 个州的话是罗得岛,4001 km²。若把特区也算进来,哥伦比亚特区只有 177 km²,但它不是州。面积最大的是阿拉斯加 1723337 km²,除以罗得岛是 430.726568358 倍。
同一颗种子为什么换了选项结果就变了?
种子只决定伪随机数列本身,选项决定这一列怎么被使用。改成按人口加权,同一个 r 会被映射成累计人口上的位置而不是数组下标;改成不允许重复,候选数组长度每次都变。任何一种改动都会让映射关系整体偏移。
随机算法为什么强调要用 Math.imul?
线性同余式里的乘数 1103515245 与 31 位状态相乘会超出双精度能精确表示的整数范围,直接写乘号会丢掉低位。Math.imul 做 32 位整数乘法,配合按位与把结果压回 31 位,序列才与定义一致。
FIPS 代码为什么不是连续的?
FIPS 州代码按字母序从 01 编到 56,中间穿插了领地与特区,且历史上撤销过若干编号,所以 03、07 等编号是空的。它和 USPS 两字母缩写是两套独立体系,缩写是 1963 年才统一的。
允许重复时同一个州连续出现是出错了吗?
不是。允许重复意味着抽完放回,候选池长度不变,下一个下标完全独立,同一个州连着出现两次甚至三次都属正常。想要互不相同的名单,请把「是否允许重复」改成不允许重复。
输入的内容会上传到服务器吗?
不会。数量、种子、排除名单与所有选项只在本页脚本里参与运算,页面没有发起任何网络请求,刷新后输入即回到默认值。