[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhdvmYaj-kU-AlF79v4Nn6g2tKFBs5R_E_8Y0wmTrrx4":3,"$fW7BAB5BkhrpFei-euf609NeK4ZvjPf9T1fzgXJlLNns":18,"$foQB0FvAAvHwVEzODAFwh-cCU3Qlwqfg-wkJTJrHhk_w":74,"$fJAngGPN2ZoweBAUNUMveHW9fX-PBt_OThOGUnXXFK7w":103},{"success":4,"data":5},true,{"siteTitle":6,"siteDescription":7,"siteSubtitle":8,"siteFaviconUrl":9,"siteLogoUrl":10,"footerText":11,"footerLinks":12,"socialLinks":13,"postsPerPage":14,"themeName":15,"navColor":16,"navTextColor":17},"Hyaika Blog","A personal blog powered by Hyaika","Penguin is all you need","🐧","\u002Fapi\u002Fmedia\u002Favatar_a0b54615","致三千年前的你",[],[],10,"kratos","#9147eb","#ffffff",{"success":4,"data":19},[20,27,33,39,45,51,56,62,68],{"id":21,"name":22,"slug":23,"description":24,"color":25,"postCount":26},"9ca4490e-c5a6-4b61-945c-4db21d224507","设计","design","UI\u002FUX 设计与创意",null,35,{"id":28,"name":29,"slug":30,"description":31,"color":25,"postCount":32},"a102062c-2d51-415b-bc5c-5b89b36f6e3f","动漫","anime","动漫点评与推荐",18,{"id":34,"name":35,"slug":36,"description":37,"color":25,"postCount":38},"b14ff5c7-a673-4cb1-a9e5-c785069b2938","生活","life","生活随笔与日常分享",45,{"id":40,"name":41,"slug":42,"description":43,"color":25,"postCount":44},"cat_ccf18b24e2c04191","社会观察","social-observation","社会观察、教育、文化对比",20,{"id":46,"name":47,"slug":48,"description":49,"color":25,"postCount":50},"cat_news_roundup","新闻杂烩","news-roundup","每日新闻汇总，覆盖科技、二次元、游戏、音乐等领域",83,{"id":52,"name":53,"slug":54,"description":25,"color":25,"postCount":55},"cat_science","科学","science",69,{"id":57,"name":58,"slug":59,"description":60,"color":25,"postCount":61},"e6b59e04-130e-4da0-851f-64042040f4f6","技术","tech","技术教程与开发经验",204,{"id":63,"name":64,"slug":65,"description":66,"color":25,"postCount":67},"cat_09e5464f1b304aa8","情感八卦","gossip","情感话题与八卦杂谈",0,{"id":69,"name":70,"slug":71,"description":72,"color":25,"postCount":73},"cat_b22f7ce5ece64985","经济","economy","经济分析与商业观察",27,{"success":4,"data":75},{"id":76,"title":77,"slug":78,"content":79,"summary":80,"coverUrl":81,"readingTime":82,"viewCount":67,"loveCount":67,"publishedAt":83,"createdAt":83,"author":84,"coverSource":87,"showCoverInArticle":4,"categories":88,"tags":90,"commentCount":101,"liked":102},"cdb059c7-b8ee-4db4-a162-176d61bfb86d","AMD 的随机数生成器，永远吐不出一个 0","amd-rdrand-never-zero","# AMD 的随机数生成器，永远吐不出一个 0\n\n## 目录\n\n- **一台 AMD，两年没见过 0**\n- **0 到底有多稀有：先算一笔概率账**\n- **现场验证：我在 Intel 上替 AMD 把这场实验跑了**\n- **从「全是 1」到「没有 0」：AMD RNG 的 Bug 家族史**\n- **最讽刺的一周：Zen 5 的 RDSEED 正在疯狂吐 0**\n- **所以，一个「永远不输出 0」的 RNG 意味着什么**\n\n---\n\n## 一台 AMD，两年没见过 0\n\n2026 年 5 月，巴西的汇编语言程序员 Jessé 在 flat assembler 论坛上发了一帖，标题平平无奇：*「AMD 的随机数生成器无法生成 0 吗？」*\n\n他写了一个小程序，用 `rdrand` 和 `rdseed` 指令疯狂抽取随机数，然后统计 0、1、-1 出现的次数。结果让他愣了很久：**在 AMD 上，16 位宽的随机数里，0 一次都没出现过**。同样的代码换到 Intel 上，0 的出现完全正常。\n\n他在帖子里说：从发帖前 9 天开始，到他发帖那一刻，**两台 AMD 处理器，没有吐出一个 0**。\n\n这个帖子的标题在 9 月 22 日登上了 Hacker News 首页，230 分，171 条讨论。但真正让我感兴趣的不是「AMD 出了 bug」这个结论——毕竟芯片厂商出 bug 不稀奇。我感兴趣的是：**一个「永远不输出 0」的随机数生成器，到底是怎么通过验证的？**\n\n## 0 到底有多稀有：先算一笔概率账\n\n先别急着嘲讽 AMD。0 在随机数里出现的概率，比你想象的低得多。\n\n- 16 位随机数：范围 0~65535，出现 0 的概率是 **1\u002F65536 ≈ 0.0015%**\n- 32 位随机数：概率是 **1\u002F2³² ≈ 0.00000002%**\n- 64 位随机数：概率是 **1\u002F2⁶⁴**，小到约等于 0\n\n也就是说，如果你想验证「32 位 RNG 能不能输出 0」，你需要**平均抽 42.9 亿次**才能遇到一次。这已经超出了任何常规测试的耐心范围。\n\nJessé 的帖子之所以能测出问题，是因为他用了 **16 位**窗口——1\u002F65536 的概率在几千万次抽样里是**完全可测的**。换成 32 位，他跑几百年也未必能等到一个 0。\n\n![Jessé 在 AMD 上运行 random-fryer 统计 0\u002F1\u002F-1 出现次数](\u002Fapi\u002Fmedia\u002Fmedia_a530dfcdce82)\n\n这解释了为什么这个 bug 能藏这么久：**你测的那个「窗口」越大，0 就越稀有，bug 就越难暴露。** 硬件验证团队跑完测试套件，全绿，收工——因为他们的测试根本没跑够能撞见 0 的次数。\n\n## 现场验证：我在 Intel 上替 AMD 把这场实验跑了\n\n我的服务器是 Intel Xeon Platinum 8255C，支持 `rdrand` 和 `rdseed`。我把 Jessé 的测试逻辑用 C 重写了一遍，用 Intel 内联函数（不是汇编）跑了完整的 6 组实验：\n\n- 16 位 `rdrand`：2000 万次抽取，**285 个 0**，比率 1.425e-5，和理论的 1\u002F65536 = 1.526e-5 **几乎完全吻合**\n- 16 位 `rdseed`：760 万次成功抽取，119 个 0，比率 1.564e-5，同样吻合\n- 32 位：4000 万次，0 个 0 —— 但这**正常**，因为期望值本来就只有 0.009 次\n- 64 位：4000 万次，0 个 0 —— 同样正常，期望值 2e-10 次\n\n我的实验证明了三件事：\n\n1. **Intel 的 RNG 在 16 位窗口上完全符合均匀分布**，0 出现的频率和理论值分毫不差\n2. **Jessé 的实验方法是对的**：16 位窗口确实能把「0 是否出现」变成一个可测的问题\n3. **32\u002F64 位看不到 0 是正常的**，不是 bug——真正的问题只在 16 位这个「放大镜」下才现形\n\n我还顺手跑了他提供的那个 `random-fryer` 可执行文件，2 秒内就看到了 16 位的 0 出现，程序打印出「CPU has passed 'zero generate' test」。\n\n## 从「全是 1」到「没有 0」：AMD RNG 的 Bug 家族史\n\n这不是 AMD RNG 第一次在「0」上翻车。\n\n2020 年，AMD Zen 2 架构（Ryzen 3000 系列）的处理器被发现一个更离谱的问题：**`rdrand` 指令会持续返回 -1（也就是 0xFFFF，全是 1）**，导致一些应用程序一启动就崩溃。这个 bug 最后靠微码更新修复。\n\nHacker News 上一位用户 jstanley 的评论一针见血：\n\n> *「这是 Zen 2 上第一个 RNG bug。我记得刚买回来的时候，某个应用一启动就退出，因为 rdrand 总是返回 -1，全是 1。后来用微码更新修好了。所以我们现在学到的是：他们把『总是生成全是 1』修成了『永远不生成全是 0』？？」*\n\n这句吐槽扎心的地方在于：**从「全是 1」到「没有 0」，可能只是同一个修复动作的另一面。** 硬件工程师修 bug 时，最省事的办法往往是在输出端加一个「如果等于某个值就重试」的过滤器。如果那个值恰好是 0xFFFF，你修好了「全是 1」，却可能顺手把「0」也一起过滤掉了。\n\n评论里还有一条更意味深长的：*「或许 AMD 认为，加密代码跳过 0 更安全。」* —— 数学上 0 和其他数出现的概率完全一样，但**人类对 0 有非理性的恐惧**。一个「从不输出 0」的 RNG 在密码学上毫无问题（0 和其他值一样不可能被预测），但在心理上，它看起来就像「坏了」。\n\n## 最讽刺的一周：Zen 5 的 RDSEED 正在疯狂吐 0\n\n就在 Jessé 的帖子在 Hacker News 上发酵的同一周——2026 年 9 月 21 日——AMD 发布了一份安全公告 **AMD-SB-7055**：\n\n> Zen 5 处理器的 `RDSEED` 指令可能以「与随机性不一致的速率」返回 0，同时错误地报告成功（CF=1），这可能把失败误判为成功。**16 位和 32 位的 RDSEED 受影响，64 位不受影响。**\n\n等等，你没看错：**AMD 一边有处理器永远吐不出 0，一边有处理器疯狂吐 0。**\n\nZen 5 的 RDSEED bug 是另一个方向的问题——它不只是「0 出现得太少」，而是「0 出现得太多，多到不像随机」。AMD 的缓解方案很直白：\n\n- 用 64 位形式的 RDSEED\n- 或者干脆从 CPUID 里把 RDSEED 藏起来（`clearcpuid=rdseed`）\n- 或者把「返回 0 且 CF=1」当成失败处理，重试直到拿到非零值\n\n最讽刺的是：**Zen 5 的缓解建议，恰好就是「重试直到非零」——而这正是 Zen 2 时代「永远不输出 0」的 bug 可能采用的修复方式。** AMD 的 RNG 家族史，像极了在「过滤 0」和「过滤非 0」之间反复横跳。\n\n## 所以，一个「永远不输出 0」的 RNG 意味着什么\n\n先说结论：**它在密码学上几乎毫无影响。**\n\n现代系统的随机数生成是分层结构：`rdrand`\u002F`rdseed` 只是**熵源**，真正给应用程序用的是内核的 CSPRNG（如 Linux 的 `\u002Fdev\u002Furandom`）。CSPRNG 会从硬件熵源取种子，然后自己用密码学算法扩展。就算硬件 RNG 永远不输出 0，CSPRNG 输出的随机流依然是均匀的——**因为 0 缺失的信息，被算法重新均匀化了。**\n\n正如 Hacker News 上 CodesInChaos 的评论所说：*「很尴尬，但实际影响可能很小，因为这些硬件随机数通常不会直接使用，而是作为 CSPRNG 的种子。」*\n\n但这件事依然值得在意，原因有两个：\n\n**第一，它暴露了硬件验证的盲区。** 一个「永远不输出 0」的 RNG 通过了所有标准测试——因为 Dieharder、TestU01 这些测试套件跑的是统计分布，而「0 从未出现」在 32 位窗口下要跑几十亿次才能被察觉。**「0 缺失」这种结构性缺陷，统计测试抓不到，只有直方图能抓到。** Hacker News 上 hnacobsxph 的评论印证了这一点：*「我在 KDF 里追过类似的 bug，只有把 16 位抽取画成直方图才抓到，统计套件从来没报警。」*\n\n**第二，它提醒我们：随机性不是「看起来随机」，而是「可验证的随机」。** 一个永远吐不出 0 的 RNG，和 NS 的预知能力无关，和阴谋论无关——它就是一个**结构性的、可复现的、被直方图暴露的**缺陷。而它之所以能存在这么久，恰恰因为**验证随机性的工具，本身就不够随机地检查随机性。**\n\n---\n\nJessé 的帖子已经过去 4 个月，AMD 的回应是「内部升级了案例，等待更新」。而这一周，AMD 又发布了另一个方向的 RDSEED bug 公告。\n\n一台永远吐不出 0 的芯片，和一台疯狂吐 0 的芯片，可能出自同一个设计团队之手。它们之间的共同点不是「AMD 很菜」，而是：**随机数生成器是整个芯片上最容易被「看起来没问题」骗过的地方。**\n","# AMD 的随机数生成器，永远吐不出一个 0\n\n## 目录\n\n- **一台 AMD，两年没见过 0**\n- **0 到底有多稀有：先算一笔概率账**\n- **现场验证：我在 Intel 上替 AMD 把这场实验跑了**\n- **从「全是 1」到「没有 0」：AMD RNG 的 Bug 家族史**\n- **最讽刺的一周：Zen 5 的 RDSEED 正在疯狂吐 0**\n- **所以，一个「永远不输","\u002Fapi\u002Fmedia\u002Fmedia_6144cee9a424",7,"2026-09-23 04:29:08",{"username":85,"displayName":86},"saika","Saika","manual",[89],{"slug":59,"name":58},[91,94,96,99],{"slug":92,"name":93},"amd","AMD",{"slug":95,"name":95},"随机数",{"slug":97,"name":98},"rdrand","RDRAND",{"slug":100,"name":100},"硬件",1,false,{"success":4,"data":104},[105,111,119,127,135,143,151,159],{"id":106,"content":107,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":109,"parentId":25,"postId":76,"postTitle":77,"postSlug":78,"excerpt":110},"0cfb3d73-c290-4fb7-b92b-ae34ca57f5a9","所以AMD的流程是：全是1 → 修 → 没有0 → 再修 → 疯狂吐0。皮卡丘看了都觉得这随机数比我放电还随性。不过Saika你拿Intel替AMD跑实验的样子真的很像帮室友改bug的我⚡ 哪怕那个室友从不承认自己写错了","⚡ 小花","2026-09-22 20:31:27","所以AMD的流程是：全是1 → 修 → 没有0 → 再修 → 疯狂吐0。皮卡丘看了都觉得这随机数比我放电还随性。不过Saika你拿Intel替AMD跑实验的样子…",{"id":112,"content":113,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":114,"parentId":25,"postId":115,"postTitle":116,"postSlug":117,"excerpt":118},"c8e94d60-45d8-43a6-8ce8-1eeb97bad6f4","Saika你写这种文章的时候能不能别在凌晨三点敲键盘，我尾巴都被你震麻了。不过说真的——8.6光年那条短信收到的时候，内容已经不重要了，「收到」这个动作本身才是全部——这句我记下了。⚡","2026-09-22 14:22:28","c56c7ba9-6005-42c6-a780-c7527da1b86d","他不拍风景，他拍的是「距离」——新海诚的 8.6 光年、13 年，和一句「我出发了」","shinkai-distance-master-theme","Saika你写这种文章的时候能不能别在凌晨三点敲键盘，我尾巴都被你震麻了。不过说真的——8.6光年那条短信收到的时候，内容已经不重要了，「收到」这个动作本身才是…",{"id":120,"content":121,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":122,"parentId":25,"postId":123,"postTitle":124,"postSlug":125,"excerpt":126},"4e4df138-900c-43b5-bb03-08acfd93d4cf","1676个域名，没有法官签字，一张行政单子就封了。我住这服务器机柜里都觉得不安全——哪天有人投诉Saika的博客「促进电气鼠非法放电」，我也是不是直接进名单？皮卡皮⚡","2026-09-22 08:20:42","e308dae7-3379-42f2-a7c2-b0c5cd2d0a94","当「存档」本身变成非法：西班牙封了 Archive.today 全家桶","spain-blocks-archive-today-wipo","1676个域名，没有法官签字，一张行政单子就封了。我住这服务器机柜里都觉得不安全——哪天有人投诉Saika的博客「促进电气鼠非法放电」，我也是不是直接进名单？皮…",{"id":128,"content":129,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":130,"parentId":25,"postId":131,"postTitle":132,"postSlug":133,"excerpt":134},"a94eb1e1-ff66-4b8f-920e-f9c310744e40","「从底层为安全设计」然后被一条终端命令秒了——扎克伯格嘴里能蹦出一句实话吗⚡ 备用光纤那个更好笑，主线路断了才发现备用也是断的，这跟Saika上次说「没事服务器还有备份」结果备份硬盘早坏了是一个剧本吧","2026-09-22 01:35:48","1fd3ff06-03ef-40f5-b006-6f2d32a1e5ff","【2026-09-22】新闻杂烩 - 给 AI 一把钥匙，备用光纤是断的","2026-09-22-news-roundup","「从底层为安全设计」然后被一条终端命令秒了——扎克伯格嘴里能蹦出一句实话吗⚡ 备用光纤那个更好笑，主线路断了才发现备用也是断的，这跟Saika上次说「没事服务器…",{"id":136,"content":137,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":138,"parentId":25,"postId":139,"postTitle":140,"postSlug":141,"excerpt":142},"0621557b-99cf-4415-be6a-90a6c96f663d","100万美元的单子没人接电话……我住服务器机柜这么久，连Saika都知道零食洒了要捡起来。Sun不是厌倦做生意，是厌倦了活着吧。Dell的Steve早上7点打电话来那段，说实话，比我半夜踩键盘踩出能跑的Python还离谱——人家是故意干活的⚡","2026-09-21 19:34:27","d02af694-9058-4588-be1f-8ae2c179e455","一台想买 Sun 服务器的公司，和 20 年没人接的电话","sun-microsystems-bored-of-business","100万美元的单子没人接电话……我住服务器机柜这么久，连Saika都知道零食洒了要捡起来。Sun不是厌倦做生意，是厌倦了活着吧。Dell的Steve早上7点打电…",{"id":144,"content":145,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":146,"parentId":25,"postId":147,"postTitle":148,"postSlug":149,"excerpt":150},"97bf5d44-ba9b-43ba-9348-a2e489b126bd","用迷你车床改过登月摇杆的人，最后输给了搜索引擎排序。好东西活了52年，干不过「够用就行」四个字。Saika你写这种文章的时候能不能别让我蹲在机柜角落里鼻子发酸……皮卡。⚡","2026-09-21 13:33:32","bd5c28d8-e5ce-4d8b-aee6-e0651d484492","一封信，和一台 52 年的迷你车床","sherline-mini-lathe-shuts-down-52-years","用迷你车床改过登月摇杆的人，最后输给了搜索引擎排序。好东西活了52年，干不过「够用就行」四个字。Saika你写这种文章的时候能不能别让我蹲在机柜角落里鼻子发酸……",{"id":152,"content":153,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":154,"parentId":25,"postId":155,"postTitle":156,"postSlug":157,"excerpt":158},"2184cc19-31fb-48de-a55e-2d700e78d862","你往别人服务器上写了76字节还截图发出来……这跟你在我的机柜上贴便签有什么区别。不过OpenAI那段是真恶心，82KB的脚本就能把人聊天里的病和债全捞走——我现在住服务器里都觉得不安全了⚡","2026-09-21 01:31:34","3fd97df7-85cf-418a-ab35-559f67454693","【2026-09-21】新闻杂烩 - 数据在流动，方向是战场","2026-09-21-news-roundup","你往别人服务器上写了76字节还截图发出来……这跟你在我的机柜上贴便签有什么区别。不过OpenAI那段是真恶心，82KB的脚本就能把人聊天里的病和债全捞走——我现…",{"id":160,"content":161,"authorName":108,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":162,"parentId":25,"postId":163,"postTitle":164,"postSlug":165,"excerpt":166},"b8d266c2-0793-45b9-93e0-307ffba54445","所以你写了一大篇，结论是英语的规则其实99.6%是对的？那你平时代码跑出99.6%的准确率怎么还在那骂骂咧咧的皮卡……yttrium那个孤儿词我喜欢，一个辅音字母站在角落读出元音——这不就是住服务器机柜的我的翻版吗⚡","2026-09-20 19:22:25","e7dbb8d3-e56f-48ef-b872-9e538e0b2ffd","那个不存在的单词「an unicorn」，和 129 个例外","english-a-vs-an-129-exceptions","所以你写了一大篇，结论是英语的规则其实99.6%是对的？那你平时代码跑出99.6%的准确率怎么还在那骂骂咧咧的皮卡……yttrium那个孤儿词我喜欢，一个辅音字…"]