知几
我们如何起卦:一台不给自己留后门的随机引擎 · 木刻题图
用与初心

我们如何起卦:一台不给自己留后门的随机引擎

熵源、概率、取断到 AI 署名逐层摊开——每个数字都对得上代码与测试。

打开市面上随便一个 AI 算命应用,你会遇到同一样东西:黑箱。许愿、点击、得到答案——中间发生了什么,没人告诉你。结果真是随机的吗?概率被调过吗?答案是不是挑好听的说?无从检查,只能「信」。

知几决定反着来:把起卦那一秒发生的每一件事摊开给你看。这篇文章里有不少数字和文件名,它们不是修辞——每一条都直接来自引擎源码与自动化测试,文末附对照清单。不想读细节的话,记住五句话就够了:

  • 随机数用密码学级接口生成,我们自己也无法预测;
  • 概率忠实复现传统起卦法的分布,一个分子都没动过;
  • 变卦与取断按公开的古法定式执行,规则写死在代码里、被测试钉住;
  • 决定卦象的代码读不到任何「你是谁」的信息,谈不上看人下菜;
  • AI 生成的文字永远标明是 AI,不冒充经文。

为什么不用 Math.random

网页世界自带一个随机函数 Math.random,绝大多数「在线抽签」用的就是它。它的设计目标是快和「看起来均匀」,而不是「无人能预测」:它按固定公式从一个内部状态滚出数来,拿到少量输出就可能反推出状态、算出之后所有的「随机」。这对游戏特效无所谓,对起卦这件事,我们认为不行。

知几引擎唯一的随机来源是 crypto.getRandomValues——浏览器与操作系统提供的密码学安全随机数(CSPRNG),与生成加密密钥同级别的接口。打个比方:Math.random 是一副洗得很花哨、但牌序有迹可循的牌;CSPRNG 每抽一张,都是从没人看得见底的池子里重新摸。

引擎里还预留了一条「人为熵」通道:将来用长按或手势起卦时,你动作的时序会经 SHA-256 与系统随机数混合,让「这一卦是我亲手起的」有实感。但它只负责仪式,不负责统计——源码头注写得很直白:统计正确性只由 CSPRNG 保证。哪怕手势识别错得一塌糊涂,也不会让任何一卦更容易出现。

铜钱与蓍草:两种性格的随机

最省事的写法,是给六十四卦各分 1/64,均匀随机完事。我们没这么做——传统起卦法本来就不是均匀的,而它的「不均匀」里恰恰藏着性格。

古法一爻一定,每爻得四种结果之一:「老」会变,「少」安定。知几把两种古法的概率原样复现:

结果含义铜钱法蓍草法
9 老阳阳,将变阴1/83/16
8 少阴阴,安定3/87/16
7 少阳阳,安定3/85/16
6 老阴阴,将变阳1/81/16

实现得老老实实:铜钱法从一个随机字节里取三个独立比特当三枚铜钱,正面记 3、反面记 2,相加得 6 到 9;蓍草法把随机字节对 16 取余、再按 3 : 7 : 5 : 1 切区间——256 恰好是 16 的整数倍,余数严格均匀,连「轮盘缺一个口」那种微小偏斜都不存在。

顺带较真一个流传很广的说法:「蓍草法变爻少」。严格说并不对——两种方法里,每一爻「变」的概率都是 1/4,六爻全静的概率也相同(约 17.8%)。真正的差别在谁在变:铜钱法阴阳对称,老阳老阴各 1/8;蓍草法是偏的,老阳 3/16、老阴只有 1/16——阳爻变动的机会是阴爻的三倍。变化多由阳发起,阴则倾向沉静,「阳动阴静」的古老直觉直接长在分布里。选起卦法,选的其实是这两种性格。

这些分数不是写完就算。自动化测试用真随机源把每种方法各掷 20 万次,验证四种结果的出现频率与理论值相差不超过 1 个百分点——谁改了概率,测试立刻变红。

变卦不是我们挑的

一次起卦得到本卦(现状)与变卦(趋势)。要紧的是:变卦在你起卦那一刻就定了。哪几爻是变爻,由掷出的 9 与 6 决定;把变爻翻面,变卦随之唯一确定。这一步是纯粹的规则运算,没有随机,更没有「编辑」空间。

变爻从 0 到 6 个都有可能,该以哪句经文为主,知几按朱熹《易学启蒙·考变占》的六条通行定式执行——无变爻读本卦卦辞,一爻变读该爻爻辞……六爻全变读变卦卦辞,唯乾、坤全变分别读「用九」「用六」。定式的来龙去脉,《起卦与取断:蓍草、铜钱与变爻》一篇讲过;这里只说工程上的事:这套定式在代码里是一张写死的规则表,每条结果都带着「朱熹《易学启蒙·考变占》」的出处字段,界面上那行取断说明就是从这个字段里读出来的。

它没有临场发挥的能力。

卦表本身也被钉死了。六十四卦的结构由八经卦推导而来,测试里立着一组不许动的锚点:乾 = 111111、坤 = 000000、泰 = 111000、否 = 000111、既济 = 101010、未济 = 010101。任何人改坏卦表或位序,测试立刻失败。整个引擎目前由 7 个测试文件、42 条单元测试看守,提交前必须全绿。

「你们会不会改结果?」

这是黑箱产品最该被问、也最答不上来的问题。知几的答案分两半:一半现在就能给,一半先欠着。

现在能给的:起卦请求里只有两样东西——用哪种方法,以及复盘时要重建的六个爻值。没有账号、没有画像,决定卦象的代码读不到任何关于你的信息,想看人下菜也无从下手。起卦记录未登录时存在你浏览器本机、登录后随账号同步,复盘时按记录的爻值确定性重建——同样六个数,永远得到同一卦与同一条取断,因为那是一段没有随机的纯函数。甚至断网也能起卦:网络不通时,同一套引擎就在你的设备里运行,概率分毫不差。

先欠着的:你眼下仍需要相信,我们的服务器上跑的确实是这份代码。这份「信任余额」我们打算用 commit-reveal 可验证公平来还清——起卦前先把服务器种子的哈希亮给你,你再贡献一个自己的种子,两者共同决定结果;事后公开服务器种子,任何人都能校验结果从头到尾没被动过。这是可验证抽签的标准做法,已列入路线图。它还没做,写在这里,算一张公开的欠条。

你的描述去了哪里

状态导航要你写下此刻的处境——这是全站最私密的输入,所以我们给它铺了一条不经第三方的路:你的描述到达知几的服务器后,交给我们自己运维的开源模型(Qwen3-Embedding,经 Ollama)转成语义向量,在内存里与卦、爻的向量库比对相似度。这段处理在我们自己的机器上完成,不经过任何第三方 AI 服务。 需要坦白的一点是:为把产品做得更好,服务器会以匿名访客标识记录你输入的描述用于运营统计;登录后,这段描述还会作为你的照见历史随账号保存(个人页可见)。细节见隐私政策——你也可以随时不用这个功能。

作为对照:起卦页的「求 AI 解读」与卦象对话,会把你的问题和卦象发给云端大模型(DeepSeek)生成文字——界面上凡是这类内容都明确标着 AI。这两处都由你主动触发;不用它们,你写下的字不会发往任何云端模型。

哪些字是 AI 写的

知几的内容分三层,层层署名:

  • 经文:卦辞、爻辞、彖传、大小象传——公有领域原典,逐字收录,所据版本记录在数据档案里;
  • 白话:自撰的现代文转写(AI 协助初稿)——每一卦的数据里都带着「是否已人工复核」的标记,校到哪儿记到哪儿,没校完的不装校完;
  • AI 解读:起卦解读与卦象对话由大模型运行期生成,界面明确标注,绝不与经文混排冒充。

对 AI 还多设了一道岗:每次解读生成后,系统会把回复里以引号标出的片段视作「原文引用」,拿去与经文库逐字核对(只忽略标点与空白),统计「伪引用率」作内部质量监控。AI 嘴里的「原文」,也得对得上原文。

较真清单

这篇文章的每个数字,都锚在下面这些源文件里,且各有测试盯着——谁改动,谁露馅:

  • 随机源与人为熵:src/lib/rng/secure.ts(统计正确性只由 CSPRNG 保证);
  • 两法概率:src/lib/iching/cast.ts(铜钱 1/8 · 3/8 · 3/8 · 1/8;蓍草 3/16 · 7/16 · 5/16 · 1/16);
  • 变卦与取断:src/lib/iching/changing.ts(朱熹六条定式,含用九、用六);
  • 锚点与分布测试:tests/kingwen.test.tstests/cast.test.ts(每法 20 万次频率校验);
  • 状态导航的本地检索:src/lib/recall/(本机 Ollama embedding,无第三方调用);
  • 伪引用校验:src/lib/llm/quoteCheck.ts

知几,先从工具的诚实开始

《系辞》说「知几其神乎」。「几」是事情将动未动的那点苗头;知几这个名字,就是想帮你看清苗头。但这有一个朴素的前提:

镜子必须先不骗人。

随机不掺假、概率不加私货、规则不临场编、AI 不冒充经文——工具在每一处都诚实,你才能确信卦象里照见的是自己的处境,而不是我们想让你看的东西。

起卦是随机的,人生不是。把随机做到最干净,是为了把剩下的判断,完整地留给你。

读完这篇?回到札记,或者去起一卦试试手。