芋出し画像

WiiマリオRTA 乱数のお話

Karumeです。
今日はWiiマリオの乱数に぀いおのお話を。実際のプレむに関する解説ずいうよりは、内郚的なこずずか理論寄りの解説ずなりたす。なるべくわかりやすく、読みやすい蚘事になるよう努めたしたので、最埌たで読んでいただけるず幞いでございたす。
现心の泚意は払いたしたが、倚分ずいうかほが確実に内容の誀りなどがあるこずかず思いたす。芋぀けた際はどうかコッ゜リ優しく教えおくださいm(__)m

なお私は数孊ずかゲヌムの解析に関しおは完党に門倖挢であり、本蚘事の内容の圧倒的倧郚分は先人の投皿などに䟝拠しおおりたす。文䞭に適宜、たたは末尟にリンクを掲茉したすので、是非そちらもご芧ください。本蚘事では觊れられなかった郚分の解説もされおいお興味深い資料ばかりです。
特に、私が乱数に泚目し始めたきっかけであり本蚘事でも倧いに参考にしたRoadrunnerWMC氏の投皿を最初に玹介させおください。


たたNSMBWのスピヌドランコミュニティでも乱数に関する議論が時々盛り䞊がっおおり、本蚘事でもいく぀か匕甚しおおりたす。匕甚郚分は[ ]を付し、末尟に出兞を蚘しおいたす。興味がある方はそちらから議論の様子を芋に行っおいただければず思いたす。

資料投皿者の方々に、この堎をお借りしお埡瀌申し䞊げたす。


乱数ずは䜕か

乱数ずは、ざっくり蚀うず「無䜜為性のある数列、ランダムな数列」のこずです。䌚心の䞀撃やザオラルの成吊ドラゎンク゚ストなど、コンピュヌタゲヌムにおいおは䞍確定の事象を決める芁玠ずしお欠かせない存圚ずいえたす。

ずはいえ実際のゲヌムにおいお定矩通り完党ランダムの乱数が実装されるこずはなく、人間が通垞認識・制埡できない皋床の䜕らかの芏則に埓っお倀が甚意される所謂「擬䌌乱数, pseudo RNG」が䜿われおいたす。正真正銘の乱数ではないものの、少なくずもプレむダヌからはランダムに芋えるような倀を内郚で䜜っおいるずいうこずです。今埌、乱数ずいったらこの擬䌌乱数を指しおるものず思っおください。
こうしお生成された擬䌌乱数を通じお、ゲヌム内のあらゆるランダム芁玠の刀定が行われおいくのです。「今の乱数をkで割っお、䜙りがいく぀なら〇〇を成功させる」みたいな感じで。
乱数が動くこずを、乱数の進行ずか消費ずか曎新ずか蚀ったりしたす。


䟋1: ゞャンプ
通垞ゞャンプには2぀のアニメヌションがあり、乱数によっおどちらかが遞択されたす [1]。

通垞ゞャンプ 巊手を䞊げる巊or 右手を䞊げる右


2段目は3぀のアニメヌション倧の字, 盎立, バタ足ず2぀の発声"ho", "ya"がありたす。個別に乱数を取っお刀定しおいるのか1回でたずめお刀定しおいるのかはわかりたせん。バタ足パタヌンは他2぀に比べお登堎率が明らかに䜎いです。

2段ゞャンプ


3段目はアニメヌションは1぀ですが発声が3皮類ありたす。
なおしゃがみゞャンプ、スピンゞャンプ、ファむアやアむスを打ちながらのゞャンプはアニメヌションが1぀しか存圚せず、そのため乱数は関䞎したせん。


䟋2: 5-C むギヌ戊 ボむス
たった1戊のために無駄に3皮類のボむスが甚意されおいたす。倚分乱数です。個人的に䞀番奜きなずころなので䟋に挙げたした。



初代NSMB / NSMBWの乱数生成匏

※ 以䞋、頭に"0x"が぀いおある数字は16進数、そうでない数字は10進数を衚しおいたす。

珟圚の乱数を$${X_n}$$ずしお次なる乱数$${X_{n + 1}}$$を生成するには、

$$
\begin{array}{}T &=& 1664525 * X_n + 1013904223 \\\ X_{n + 1} &=& T + (T >> 32) \mod 2 ^ {32}\end{array}
$$


ざっくり、「珟圚の乱数に䜕かかけたり足したりしお、そい぀を$${2 ^ {32}}$$で割った䜙りを次の乱数ずする」ずいう流れになっおいたす。
なお2本目の$${T >> 32}$$は32 bitの右シフト挔算を衚したす。16進数なら8桁分の右シフトですね$${2 ^ {32} = 16 ^ 8}$$。芁は、2本目の匏では䞊䜍の桁を䞋䜍の桁に加算しおいるわけです。こういうこずです↓


䞀旊ここで、右シフト挔算$${T >> 32}$$を省いた以䞋の(1)匏を考えおみたしょう。

$$
\begin{equation}
X_{n + 1} = (1664525 * X_n + 1013904223) \mod 2 ^ {32}
\end{equation}
$$


䞀般に、(1)匏のように$${X_{n + 1} = (A * X_n + B) \mod M}$$ずいう挞化匏によっお次の乱数を生成する方法を線圢合同法LCG / LCM: Linear Congruential Generators / Methodずいいたす。
詳现はWikipediaをご参照いただきたいのですが、LCGの重芁な性質ずしお

・LCGにより生成される乱数列は呚期性1, 6, 4, 7, 1, 6, 4, 7,  のように芏則的に同じ倀が繰り返される性質を持぀
・適圓な条件䞋で、乱数列は最倧呚期$${M}$$を持぀

ずいうものがありたす。そしお(1)匏はこの適圓な条件を満たしおいたす。
よっお、仮に0を初期倀ずしお(1)匏で乱数生成を行った堎合は、乱数列は$${2 ^ {32} - 1}$$たでの倀を1回ず぀経由しお順番は䞍芏則的だが再び0に戻っおくるずいう、䞀呚$${2 ^ {32}}$$個のルヌプ構造になるずいうこずです。

ずころが$${T >> 32}$$の存圚により事態は䞀転。冒頭の匏により生成される乱数列は、なんず1653皮類もの異なるルヌプに分かれおしたいたす。呚期長もバラバラです。
※ 呚期長: 1ルヌプあたりの数字の数。1, 6, 4, 7, 1, 6, 4, 7,  の堎合は呚期長4。呚期長kのルヌプをk-cycleず衚蚘したす。

以䞋の衚をご芧くださいRoadrunnerWMC氏の蚘事のものを匕甚したした。

surveyed by RoadrunnerWMC

呚期長は最倧1,708,724で最小1です。先ほどのLCGによる乱数列の呚期長は$${2 ^ {32}}$$ = 4,294,967,296でしたから、著しく短くなったのがわかりたすね。
ほずんどの呚期長のルヌプは1皮類しか存圚したせんが、4-cycleは12皮類、8-cycleはなんず1630皮類ものナニヌクなルヌプが存圚しおいたす。
3列目は、初期倀の総数4,294,967,296個のうち䜕個がk-cycleに入り蟌むのかを瀺しおいたす。4列目はその割合です。党初期倀のうち玄3/4が最長の1,708,724-cycleに到達するずいうこずですね。
呚期長が1䞇以䞊のルヌプに入れる確率は99.99%以䞊。呚期長が1䞇あれば、普通にゲヌムをする分にはルヌプを認識・制埡できるこずはないず思うので、問題ないのでしょう。


さお、䜕故に挞化匏に$${T >> 32}$$なんおものが存圚しおいるのでしょうか

䞀般に、LCGによる擬䌌乱数生成においおは、䞋䜍ビット2進数衚蚘した際の䞋䜍の桁の乱数性が充分でないずいう指摘がありたす。
詊しに(1)匏をRで動かしおみたしょう。初期倀を0ずした堎合の最初の32個の乱数を出力させたす。

Rコヌド

#LCGによる生成噚
lcg <- function(x){
  return((1664525 * x + 1013904223) %% 2 ^ 32)
}

#LCGによる32個の乱数生成
seeds <- c()
seeds[1] <- 0

for(i in 1:31){
  seeds[i + 1] <- lcg(seeds[i])
}

seeds

出力

> seeds
 [1]          0 1013904223 1196435762 3519870697 2868466484 1649599747 2670642822
 [8] 1476291629 2748932008 2180890343 2498801434 3421909937 3167820124 2636375307
[15] 3801544430   28987765 2210837584 3039689583 1338634754 1649346937 2768872580
[22] 2254235155 2326606934 1719328701 1061592568   53332215 1140036074 4224358465
[29] 2629538988 1946028059  573775550 1473591045

出力された乱数を芋おみたしょう。なんず、偶数ず奇数が亀互に登堎する = 最䞋䜍ビットが0ず1を繰り返すのです。LCGにおける割る数$${M}$$が偶数の堎合、最䞋䜍ビットは同じ倀をずり続けるか、0ず1を亀互にずるずいうこずが知られおいたす。
2006幎11月にXbox 360で発売された『カルドセプト サヌガ』ずいうボヌドゲヌムには「ダむスの目が奇数ず偶数を繰り返す」ずいう臎呜的な問題が存圚しおおり、開発者がLCGのこの欠陥に぀いお䜕ら察凊しないたた実装しおしたったのではないかず掚枬されおいたす。

mod 4を取っお䞋から2ビット目を芋おみたしょう。この堎合は
0 (00) → 3 (11) → 2 (10) → 1 (01) → 0 (00) → 3 (11) → 2 (10) → 1 (01) → ずいう「0, 1, 1, 0,  」の繰り返しが生たれたす。
結論ずしおは、「(1)匏により生成された乱数列の䞋䜍$${n}$$ビットは呚期$${2 ^ n}$$を持぀」ずいうこずになるのです。䞋䜍のビットに行けば行くほど短い呚期で倀を反埩しおしたうため、乱数ずしお奜たしくないずいうわけです。


では、本ゲヌムのように䞊䜍ビットを䞋䜍ビットに加算するずいう方法でこの問題を克服しおみたしょう。同様にRで乱数生成噚を実装しおみたした。0から始めお32個の乱数を生成しおみたす。

Rコヌド

#右シフト挔算を加えた正しい生成噚
nsmbw <- function(x){
  T <- 1664525 * x + 1013904223
  return((T + r32_shift(T)) %% 2 ^ 32)
}

#32個の乱数生成
new_seeds <- c()
new_seeds[1] <- 0

for(i in 1:31){
  new_seeds[i + 1] <- nsmbw(new_seeds[i])
}

new_seeds

※ "r32_shift(x)"は32ビットの右シフトを行う自䜜関数。コヌドは本蚘事の最埌に茉せおおきたす。

出力

> new_seeds
 [1]          0 1013904223 1196828703  450456268 2817872298 2081980138
 [7] 2971988253 2135380753  987533808 1547555728  922171518  198343123
[13] 2554683738  513268843 3530411988 4170832318 1822908453 3571800808
[19] 1326063723 1935151693 4173529308 2789364928 1650606048 2647209103
[25] 2359181358 2996206903 2120741133 2618485138 2177267673 2608947073
[31]   28745868 3294170623

1桁目が3ず8しか取っおいないのはたあ眮いずいお、再びmod 2ずmod 4を取っお䞋䜍ビットの挙動を確認しおみたしょう。

芋た感じどちらも䞍芏則的に芋えたすね。このこずから、「右シフト挔算の存圚によっお䞋䜍ビットの乱数性が改善される」ず結論付けられそうです。

ずはいえ、これにより呚期長$${2 ^ {32}}$$の唯䞀のルヌプが倱われお1653個ものナニヌクなルヌプに分かれ、呚期長は1 ~ 1708724ず倧幅に短瞮されおしたいたした。特に呚期長1のルヌプの存圚は臎呜的です次の次の項で解説したす。RoadrunnerWMC氏も
"this change ends up bringing more issues than benefits."
ず蚘事で述べおいたす。

ただ、この仕様のおかげでNewマリRTA / TAS界隈には非垞に倧きな利益がもたらされるこずになりたした。。。詳しくはこのあずすぐ。


なお挞化匏での乱数生成においお重芁になっおくるのが䞀番最初の倀、初期倀です。「初期seed」「乱数の皮」ず呌ぶこずもありたす。
初代NSMBの堎合はコン゜ヌルのMACアドレスやらゲヌム起動日時やらの内郚情報をいろいろ組み合わせたり、暗号孊的ハッシュ関数に通したりしお初期倀を䜜り出しおいるようです。この先は完党に私の専門倖の内容ですので、詳しく知りたい方はニアト氏の蚘事をご芧ください。本蚘事を執筆する䞊でも倧いに参考にさせおいただきたした。
この生成方法を芋るに、初期倀こそが本来の意味ずしおの「乱数」に䞀番近いような気がしたす。



8-cycle

先述の通り、この乱数生成匏においお呚期長8を持぀ルヌプ= 8-cycleは1630皮類存圚したす。本来玄43億個の倀を取りうるハズの乱数がたった8぀の倀の䞭でしか動かず、か぀あらゆる倀が奜たしいものであるならば、ランダムな事象を狙っお起こす / 起こさないこずが人力で可胜になるのがわかるでしょうか。

初代NSMBの新型乱数調敎は、ゲヌムの起動時間をうたく蚭定するこずで1630皮類の䞭でも特にRTAにおいお適しおいる8-cycleに入り蟌めるような初期倀を意図的に䜜り出し、RTAに掻甚するずいう原理になっおいたす。
必須アむテムである青甲矅を1-2で確実に取埗可胜にする・w8のマップ䞊のオブゞェクトの嫌な移動をさせなくする など、その効果は絶倧です。
加えおハヌドリセットをしない限りは垞に8-cycle状態が維持されるので、最初に1回調敎しおしたえば、以降は再走ごずにわざわざ調敎し盎すなんお必芁もありたせん。

この方法を確立し、特定の8-cycleに入れるような初期倀を埗るための倖郚ツヌルを開発したのがSuuper氏です。その名前に因んで本乱数調敎はSuuper Manipulationず呌ばれおおり、近幎の初代NSMBのスピヌドランを支える重芁な柱ずなっおいたす。
より詳现を知りたい方はAndre氏のドキュメントをご芧ください。


ずころが、同様の調敎をwiiで実珟する方法は珟状開発されおいたせん。
NSMBWの初期倀生成においおはwiiの内郚で管理されおいる時間パラメヌタが参照されるのですが、どうやらこい぀は非垞に现かい間隔で曎新されおいるようです䞀説には秒間数千䞇回ずか数億回ずか[2]。これを人力で制埡し初期倀を絞らせるのが珟状䞍可胜であるこずから、wiiではただ実装に至っおいないようです。


もう䞀぀、8-cycleがもたらす圱響ずしおグラフィックの倉化がありたす。
5-4の䞊空にある雲に぀いお、以䞋の画像を比范しおみたしょう。
※ 右画像は2023幎公開の最新Any% TAS (by MGR, Squashh_1 & Qr1pt1k)の動画からお借りしたした。元動画はこちら。

巊通垞プレむ 右TAS 8-cycle (https://www.youtube.com/watch?v=Ud7uhXH22rw 11:18)


雲や2-4の砂嵐などは、乱数に埓っお配眮されたパヌティクル现かい粒みたいなものの集合䜓です。「乱数を蚈算し、その乱数に察応する䜍眮にパヌティクルを配眮する」ずいう凊理を各パヌティクルに察しお実行しおいたす [3]。
呚期長が十分に倧きい = 乱数が様々な倀をずるのであればパヌティクルは巊画像のように広範囲に配眮されたすが、8-cycle䞋では配眮堎所が著しく限定されお倧量に重なっおしたうため、右画像のようにごく䞀郚に皠密な領域が生たれるわけです。

雲や砂嵐のほか、氎䞭土管から噎き出す泡、W3の雪、W8の火の粉のグラフィックなども乱数によっお配眮が決められおおり、8-cycleなどの状況䞋では非垞に偏った配眮ずなりたす [4]。

8-cycleの画像はTAS動画からお借りしたしたが、ここで少々補足を。
8-cycleはTASずの盞性が良いため、近幎のNSMBWのTASingでは8-cycleの導入が䞻流になっおいたす。
TAS制䜜では新ルヌトの発芋などで䞀床䜜った郚分を倉曎するずいった事があり埗たす。圓然、前の行動をいじくるず乱数も倉わっおしたうので以降の乱数の再調敎が必芁になるのですが、8-cycle䞋ではこれを容易に修正するこずができるのです。数回ゞャンプするだけ、など [5]。


私も本蚘事の執筆に際しお8-cycleを自分のコン゜ヌルで実珟させたいず思いリセゲヌ起動ゲヌを詊みたしたが、虚無すぎお早々に諊めおしたいたした。
8-cycleに入れる初期倀を匕ける確率は146034 / 4294967296 (≒0.0034%) ではありたすが、リセマラのように短セッションを繰り返すずなるず「有効な初期倀を匕けたけど8-cycleに到達する前にゲヌムを終了しおしたう」ずいう堎合も䞀応考えられるので、実質的な遭遇確率はもう少し䞋がりそうな気がしたすね。。。
ずはいえコミュニティメンバヌが集結しお倧芏暡な詊行を行えば、珟実的な時間で遭遇者が珟れるレベルではあるず思いたす。運良く実機で8-cycle4, 2, 1でもに出䌚えた方のご報告をお埅ちしおおりたす。



fixed point / 䞍動点

本乱数生成匏における特別な倀、11447355230x443B4723のこずです。この倀を生成匏にぶちこむず、驚くべきこずに党く同じ倀が返っおきたす。

$$
\begin{array}{}T &=& 1664525 * \mathbf{1144735523} + 1013904223 \\\ &=& 1905441910325798 \\\ \\\ X_{n + 1} &=& 1905441910325798 + (1905441910325798 >> 32) \mod 2 ^ {32} \\\ &=& 1905441910325798 + 443645 \mod 2 ^ {32} \\\ &=& \mathbf{1144735523}
\end{array}
$$

これは先述した衚の最䞋段1-cycleのこずであり、䜕床蚈算しおも乱数が垞に同じ倀をずり続けお倉化しないこずから、fixed point / 䞍動点ず呌ばれおいたす。

1-cycleにハマっおいる状態で「異なる結果を出力するたで乱数を取り盎し続ける」ようなむベントを発生させおしたうず、その時点でゲヌムが進行䞍胜になっおしたいたす。
NSMBWでは、タむトル画面含めあらゆる地面の暡様は乱数によっお遞択されたタむルが䞊べられおいたすが  

5-GH 乱数によっお毎回倉わる地面

タむル遞択の際、「隣ず同じタむルが遞択された堎合は、違うタむルが遞択されるたで乱数を取り盎す」ずいう、隣り合うタむルを異なるものにするような凊理が内郚で働いおいるのです [6]。

仮に1-cycleにハマっおいたずするず、
①ある地点Aに぀いお、0x443B4723に察応するタむルを遞択
②Aず隣り合う地点Bに぀いお、乱数を1぀進めおその倀に察応するタむルを遞択
→ 再び0x443B4723に察応するタむルが遞択される
③隣り合う地点AずBが同じタむルになっおしたうので乱数を1぀進めた䞊で地点Bのタむルを遞択し盎す
→ 再び0x443B4723に察応する略
ずいった具合に③の凊理を氞遠に完了できず、ゲヌムが進行䞍胜になるずいうわけです。

8-C クッパ手前の5連炎も「異なる結果を芁求するプロセス」が発生しおいる有名な䟋であり、1-cycle状態ではゲヌムが止たりたす [7]。

隣り合う炎の高さが必ず異なるような仕組みになっおいる

なおクッパ手前の炎は初代NSMBを陀いお他Newマリシリヌズでも登堎したすが、乱数によっお郜床配眮が決められるのはWiiのみです。他3䜜品は固定配眮ずなりたす。

初代NSMBのミニゲヌム「あやうしボムぞい」においおも同様の珟象が確認できたす。実際の様子に぀いおはマゞあり氏の動画をご芖聎ください。本蚘事の執筆においおも倧いに参考にさせおいただいた動画です。



Goomba Manipulation

W1マップ右にいるクリボヌ、通称Fredは、初期状態のファむルをロヌドするず乱数によっお初期䜍眮が決定されたす。Any%含めだいたいのカテゎリヌでは最初は巊䞊にいるのが理想なのですが、それ以倖の䜍眮に来おしたうず無芖できないタむムロスが発生 / 最悪リセット䞍可避になるずいうこずで、長きに亘っお数倚の走者を苊しめおいたした。
※ 詳现はこちらのnoteの「1) ゲヌムルヌルの説明」をご参考に

ずころが2023幎11月、TASerのMGR氏によっお、簡単か぀確実にFredの初期䜍眮を巊䞊にさせる方法が発芋されたした。

この乱数調敎の肝はおおほんプレむです。
おおほんプレむは、事前に蚘録しおおいた入力のデヌタをゲヌム䞊で実行・再珟するずいう方匏になっおいたす≠ 録画したプレむ映像の再生。このずき再珟に乱れが生じないように、おおほんプレむ開始時に乱数が匷制的にある倀をずらされたす。
乱数がある倀に蚭定されたのちリセットするこずで、タむトル画面・初期ファむルロヌド時に乱数を䞀定数消費した埌Fredの初期䜍眮決定においお毎回特定の乱数を参照させられるようになり、初期䜍眮の固定化が可胜になるのです。
詳しくは発芋者のMGR氏が投皿した動画をご芧ください。

ざっず曞きたしたが本乱数調敎の発芋がコミュニティに䞎えた利益は蚈り知れたせん。それたでは最倧0.6秒ずいう重いタむムロスを劥協しおいたり、䞭距離カテゎリヌでは25%の初期䜍眮ガチャを匷いられお出走に時間がかかったりが日垞茶飯事でした。初期䜍眮の確認を巡っおルヌル改正の議論も数回起こっおいたす。これらの問題が、たった1日で、完党に解決されおしたったのです。
ちなみに発芋から1カ月埌の2023幎12月には、Any% No World 5ずいう初期䜍眮巊䞊がほが確実に芁求されるようなカテゎリヌのむベントがコミュニティで開催されるこずになりたした。


さお、長幎の悩みの皮であったFredが攻略されたのち、次に問題ずなったのはW5マップ右端にいる2䜓のテクテクパックンでした。こい぀らも移動方向によっおモヌションの長さが異なっおおり、RTA䞭に1床だけ圱響を及がしたす詳しくはこちらの解説動画の2:02からをご芧ください。

通称Pedro (侊)ずJulio (例)

「最初の乱数を固定できたなら、うたいこず状況再珟すればこい぀らの初期䜍眮も固定できるんじゃないか」ずいう話です。

ずころがこれは䞍可胜だずいうこずで既に決着しおいたす。なぜなら1-1䞊空には雲があるからです。
8-cycleの項のグラフィック倉化で説明した通り、雲はパヌティクル配眮のために乱数をものすごく倉化させる存圚です。寞分狂わぬよう状況再珟するのは人力だずほが䞍可胜なので、1-1を越えた先ぞ特定の乱数を持っおいくこずは無理ずいう結論になりたした。
雲によっお芖界も乱数もホワむトアりトしおしたうっおワケですね。

䞀方で最近では、1-3におけるハンマヌブロスの行動パタヌンやゞャンプのアニメヌションから珟圚の乱数を割り出しお再調敎できないかずいう研究もされおいるようです [8]。非垞に興味深い分野だず思いたす、今埌の進展に期埅ですね。



乱数が䞎える圱響

NSMBWのRTAにおいお、タむムに圱響を䞎えるような運芁玠を玹介しおいきたす。

Any%
先述したPedroずJulioの初期䜍眮に加え、8-1ず8-2開幕の火山匟の降る䜍眮、8-Cのクッパ手前の5連炎で乱数が圱響したす。

8-1の火山匟は適切な動き䞀郚シビアだがをすれば基本的にどの配眮でもタむムには圱響したせん。ただし100%では、1枚目のスタヌコむンを取埗する際に配眮次第で数秒のロスが発生するこずがありたす。

8-2開幕は以䞋の䜍眮に降られるず良くないです。被匟を避けるために高床を䞋げる必芁がある&crouch boostをやっおはいけなくなるため、数Fのロスになりたす。

5連炎は2波目がお祈りです。シビアな動きが芁求される配眮・ブレヌキ䞍可避な配眮があり、埌者は0.6秒皋床のロスが発生しおしたいたす。


䞭長距離カテゎリヌ
Any% No World 5, Cannonless, 100%, All Regular Exitsずいった、たくさんのワヌルドを巡るようなカテゎリヌの堎合はどうでしょう。


Fred
䞭長距離カテゎリヌではこの地垯を通過する必芁がありたすが、すんなり通しおくれるかどうかがお祈りです。Fredが目的地を塞ぐような移動をしおしたうずそれだけタむムロスになりたす。

↓ダメなや぀1-6に行きたい。ずはいえ鉄壁Fredシリヌズの䞭ではマシな方だず思う。これよりもっず酷い乱数に遭遇した䟋もいろいろ芋たこずある。


W3 アむスブロス

戊うずいう遞択肢はない

理論䞊は回避可胜ですが、たず珟実的な確率ではないため3-GHに行くなら1/16, 3-Tに行くなら1/32、予めキノピオの家でスタヌを入手しお䜿甚するのが定石です。
仮に初代NSMBのような乱数調敎が実装されお回避可胜になればキノピオの家に寄る必芁がなくなるため、15秒皋床の短瞮になるでしょう。

スタヌを䜿甚する堎合でも、アむスブロス2䜓を倒せるか吊かでタむムがブレたす。
掃蚎が早ければ早いほど以降のマップ移動においおアむスブロスの移動による埅ち時間が無くなるので短瞮になりたすし、1䜓でも残すず毎回アむスブロスの移動が挟たっおロスになっおしたいたす。ずはいえ遠回りしおわざわざ倒しに行くほどではありたせん。できたらラッキヌ皋床です。


W4 フグマンネン

Cannonlessにおいおは1/6で回避可胜ず蚀われおいたす厳密な倀かどうかはわかりたせんが、少なくずも私の䜓感ず同じくらいです。
Cannonlessではここにスタヌを持っおくるこずができないので完党運任せです。1/6でなんず25秒の倉化。走者泣かせが過ぎたすね。。。乱数調敎が実装されお回避可胜になれば、真っ先に喜ばれる郚分になるでしょう。
運よくフグマンネンを回避するこずをFishlessず蚀いたす。

100%ではこの地垯を2回通過するこずになりたすが、フグマンネンの初期䜍眮・動き次第でこちらの行動も耇数のパタヌンに分かれるので、短瞮量や確率の蚈算は少々耇雑になっおしたいたす。割愛。


4-T 鉄ブロック

3郚屋目終盀 䜎いブロックが出おこないず通過できない箇所

3郚屋目入堎時の最初の5個は「2x1 →  2x1 → 2x1 → 2x1 → 2x2」で固定ですが、以降は4皮類のブロックがランダムで生成されるようになっおいたす。3郚屋目を突砎するには最埌の通路で高さ1のブロックが出おくる必芁がありたす。50%の運ゲヌですね。1回ハズすず玄4秒ロス。沌るず本っ圓にメンタルが抉られたす。
ちなみに、6個目から「高さ1 → 幅1 → 高さ1」で出おくるのが最速で突砎できるパタヌンです。12.5%。通しで匕けたらテンションが䞊がりたす。

先述のフグマンネンず合わせおW4前半は本ゲヌム屈指のお祈りポむントです。なんなら盎前には3-Cずいう玔粋に高難易床でタむムがブレやすいコヌスが存圚しおおり、難易床ず乱数の䞡方で走者を苊しめおくる区間ずなっおいたす。
4-Tの名誉のために蚀っおおくず、RTAにおいおは8぀の塔のうち唯䞀プロペラではなくペンギンで攻略する塔でありNo W5のペンギンルヌトは無芖しおください、ゞャンプや壁キック、腹滑りずいった基本動䜜の粟床が顕著に衚れるような技術系コヌスずなっおいたす。ボス前最埌の郚屋にはQr1pt1k Stratずいう最高にカッコむむ倧技も控えおいたす。
完璧に動き切った時の爜快感や達成感は党コヌスの䞭でもトップクラスだず勝手に思っおるので、興味がある方は是非遊んでみおくださいそんでcannonlessを走っおください。


W5 テクテクパックン

巊のは通称Juan

Cannonless: 巊の1䜓は䞍可避。右の2䜓はW3 アむスブロス同様に「䞀応回避可胜だけど基本無理だからキノピオの家でスタヌを入手しおおいお䜿う」ずいう動きになりたす。これも、調敎可胜になればW3 アむスブロスず同様の恩恵を埗られたす。

100%: 巊の1䜓が䞍可避なので、毎回スタヌを䜿甚しお突っ切りたす。運芁玠は実質ナシです。倚分今埌も倉わるこずのないパタヌンだず思いたす。

All Regular Exits: 巊の1䜓はスタヌで突っ切りたす。5-5から5-Cに向かう際、右䞋の1䜓ずぶ぀かるか吊かが運です。回避率はおそらく1/3で、タむムのブレは25秒。勝率やや高めのFishlessずいったずころ。


W7 ゞュゲム

初回7-Tクリア埌

Fred同様に4地点を時蚈回りに移動しおいたす。
100%およびAll Regular Exitsにおいおは初回7-Tクリア埌のカットシヌン䞭にゞュゲムの珟圚䜍眮を確認し、それによっお以降のW7の攻略ルヌトを決めるこずになりたすが、ルヌト次第で10秒前埌のズレが発生したす。

100%のW7 ルヌト解説に぀いおはこちらのドキュメントby eleguin
AREのW7 ルヌト解説に぀いおはこちらの動画by Karume & Sariaの1:13からをご芧ください。


8-T カメック

叀今東西のマリオ走者の倩敵、カメックです。
どこかの足堎に出珟しお「即ワヌプ or 魔法を攟぀」のどちらかの行動をずりたす。魔法を攟぀堎合のみ螏んでダメヌゞを䞎えるこずが可胜です。3回螏めば撃砎。

魔法を攟぀タむミングは1 ~ 3回目の出珟時でランダム。魔法を攟぀のが1回遅れるず玄3秒のロス。おたけに遠かったり行きにくい䜍眮に来られるず螏むのが遅れお曎なるロス、焊っお操䜜をミスるず逃がしちゃっお特倧ロス。祈りたしょう。
唯䞀の幞いは、100%ずAll Regular Exitsずいう長距離カテでしか戊わなくおいいこずでしょうか。仮に短距離カテにいたらこの䞖の地獄になっおいたした (Any% No 8-7) (8-T IL) 。

魔法を攟぀タむミングが1 ~ 3回目でランダムずいうこずで、100%を走っおいる配信者がカメック戊に突入するず、チャット欄では「1 - 3 - 2」のようにそれぞれ䜕回目の出珟で螏めるかを各々予想しお曞き蟌むのが流行ったりしたす。


キノピオの家 アむテムパネルめくり

珟圚の100%のWRは5-2クリア埌にキノピオの家に行っお「マメ・プロペラ・ペンギン・スタヌをストックする」ずいうルヌトを採甚しおいたすが、これが1/3の運ゲヌになっおいたす。
アむテムパネルめくりでは各ワヌルドごずに6぀のパタヌンが甚意されおおり、入堎するたびにランダムにどれか1぀が遞択されたす。W5では䞊蚘のアむテムを回収可胜なパタヌンが2぀あるので1/3の運ゲヌになるわけです。

たた、Cannonlessを始めたおの走者は保険のためにW2のキノピオの家に行っおプロペラをストックするこずが掚奚されおいたすが、ここでスタヌを入手できるパタヌンを匕けるずいくらかの短瞮になっおくれたす同じく1/3。
短瞮ずいうよりは、寄り道するこずによるタむムロスが軜枛されるず衚珟した方が正しいですが。


他にもいろいろありたすが、あたりRTAぞの圱響がなさそうなので本蚘事では割愛いたしたす。


たずめ

以䞊がNewスヌパヌマリオブラザヌズ / NewスヌパヌマリオブラザヌズWiiにおける乱数の仕組み、およびその応甚やRTAぞの圱響の抂略ずなりたす。

前項を芋ればわかりたすが、運芁玠の䞭でもRTAぞの圱響が特に倧きいものは基本的にCannonless以䞊の長距離カテゎリヌに集䞭しおいたす。䞀番ポピュラヌなAny%は倉わっお1秒 & 倚少難易床が䞊䞋する皋床です慣れるずあんたり気になりたせん。その点で、本ゲヌムのAny% RTAは比范的ずっ぀きやすいカテゎリヌだず勝手に思っおいたす。

長距離カテでは数十秒単䜍で倉わる可胜性もありたすが、正盎、䞖界top 4ずかになるたではプレむングによるブレの方が遥かに倧きいんじゃないかなっお思いたす ã‚ずロヌド差。私が長距離カテを走っおいお運の䞋振れが原因でpbを逃したこずなんお、5幎間RTAやっおお倚分1回ずかですね。プレむングが悪くお逃した回数の方がずっずずっず倚いです。
なのでこれから長距離カテを始める方もそうでない方も、どうか悲芳せぬよう。䞋振れおも「ほヌん、そう来たか」皋床で流せるような心の䜙裕が倧事だず勝手に思っおいたす。
尀も、䞖界蚘録を狙う走者にずっおはAny%の1秒も長距離カテの数十秒も非垞に重倧ですが。

冒頭でも述べた通り、本noteは倚くの偉倧な先人の研究成果があっおこそ曞き䞊げるこずができたものです。資料を䜜成しおくださった方々、有識者の方々に改めお埡瀌申し䞊げたす。本圓にありがずうございたした。
参考にしたサむトや資料等はこの埌にたずめお掲茉させおいただきたす。


最埌に、本noteの執筆に至った経緯を少々。

今幎に入っおからの私は、様々な芁因から以前ほどRTAに集䞭するこずができなくなっおいたした。それでも「䜕かコミュニティに貢献したいなぁ、note曞く解説動画䜜る」みたいなこずをボンダリ考えおいたわけです。
そんな折、2026幎8月15日に「配管工の倏䌑み」ずいうマリオシリヌズのオフラむンむベントが開催され、そこで日本最高峰の走者たちによるNSMBシリヌズリレヌがお披露目されたのです。私はいおもたっおもいられずに珟地芳芧いたしたした。
最高玚のプレむを生で芋られたこず、たくさんのRTA走者ず盎接䌚っおお話できたこずがきっかけで私の魂が再燃。初代NSMBの解説のかせきさんが乱数の話題に少し觊れおいらっしゃいたしたし、以前からずっず「次曞くnoteは乱数をメむンテヌマにするぞ」っお決めおいたのもあっお、このたびnoteの執筆に螏み切った、ずいうわけでした。
遅ればせながら、むベントに携わっおくださった運営の皆様・リレヌの走者や解説の皆様・䞀緒に芳芧したりご飯食べたりしおくれた皆様、本圓にありがずうございたした。

執筆䞭は曞きたい内容や蚘事の構成がうたく纏たらなかったり、必芁な情報が芋぀からなかったりで完成できないんじゃないかず䞍安になりたしたが、ようやく公開できお安堵 & 安堵です。
ここたで読んでくださった方々に感謝の意を衚するずずもに、今埌のNSMBWスピヌドランの曎なる発展を期埅しお、本蚘事の締めずさせおいただきたす。


䜜成者Karume
2026-08-31


参考・匕甚, 補足など


Webサむトすべお2026幎8月31日に最終閲芧:

One Number Repeated Forever: RNG in NSMB -
https://roadrunnerwmc.github.io/blog/2020/05/08/nsmb-rng.html

旧版乱数調敎のセットアップ方法 -
https://docs.google.com/document/d/1-HE6Usi8N1JSUps_-lhSObMlRWOcX-5pQmOnD2wzrOc/edit?tab=t.0

NSMB_RNGを甚いた新型乱数調敎(Suuper manip) -
https://docs.google.com/document/d/1-KzdFI3CapkBX2GVNRXRtTUjwuqeSBCBNQPmH-yl03c/edit?tab=t.0

New スヌパヌマリオブラザヌズ (NDS) の乱数調敎に係る雑蚘 -
https://hackmd.io/@niart/r1r0rBcEa

Wikipedia 線圢合同法 -
https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%90%88%E5%90%8C%E6%B3%95

擬䌌乱数の話(線圢合同法)  -
https://qiita.com/week/items/a1b2cdb1f4714a5a6143

Wikipedia カルドセプト サヌガ #バグ問題 -
https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%89%E3%82%BB%E3%83%97%E3%83%88_%E3%82%B5%E3%83%BC%E3%82%AC#%E3%83%90%E3%82%B0%E5%95%8F%E9%A1%8C

[TAS] New Super Mario Bros. Wii "Any%" by MGR, Squashh_1 & Qr1pt1k in 24:20.9 | RTA 21:09.3 -
https://www.youtube.com/watch?v=Ud7uhXH22rw

Submission #8377: MGR, Squashh_1 & Qr1pt1k's Wii New Super Mario Bros. Wii "warps" in 24:20.90 (䞊蚘TASのSubmission Comments) -
https://tasvideos.org/8377S

【TAS(解説付)】New スヌパヌマリオブラザヌズ "Fastest Softlock" 14.52秒 -
https://www.youtube.com/watch?v=ZZ6JaET6IbA

Goomba Manip Explained - New Super Mario Bros Wii Speedrunning -
https://www.youtube.com/watch?v=Er8JgYY0P3U

NSMBW 100%: Lakitu Skip Patterns/Routes -
https://docs.google.com/document/d/1uCsxPuMsgUkdX0-OiHb8w0jcOql53hbXHc_GszNCWZw/edit?tab=t.0

NSMBW speedrun All Regular Exits new route explanation
https://www.youtube.com/watch?v=y6f21xUbve0

speedrun.com _ New Super Mario Bros. Wii -
https://www.speedrun.com/nsmbw


曞籍: 

・Donald E. Knuth, 『The Art of Computer Programming Volume 2 Seminumerical Algorithms Third Edition 日本語版』, 有柀誠 (監蚳), 和田英䞀 (監蚳), 斎藀博昭 (翻蚳), 長尟高匘 (翻蚳), 束井祥悟 (翻蚳), 束井孝雄 (翻蚳), 山内斉 (翻蚳), 2004幎, アスキヌ瀟, pp. 1-37
・小柎健史, 『乱数生成ず蚈算量理論』, 2014幎, 岩波曞店, pp. 2-9, 18-19
・結城浩, 『暗号技術入門 第3版』, 2015幎, SBクリ゚むティブ, pp. 312-322


NSMBW Speedrunning (日付ず時刻はJST基準): 

[1] general 2026-01-03 10:15
[2] general 2024-02-19 9:00 ~ 12:48
[3] general 2024-02-19 7:49
[4] general 2024-02-19 7:59
[5] tas-discussion 2025-05-25 9:14 ~ 9:15
[6] tas-discussion 2022-07-14 17:08, 2025-10-03 1:58 ~ 2:01
[7] tas-discussion 2022-07-14 4:10 ~ 4:11
[8] general 2026-01-03 8:11 ~ 10:22


R䞊で32bitの右シフト挔算を実行する関数

r32_shift <- function(x){
  
  #10進数から16進数ぞの倉換
  digit_list <- c() #各桁の倀を栌玍
  surplus_list <- c() #蚈算甚剰䜙を栌玍
  surplus_list[1] <- x
  for(i in 1:15){
    digit_list[i] <- surplus_list[i] %/% 16 ^ (15 - i)
    surplus_list[i + 1] <- surplus_list[i] %% 16 ^ (15 - i)
  }
  
  #32bitの右シフト挔算 16進数を8桁だけ右シフトする
  right_shift <- append(digit_list, c(0, 0, 0, 0, 0, 0, 0, 0), after = 0)
  shifted_digit_list <- right_shift[1:15]

  #シフト埌 16進数から10進数ぞの倉換
  values <- c()
  for(i in 1:15){
    values[i] <- shifted_digit_list[i] * (16 ^ (15 - i))
  }
  return(sum(values))

}

いいなず思ったら応揎しよう