【マイレース開発記録(10)】seedによるメッセージ固定化
メッセージを“固定”したい
「マイレース」では、レース結果(順位・ゾーン)に応じて、ひとことメッセージを表示しています。
追い風ゾーンなら背中を押す言葉。
整えるゾーンなら休むことを肯定する言葉。
最初は、JavaScript側で Math.random() を使ってランダムに選んでいました。
ところが、試しているうちに、すぐに問題が見えてきました。
- 同じ条件で占っても、リロードするたびに文言が変わる
- 「さっき出た言葉が良かったのに、消えた…」が起こる
- 不安な日に“言葉がブレる”のは、体験として落ち着かない
占いって、当たる当たらない以前に、受け取りやすさが大事です。
だから今回は、メッセージを「ランダム」ではなく「再現可能」にすることにしました。
“今日の結果”が同じなら、メッセージも同じにする
この方針は、就活用のアプリとしても強みになります。
- 仕様がぶれない
- デバッグしやすい
- QA(テスト)しやすい
- “再現性”のある設計になっている
つまり「ユーザー体験」と「開発のしやすさ」の両方が上がります。
そのために導入したのが seed(シード) です。
seedって何?
「seed」は、乱数を“決め打ち”するための材料です。
同じseedを使えば、同じ条件で同じ乱数の結果が出ます。
つまり、“擬似ランダムだけど再現できる” という状態にできます。
今回のマイレースでは、次の情報を材料にしました:
- 生年月日(birthday)
- 眺めたい日(target)
- カテゴリ(仕事/恋愛など)
- ゾーン(追い風/慎重/楽しさ/整える)
これらをひとつの文字列にして、ハッシュ化し、
その数値を使って「メッセージ配列のどれを出すか」を決めます。
実装:Python側で index を決めて返す
今回の設計で重要にしたのは、
メッセージ選択はフロントではなく、バックエンド側で確定する
という点です。
フロント側でランダムを回すと、
ブラウザ環境やリロードで結果が変わる可能性が残ります。
だからAPIの返却値に、
- zone(ゾーン)
- index(メッセージ番号)
を含めて返す形にしました。
実際のコードでは、こんな流れです。
✅ seed 生成(SHA-256)
birthday|target|category|zoneを文字列にする- SHA-256でハッシュ化
- 大きな整数にして、配列の長さで割る(%)
これで 毎回同じ入力なら同じ index になります。
ここで「発達特性×AI活用」が効いたところ
私は、こういう「仕様の微妙な差」を見落としやすいところがあります。
- ランダムでいいじゃん、と最初に決めてしまう
- 後から「でもこれ困る…」と気づいて修正が連鎖する
- その修正で別のバグが起きる
今回もまさにそのパターンで、最初はランダムで進めていました。
でもAIと対話しながら、
- “ランダム”はユーザー体験としてどう感じるか
- “再現性”は開発上どんなメリットがあるか
- seedをどこで決めるのが筋が良いか(フロントかバックか)
こういう点を、言葉にして整理できたのが大きかったです。
私はAIに「正解を出してもらう」というより、
考えをぶつけて、自分の判断を固める壁打ち相手として使っています。
その結果、今回のような「仕様の安定化」ができました。
実装してみて良かったこと
seed方式に変えたことで、次のメリットがありました。
- 同じ条件なら同じメッセージ → ユーザーが安心する
- バグ報告が再現しやすい
- テストがしやすい
- “占い”としての納得感が増す(同じ日に結果が変わらない)
特に、「落ち着き」が出たのは大きいです。
次回予告
seedでメッセージを固定できた一方で、新しい問題も出てきました。
それが、
「ゾーン判定が崩れると、全部の結果が崩れる」
という構造の脆さです。
次の記事は、
として、ゾーン判定をどう立て直したかを書きます。


