不死身になった凡プレイヤーが偶然の力だけで ScoreSaber #1 になるとき
このページは Beat Saber Advent Calendar 2023 21 日目の記事です。
導入
人生の二大苦悩は次の二つだといいます。
いつか死ぬ。
Beat Saber の PP が伸びない。
ガチランク勢ではないけれどやっぱり PP は気になる、という日和ったプレイヤーの筆者は、トップに半年以上前のスコアが並ぶ景気の悪い ScoreSaber ページを眺めながら、ふと疑問に思いました。
「これ、実力がまったく伸びなくても、ひたすらプレイしまくっていれば PP は上がり続けるのかな」
まず前提として、譜面 PP に上限があれば、プレイヤー PP にも上限があります。たとえば譜面 PP が 300 pp 以上とれないなら、どんなにたくさんの曲をプレイしてもプレイヤー PP が $${ 300 / (1 - 0.965) \, \mathrm{pp} \simeq 8572 \, \mathrm{pp} }$$ 以上になることはありません。
しかし「上ぶれ」「下ぶれ」という言葉があるように、実際にプレイした場合の PP にはゆらぎがあり、偶発的に実力より高いスコアが取れることがあります。

では、ただひたすらにプレイ回数を重ねれば、まったく上達せずとも偶然任せで PP は伸びていくのでしょうか。伸びるとしたら、どれくらいの時間がかかるのでしょうか。
本記事は、この後ろ向きすぎる疑問を強引に解決しようという試みです。以降は簡単のため、プレイヤー PP ではなく「譜面 PP の最大値がプレイ回数とともにどう変化するか」を考えることにします。
解析
この節は飛ばしても問題なく読めます。数式をペロペロするのが好きな人以外は「結果」節まで飛ばしてください。
理論
まず、一回のプレイで獲得する PP の確率密度 $${ p(x) }$$ から、 $${ N }$$ 回プレイしたときの最大 PP の確率密度 $${ p_{\mathrm{max}}(x; N) }$$ を求めます。これを計算するには累積分布
$$
P(X \le x) = \int_{-\infty}^x dx' \, p(x') \, ,
$$
を経由すると簡単です。各プレイの PP に対応する確率変数を $${ X_i }$$ とおくと、最大 PP の累積分布は
$$
\begin{align*}
P(\mathrm{max}\{X_i\} \le x) &= P(X_0 \le x \land X_1 \le x \land \dots \land X_{N-1} \le x) \\
&= \left[ P(X \le x) \right]^N \, ,
\end{align*}
$$
と書けます。これを微分したものが $${ p_{\mathrm{max}}(x; N) }$$ ですが、ここでは累積分布をそのまま使って中央値 $${ x_\mathrm{m} }$$ 、つまり $${ x_\mathrm{m} }$$ を超える確率が $${ 1/2 }$$ になる条件を考えます。
$$
P(\mathrm{max}\{X_i\} \le x_\mathrm{m}) = \left[ P(X \le x_\mathrm{m}) \right]^N = \frac{1}{2} \, .
$$
$${ N }$$ について解きます。
$$
N(x_\mathrm{m}) = \frac{\log \frac{1}{2}}{\log P(X \le x_\mathrm{m})} \, .
$$
この式は「最大 PP の中央値が $${ x_\mathrm{m} }$$ になるプレイ回数」を表し、つまり求めようとしていた関数です。
次に具体的な $${ p(x) }$$ を与えます。ここでは正規分布を仮定します。中心極限定理の成り立つ状況ではないので、この仮定が正当化されるかは非常に疑問ですが、今日はすでに記事投稿日の前日であり、そんなことを検討している時間はありません。最後に適当にスケーリングすればよいので、 $${ \cal{N}(0, 1) }$$ で計算します。
$$
p(x) = \frac{1}{\sqrt{2 \pi}} \exp \left(- \frac{1}{2} x^2 \right) \, .
$$
$${ N(x_\mathrm{m}) }$$ に代入すると次式が得られます。
$$
N(x_\mathrm{m}) = \frac{\log \frac{1}{2}}{\log \left( \frac{1}{2} + \frac{1}{2} \mathrm{erf} \left( \frac{x_\mathrm{m}}{\sqrt{2}} \right) \right)} \, .
$$
原理的にはこの式に代入すれば答えが求められます。しかしこのままでは関数の性質が分かりづらいのと、大きな $${ x }$$ に対して $${ \log(1 + \mathrm{erf}) }$$ の項で桁落ちが発生してまともに計算できません。
$${ x }$$ が十分に大きいときの振る舞いをみるため、 $${ \mathrm{erf} }$$ の漸近展開
$$
\mathrm{erf}(x) \simeq 1 - \frac{1}{\sqrt{\pi} x} e^{-x^2} \,\,\,\, (x \rightarrow \infty) \, ,
$$
を用いて展開します。
$$
N(x_\mathrm{m}) \simeq \left( \sqrt{2 \pi} \log 2 \right) x_\mathrm{m} e^\frac{{x_\mathrm{m}}^2}{2} \,\,\,\, (x \rightarrow \infty) \, .
$$
$${ x }$$ (= 正規化した目標 PP) に対してプレイ回数は非常に大きなオーダーで増えることが分かります。ちなみに $${ N(x_\mathrm{m}) }$$ の逆関数、つまりプレイ回数に対する PP の関数は Lambert $${ W }$$ 関数というものを使うとあらわに書き表せます。
データ解析
次に ScoreSaber の実データから、平均と分散を求めます。
ここで問題となるのは分散です。必要なのは「一つの譜面を何度もプレイしたときの分散」ですが、 ScoreSaber に残っているのは譜面ごとのトップスコアに関する情報のみです。本来は実際に同じ譜面を何度もプレイして統計を取るべきですが、めんどくせーし時間もないので ScoreSaber のデータから強引に計算することにします。
とはいえ単純に ScoreSaber のデータから分散を計算するのでは、次のような要因で値が過大評価されます。
(0) 実際にはプレイヤーの実力が時期によって変動する。
(1) 譜面によって平均的に得られる PP が異なる。
(2) 複数回プレイした譜面の PP が平均より高めに出る。

詳細は省きますが(あとから追加するかも)、今回は「その譜面をプレイするまでの総プレイ回数」と「譜面の star difficulty」を変数として、影響を除く処理を行っています。筆者のデータについては (2) の影響は大きくないはず。ちなみに主に (1) が理由で、幅広い難易度の譜面をプレイしている人の生 PP 分布は正規分布から大きくずれています。
ただしこれらの補正を行っても、譜面の star difficulty に対する真の難易度のゆらぎ、いわゆる「おいしい譜面」と「まずい譜面」に対応する分散が加算された状態です。これは見方を変えれば「譜面も随時追加されるという条件下で、特定の難易度の譜面をランダムにプレイしたときの分散」であるともいえます。これについては問題設定の方を合わせてしまいましょう。
実際に ScoreSaber からデータをダウンロードして解析してみると、筆者のプレイデータでは、最近の平均 PP がおよそ 300 pp (Fail 除く) に対して分散は (15 pp)^2 くらいでした。人によって分散は異なりますが、おおまかにはどの PP 帯のプレイヤーでも、√分散は平均 PP の 5 % 程度のようです。以下ではこの値 (5 %) を用います。
結果
では前節での結果をもとに、具体的な値を計算してみます。ぶっちゃけ一連の解析にはかなり無理があり、年の精度はせいぜい「桁数の桁数くらいは合っているかも」というレベルです。この記事を参考にプレイされる方はご注意ください。

タイトル通り、せっかくなので偶然の力だけで世界一を目指しましょう。筆者の譜面 Top PP は現在 334.40 pp です。世界一のプレイヤーは Bytesy さんで、譜面 Top PP は 700.31 pp (2023-12-20 現在) です。
タイトルでネタバレしていますが、ヒトの寿命程度で筆者が世界一になることは到底不可能なので、まずは不死身になります。不死身になったので月月火水木金金、 24 時間不眠不休で Beat Saber をプレイします。平均 3 分の譜面をプレイすれば 1 日で 480 回、 1 年で 175200 回プレイできます。前節での解析の都合上、マッパーも不死身になってランク譜面を制作しつづけてもらい、適切な難易度の譜面をランダムにプレイし続けます。マッパーの皆様に感謝。
では不死身になった Beat Saber 人生をダイジェストで見てみます(蛇足コメントは Wikipedia で調べたレベルのものです。識者のつっこみ歓迎)。
1 年後: 367 pp 到達。快調。
100 年後: 381 pp 到達。ん?
30 万年後: 400 pp 到達。
2 億年後: 413 pp 到達。太陽系が銀河を一周する。
40 億年後: 419 pp 到達。アンドロメダ銀河と天の川銀河が衝突する。
50 億年後: 420 pp 到達。太陽が寿命を迎える。地球も消滅する。
140 億年後: 421 pp 到達。宇宙が誕生してから Beat Saber を始めるまでと同じ時間が経過。
1000 兆年後: 440 pp 到達。宇宙のあらゆる恒星が燃え尽きる。
10^30 年後: 487 pp 到達。銀河のすべてが中心のブラックホールに呑み込まれる。
10^35 年後: 500 pp 到達。
10^83 年後: 600 pp 到達。
10^96 年後: 621.96 pp (10^96 年前の Taichidesu さんの Top PP) 到達。ブラックホールが蒸発。
10^151 年後: 700.31 pp (10^151 年前の Bytesy さんの Top PP) 到達。
ちなみに今回の解析は譜面 Top PP に関するものですが、基本的にプレイ回数が増えるほどソートした譜面 PP の間隔は詰まっていきます。この方法で譜面 PP を超えたなら、プレイヤー PP も余裕で超えているはずです。
結論
冒頭の人生二大苦悩、「いつか死ぬ」と「PP が伸びない」は、前者が解決すれば後者も自動的に解決することが分かりました。一石二鳥!
おまけ
ScoreSaber のリプレイファイルを読んで VirtualMotionCapture に送るプログラム。
https://github.com/ffiiss/bsreplay2vmc