ガチャは悪い文化

確率計算をすると「99%出るはず」の試行回数で出ないこともある(悪い方の1%に居る)。そもそも「十分な回数の試行」は不可能に近く、実際には何ら確率を操作していなくてもイカサマのように思えることは多い。

サーバ側でイカサマしていないことを保証するガチャは以前考えた。\(\)

  • サーバ側:全カードを排出率に比例する枚数入れて並べたリスト \(X=\{x_1, x_2, \ldots, x_n\}\) を作る
  • サーバ側:時刻や乱数などを元にソルト \(s\) を作り、全枚数 \(n\) とハッシュ値 \(h=f(X, s)\) をクライアントに送る(\(f\) は適当なハッシュ関数)
  • クライアント側:\(n\) 枚の伏せられたカードの中から「ユーザ」に1枚選ばせ、何枚目か \((k)\) をサーバに送る
  • サーバ側:\(x_k\) を手に入れた処理を行い、正解である \(X, s\) をクライアントに送る
  • クライアント側:受け取った \(X, s\) を使って \(f(X, s)\) を改めて計算し、\(h\) と「一致」することを確認する
  • クライアント側:\(X\) の中のカードの割合が排出率と一致していることを確認する

問題は、ガチャの度に「ユーザ」が \(k\) を選ばないといけないのと、ハッシュ値の「一致」自体が虚偽でないことを「ユーザ」が納得しないと意味がないこと。何か良い方法があれば(ガチャ以外でも)有益だとは思うけれど。

クライアントのソースを開示できるならば、\(k\) をクライアント側で発生した乱数にしてもいいし、ハッシュの一致が一般「ユーザ」にはわからなくても(詳しい人がソースを読んでイカサマができない仕組みであることを確認してくれれば)いいのかもしれないが、それはそれでガチャ以外の様々な面でハードルが高いだろうと思う。