【マイレース開発記録(10)】seedによるメッセージ固定化                      

「マイレース」では、レース結果(順位・ゾーン)に応じて、ひとことメッセージを表示しています。

追い風ゾーンなら背中を押す言葉。
整えるゾーンなら休むことを肯定する言葉。

最初は、JavaScript側で Math.random() を使ってランダムに選んでいました。
ところが、試しているうちに、すぐに問題が見えてきました。

  • 同じ条件で占っても、リロードするたびに文言が変わる
  • 「さっき出た言葉が良かったのに、消えた…」が起こる
  • 不安な日に“言葉がブレる”のは、体験として落ち着かない

占いって、当たる当たらない以前に、受け取りやすさが大事です。
だから今回は、メッセージを「ランダム」ではなく「再現可能」にすることにしました。

この方針は、就活用のアプリとしても強みになります。

  • 仕様がぶれない
  • デバッグしやすい
  • QA(テスト)しやすい
  • “再現性”のある設計になっている

つまり「ユーザー体験」と「開発のしやすさ」の両方が上がります。

そのために導入したのが seed(シード) です。

「seed」は、乱数を“決め打ち”するための材料です。

同じseedを使えば、同じ条件で同じ乱数の結果が出ます。
つまり、“擬似ランダムだけど再現できる” という状態にできます。

今回のマイレースでは、次の情報を材料にしました:

  • 生年月日(birthday)
  • 眺めたい日(target)
  • カテゴリ(仕事/恋愛など)
  • ゾーン(追い風/慎重/楽しさ/整える)

これらをひとつの文字列にして、ハッシュ化し、
その数値を使って「メッセージ配列のどれを出すか」を決めます。

今回の設計で重要にしたのは、

メッセージ選択はフロントではなく、バックエンド側で確定する

という点です。

フロント側でランダムを回すと、
ブラウザ環境やリロードで結果が変わる可能性が残ります。

だからAPIの返却値に、

  • zone(ゾーン)
  • index(メッセージ番号)

を含めて返す形にしました。

実際のコードでは、こんな流れです。

seed 生成(SHA-256)

  • birthday|target|category|zone を文字列にする
  • SHA-256でハッシュ化
  • 大きな整数にして、配列の長さで割る(%)

これで 毎回同じ入力なら同じ index になります。

私は、こういう「仕様の微妙な差」を見落としやすいところがあります。

  • ランダムでいいじゃん、と最初に決めてしまう
  • 後から「でもこれ困る…」と気づいて修正が連鎖する
  • その修正で別のバグが起きる

今回もまさにそのパターンで、最初はランダムで進めていました。

でもAIと対話しながら、

  • “ランダム”はユーザー体験としてどう感じるか
  • “再現性”は開発上どんなメリットがあるか
  • seedをどこで決めるのが筋が良いか(フロントかバックか)

こういう点を、言葉にして整理できたのが大きかったです。

私はAIに「正解を出してもらう」というより、
考えをぶつけて、自分の判断を固める壁打ち相手として使っています。

その結果、今回のような「仕様の安定化」ができました。

seed方式に変えたことで、次のメリットがありました。

  • 同じ条件なら同じメッセージ → ユーザーが安心する
  • バグ報告が再現しやすい
  • テストがしやすい
  • “占い”としての納得感が増す(同じ日に結果が変わらない)

特に、「落ち着き」が出たのは大きいです。

seedでメッセージを固定できた一方で、新しい問題も出てきました。

それが、

「ゾーン判定が崩れると、全部の結果が崩れる」

という構造の脆さです。

次の記事は、

【マイレース開発記録(11)】zone判定の設計崩壊

として、ゾーン判定をどう立て直したかを書きます。

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です