市面上大多数运势类产品,每刷新一次就重新随机一次——结果是「今天说大吉,十分钟后变小凶」。我们反其道而行:玄学运势的算法是严格确定的。这篇短文讲清楚三条设计铁律,以及它们带来的额外好处。
铁律一:计分是纯函数
所有计分内核都是纯函数:同样的输入永远产生同样的输出。代码里禁止出现 Date.now()、Math.random() 和网络请求——禁令甚至写进了自动化测试。结果不可复现的测评,本质上是不可审计的。
铁律二:随机必须可播种
玄学运势确实需要「随机感」,但我们用的是可播种的伪随机:以「日期 + 生日」做 FNV-1a 哈希,驱动 mulberry32 算法生成整条随机序列。效果是:同一天、同生日,任何人、任何设备、任何时间打开,结果完全一致。想换个结果?明天再来。
铁律三:平局也有裁决规则
当两个人格得分完全相同时,按固定键序决胜——排序结果与数组遍历顺序、浏览器实现、运行环境无关。听起来像小事?在 24 题六人格的组合空间里,tie-break 的确定性决定了结果是否值得被分享和讨论。
确定性带来的三个产品红利
- 可讨论:「我也是今天狼型!」——只有结果一致才可能有共同话题;
- 可测试:算法自检 149 项断言,每次发版自动回归;
- 可信任:你今天的结果,明天可以随时复核。
我们连玄学都做得这么严谨——因为可复现,才有可讨论;有可讨论,才有传播。
为什么不让 AI 直接判定类型
既然大模型什么都能聊,为什么不干脆让它读你的答案、直接宣布你的类型?我们认真评估过这条路,最后否掉了,理由有两个。
第一个是一致性。同一个模型面对同一份答案,可能因为采样温度、上下文细节甚至版本更新给出不同判定——「同输入、不同输出」对聊天机器人是特性,对测评是 bug。你今天测出狼型、明天同一份答案测出熊型,这个测评就只剩娱乐价值,连娱乐价值都要打折。
第二个更根本:可审计性。LLM 的判定过程是一锅黑箱浓汤,没人能逐行回答「为什么是 B 不是 A」。确定性规则可以——每道题给每个类型加多少分,写在代码里、摊开在仓库里,任何异议都能落到具体的某一行上。一个无法解释自己结论的测评,本质上是在要求你盲信。
所以我们的分工是:确定性算法负责判型,LLM 只负责润色措辞。它可以让同一段解读读起来更顺、更像人话,但永远不会改变你是哪种类型——判型那一行,它碰不到。
确定性是怎么被验证的
「结果是确定的」不能靠嘴说,得能被反复验证。我们的验证方式有两层。
第一层是算法自检:149 项断言覆盖每个测评的计分边界——全选同一项、全选中间项、所有平局情形、极端作答组合。每次发版前自动跑一遍,任何一行改动导致输出漂移,构建直接失败。
第二层是黄金测试向量:一张「固定输入 → 固定预期输出」的对照表。它不测「对不对」,只测「变没变」——时型计分这套规则的答案今天长什么样,半年后还必须长什么样。
这也是为什么结果页敢放「重测」入口:我们不害怕你验证。恰恰相反,一个确定性系统的全部说服力,都来自你可以随时复核它。
确定性做不到什么
确定了立场,也得承认代价——确定性不是免费的。
个性化深度有上限。同样的答案组合永远得到同样的文案。它不会「懂你」、不会从你的作答里读出弦外之音,它只在规则内对你诚实。想要千人千面的深度解读,这条路给不了。
没有惊喜感。你不可能刷出一个「系统刚刚为你生成」的独特结果,也不会有「这次它居然看穿了我」的瞬间。结果是算出来的,不是悟出来的——这是取舍,我们认了。
对新题型响应慢。每加一个类型、每调一道题,都要重新设计计分规则、重跑全部断言、重生成黄金向量。不像 LLM 方案改个提示词就能上线——我们换来的稳定,是用迭代速度付的账。
我们认为这笔账划算:测评的第一承诺不是「惊艳」,是「同样的你再测一遍,我还是那个答案」。
常见疑问
「结果永远一样,不会无聊吗?」会一样的只有「同一天、同输入」。换一天、换答案,结果自然不同。而且正因为结果稳定,「你和我同一天测出同一类型」才值得讨论——如果每次结果都随机,比较本身就失去了意义。
「那 AI 在这套流程里到底有什么用?」它负责让文案更像人写的:同一段解读的多语言表达、措辞润色、语气打磨。判定逻辑一行都没交给它——你可以把 AI 想成编辑,不是裁判。
「我觉得结果不准怎么办?」先诚实检查一件事:作答时你选的是「实际上的自己」还是「理想中的自己」?确定性系统忠实反映你的输入,它不会读心——你给它什么,它就算什么。这也是它唯一的「偏见」来源:你自己的作答。
感受一下确定性玄学:今日运势签 + 塔罗。
Most fortune-telling products on the market re-randomize on every refresh — so "great luck today" turns into "minor misfortune" ten minutes later. We went the other way: the algorithm behind our fortune feature is strictly deterministic. This short piece lays out the three iron rules of that design, plus the benefits that come with them.
Rule one: scoring is a pure function
Every scoring core is a pure function: the same input always produces the same output. Date.now(), Math.random(), and network requests are banned in the code — the ban is even enforced in the automated tests. An assessment whose results cannot be reproduced cannot, in essence, be audited.
Rule two: randomness must be seedable
A fortune feature does need a sense of randomness, but we use seedable pseudo-randomness: "date + birthday" is hashed with FNV-1a, and that seed drives the mulberry32 algorithm to generate the entire random sequence. The effect: on the same day with the same birthday, the result is identical for any person, any device, at any time. Want a different result? Come back tomorrow.
Rule three: ties get a tie-break rule too
When two personas score exactly the same, a fixed key order decides the winner — the ordering is independent of array traversal order, browser implementation, and runtime environment. Sounds like a small thing? Across the combinatorial space of 24 items and six personas, the determinism of the tie-break determines whether a result is worth sharing and discussing at all.
Three product dividends from determinism
- Discussable: "I'm a Wolf today too!" — a shared topic only exists if results agree;
- Testable: the algorithm self-checks against 149 assertions, regressed automatically on every release;
- Trustworthy: you can always re-verify today's result tomorrow.
We apply this much rigor even to fortune-telling — because reproducibility makes discussion possible, and discussion is what makes it worth sharing.
Why we don't let an AI decide your type
If a large language model can chat about anything, why not let it read your answers and simply declare your type? We evaluated that path seriously and rejected it, for two reasons.
The first is consistency. The same model, given the same answers, can return different verdicts depending on sampling temperature, context details, or a silent version update. "Same input, different output" is a feature for a chatbot; for an assessment it's a bug. If you're a Wolf today and the identical answers make you a Bear tomorrow, the test is down to entertainment value — and not even much of that.
The second runs deeper: auditability. An LLM's judgment is a black-box stew — nobody can answer "why B and not A" line by line. A deterministic rule can: how many points each question awards to each type is written in the code, open in the repository, and any dispute can be pinned to a specific line. An assessment that can't explain its own conclusion is fundamentally asking for blind faith.
So our division of labor is: deterministic algorithms do the typing; the LLM only polishes the wording. It can make the same reading flow better and sound more human, but it can never change which type you are — it doesn't get to touch that line.
How determinism gets verified
"The results are deterministic" can't rest on a claim — it has to survive repeated verification. Ours has two layers.
Layer one is the algorithm self-check: 149 assertions covering every assessment's scoring boundaries — all-same-option runs, all-middle-option runs, every tie scenario, every extreme answer pattern. It runs automatically before each release; if any change makes the output drift, the build simply fails.
Layer two is golden test vectors: a lookup table of "fixed input → fixed expected output." It doesn't test whether results are right — it tests whether they've changed. What the chronotype scoring produces today, it must still produce six months from now.
That's also why the result page can afford a "retake" button: we aren't afraid of you checking. On the contrary, the entire credibility of a deterministic system comes from the fact that you can re-verify it any time you like.
What determinism cannot do
Having taken the position, we should also own its costs — determinism isn't free.
Personalization depth has a ceiling. The same answer pattern always returns the same copy. It doesn't "get" you, won't read between the lines of your answers — it's only honest within its rules. If you want a reading that feels one-of-a-kind, this path can't deliver it.
No surprise factor. You'll never hit a result that was "generated just for you this instant," and never get the shiver of "how did it see through me?" Results are computed, not divined — that's the trade, and we've accepted it.
Slow to ship new content. Every new type or revised question means redesigning scoring rules, re-running all assertions, and regenerating golden vectors. An LLM-based product could change a prompt and ship the same day — the stability we bought is paid for in iteration speed.
We think the trade is worth it: an assessment's first promise isn't "astonishing." It's "test the same you again, and I give the same answer."
Common questions
"If the result is always the same, isn't it boring?" What's identical is only "same day, same input." A different day or different answers produce different results. And precisely because results are stable, "you and I got the same type on the same day" becomes worth discussing — if every roll were random, comparison itself would be meaningless.
"So what does AI actually do in this pipeline?" It makes the copy read like a human wrote it: expressing the same reading across languages, polishing phrasing, smoothing tone. Not a single line of the judgment logic is handed to it — think of AI here as the editor, not the judge.
"What if I think the result is wrong?" Start with one honest check: when answering, did you pick the options that describe the actual you, or the ideal you? A deterministic system faithfully mirrors your input — it can't read your mind; whatever you feed it is what it scores. That's also its only source of "bias": your own answers.
Try deterministic fortune-telling: today's fortune slip + tarot.