使用方法
- 「随机种子」默认 20251013,范围 0 到 2147483647。同一个种子配上同样的数量与采样模式,永远得到同一串坐标,方便把结果写进文档或测试用例。
- 「生成数量」默认 8,范围 1 到 200;「小数位」默认 4,范围 0 到 8。改完任意一项立刻重算,光标停在框里按回车同样触发。
- 「采样模式」二选一:等距圆柱均匀把地球当成一张等距圆柱投影的矩形,纬度和经度各自均匀取;等面积均匀让 sin(纬度) 均匀,是球面上真正均匀的取法。
- 「输出格式」二选一:十进制度给 -50.7659 这样的数;度分秒给 39°54'15.12" 这样的写法,小数位控制的是秒的小数位。
- 结果区上面一行是种子、模式、组数与第一组坐标;下面一段是完整坐标表与「同一经度改用另一种采样」的纬度对照。
- 下面那张坐标表默认显示 12 行,超过 12 组时点「加载更多」展开全部,点「导出 CSV」存成带字节序标记的文件。
- 「复制结果」复制整段坐标;「复制对照表」复制正文里那张前 8 组两种模式对照表,制表符分隔,可直接粘进表格软件。
- 种子留空、写成小数或超出 0 到 2147483647、数量超出 1 到 200、小数位超出 0 到 8,都会给出指明原因的提示。
- 整页不联网、不写本地存储,种子与数量只用于本次计算。
这个随机坐标生成器能解决什么问题
第一类是测试数据。给地图接口灌一百条坐标做压力测试,或者给定位相关的单元测试造几条固定输入,都需要「每次都一样」的随机。本页用线性同余发生器:s = (s × 1103515245 + 12345) mod 231,取数 r = s / 2147483647,种子固定则序列固定,不需要把结果存下来。
第二类是采样口径的选择。把经度和纬度各自均匀取是最直觉的做法,但它在球面上是错的:纬线长度随纬度按 cos 收缩,均匀取纬度会让两极附近的点密度远高于赤道。做「随机取景」「随机撒点看分布」这类需求时,必须切成等面积采样,否则结论本身就偏了。
第三类是坐标系写法的转换。同一条坐标,十进制度写 -50.7659,度分秒写 50°45'57.24"S;对接只认 DMS 的老系统或只认十进制的新接口时,来回换一次就能省掉手算。
还有一条要提前想清楚:地球表面陆地只占 29 个百分点,纯随机落点大约有 71 个百分点落在海上。做随机取景、随机地标这类应用,必须额外做一次陆地判定。
计算原理与变量说明
整页的核心是线性同余发生器与两条纬度映射,加上一条经度映射。
| 变量 | 公式 | 说明 |
|---|---|---|
| 状态推进 | s = (s × 1103515245 + 12345) mod 231 | 用 32 位整数乘法,避免浮点误差 |
| 取数 | r = s / 2147483647 | 映射到 0 到 1 之间 |
| 经度 | lon = −180 + r × 360 | 两种模式共用 |
| 纬度(等距) | lat = −90 + r × 180 | 等距圆柱投影下的均匀 |
| 纬度(等面积) | lat = asin(2r − 1) × 180 / π | 球面上真正均匀 |
均匀采经纬度在球面上是错的。等距圆柱投影把地球拉成一个矩形,而纬度 φ 处的纬线长度正比于 cos(φ):cos(0°) = 1、cos(60°) = 0.5、cos(80°) = 0.173648177667、cos(89°) = 0.0174524064373。80 度处的纬线长度只有赤道的 17.36 个百分点,可均匀采样会给出和赤道一样多的点,于是两极被严重过度采样。
正确做法是让 sin(纬度) 均匀。这是阿基米德等面积投影的性质:把球面面积按纬度带等分,每个带拿到的面积相同,反解出 lat = asin(2r − 1) × 180 / π。同一枚种子下两种采样的经度序列完全相同、纬度完全不同——种子 20251013 第 1 组等距纬度是 -50.7659,等面积是 -34.3374,差了 16 度多。看整张表会更直观:所有点都往赤道方向挪,纬度绝对值越大的挪得越多。
精度不是越高越好。纬度 1 度约等于 111.32 千米,写到小数点后 6 位约等于 0.11132 米,已经超过民用 GPS 的精度(大约 5 到 10 米),再往下写是没有意义的有效数字。要写度分秒,39.9042 换算成 39°54'15.12",116.4074 换算成 116°24'26.64"。
随机落在海上的概率约 71 个百分点。陆地只占地球表面 29 个百分点,所以做随机取景类应用必须额外做陆地判定,否则三分之二的点落在太平洋里。本页只负责出坐标,不做陆地判定。
完整示例(数值仅作演示)
打开页面是种子 20251013、等距圆柱、8 组、小数位 4。前八组是:-50.7659 / 150.9710、-27.3510 / 106.2729、15.9871 / 88.5695、16.5099 / 169.0012、-43.5688 / -128.4619、-13.0756 / 29.8169、-69.7235 / 13.0085、-50.4027 / -63.0798。
切成等面积采样,经度一个都不变,纬度依次变成 -34.3374、-17.6920、10.2320、10.5704、-28.9534、-8.3537、-50.7783、-34.0579。第 7 组从 -69.7235 挪到 -50.7783,挪了将近 19 度,是所有组里挪动最大的一个——纬度越高,两种口径差得越多。
换成度分秒写法:第 1 组的经度 150.9710 写成 150°58'15.60",纬度 -50.7659 写成 -50°45'57.24"。小数位调到 8 时秒会写到小数点后 6 位。
把种子改成 1 再生成,会得到完全不同的一串坐标;改回 20251013 就回到上面这组。这正是可复现随机的用途:把种子写进文档,别人就能拿到同一批点。
随机坐标对照表
第一张表是种子 20251013 的前 8 组在两种采样下的对照,「复制对照表」复制的就是它。
| 序号 | 经度(共用) | 纬度(等距) | 纬度(等面积) | 纬度差 |
|---|---|---|---|---|
| 1 | 150.9710 | -50.7659 | -34.3374 | 16.4285 |
| 2 | 106.2729 | -27.3510 | -17.6920 | 9.6590 |
| 3 | 88.5695 | 15.9871 | 10.2320 | 5.7551 |
| 4 | 169.0012 | 16.5099 | 10.5704 | 5.9395 |
| 5 | -128.4619 | -43.5688 | -28.9534 | 14.6154 |
| 6 | 29.8169 | -13.0756 | -8.3537 | 4.7219 |
| 7 | 13.0085 | -69.7235 | -50.7783 | 18.9452 |
| 8 | -63.0798 | -50.4027 | -34.0579 | 16.3448 |
第二张表是纬线长度随纬度的收缩,这正是等距采样失真的根源。
| 纬度 | cos(纬度) | 纬线长度占赤道 |
|---|---|---|
| 0° | 1 | 100.00% |
| 30° | 0.866025403784 | 86.60% |
| 45° | 0.707106781187 | 70.71% |
| 60° | 0.5 | 50.00% |
| 80° | 0.173648177667 | 17.36% |
| 89° | 0.0174524064373 | 1.75% |
第三张表是精度与写法换算。
| 项目 | 数值 | 说明 |
|---|---|---|
| 纬度 1 度 | 111.32 km | 赤道处经度 1 度同样约 111.32 km |
| 小数点后 6 位 | 0.11132 m | 已优于民用 GPS 的 5 ~ 10 m |
| 39.9042 | 39°54'15.12" | 北京城区纬度的度分秒写法 |
| 116.4074 | 116°24'26.64" | 北京城区经度的度分秒写法 |
| 陆地占比 | 29% | 随机落点约 71% 在海上 |
读法:第一张看两种采样的纬度差,纬度越高差越大;第二张看纬线为什么收缩;第三张看该写几位小数。
结果边界、舍入与适用说明
- 种子留空、写成小数或超出 0 到 2147483647 时分别给出对应提示;负数种子不在范围内。
- 数量留空、写成小数或超出 1 到 200 时给出指明范围的提示;小数位超出 0 到 8 同理。
- 纬度严格落在 -90 到 90、经度落在 -180 到 180;等面积采样下纬度取不到正负 90 度(asin 的自变量开区间),等距采样下理论上可以。
- 小数位决定显示精度,不参与采样计算:改成 0 只是把 -50.7659 显示成 -51,重新调回 4 还是 -50.7659。
- 度分秒写法里秒的小数位跟随「小数位」设置;分和秒都按 60 进制换算,不四舍五入到整分。
- 线性同余发生器的周期上限是 231,200 组以内不会重复;它不是密码学随机数,不要拿来当密钥或令牌。
- 等距采样适合「在地图上撒点」这类只关心投影后位置均匀的场景;等面积采样适合「在地球表面撒点」这类关心实际面积的场景。
- 本页不做陆地判定、不做海拔与国界判定,也不校验坐标是否落在合法行政区内。
- 整页不联网、不写本地存储,种子与数量只用于本次计算。
常见问题
为什么换成等面积后经度一点没变?
因为两种采样共用同一串随机数:每个坐标推进两次,第一次给纬度、第二次给经度。等面积只改纬度的映射方式,经度映射不变,所以经度序列完全相同。
均匀取纬度为什么不对?
纬线长度正比于 cos(纬度):80 度处只有赤道的 17.36 个百分点。均匀取纬度会让两极附近拿到和赤道一样多的点,密度远高于实际面积占比。
同一个种子能复现吗?
能。线性同余发生器 s = (s × 1103515245 + 12345) mod 2^31 是确定性序列,种子 20251013 永远给出第 1 组 -50.7659 / 150.9710。
该写几位小数?
纬度 1 度约 111.32 千米,6 位小数约 0.11132 米,已经优于民用 GPS 的 5 到 10 米,再往下写是无意义的有效数字。
为什么很多点落在海里?
陆地只占地球表面 29 个百分点,纯随机落点约 71 个百分点在海上。做随机取景必须额外做陆地判定,本页不做。
度分秒怎么换算?
度取整数部分,余下的乘 60 得分,再余下的乘 60 得秒。39.9042 得 39°54'15.12",116.4074 得 116°24'26.64"。
能拿它生成密码或令牌吗?
不能。线性同余是确定性序列,周期也只有 2^31,不具备密码学强度,只能用于测试数据和演示。
种子和数量会上传吗?
不会。三个数字只在本页脚本里参与整数乘法与取余,没有发起任何网络请求,也没有写入本地存储。