レトロゲーム乱数談義

SFC~PS1あたりの時代の乱数事情についての雑談。 超高性能な乱数「メルセンヌツイスタ」を自由に使えるようになった近代では考える必要がなくなってそうな、昔のゲームの乱数事情に思いを馳せたり馳せなかったり。
8
gm:II@風来のシレン学会 @gm_II_

今更になって、先月シレン学会の動画上げたのと同じ日に上がってたFFTの最小クロックの人の動画を見てるんだけど nicovideo.jp/watch/sm386210… 同じく乱数の解説されてて運命的な何かを感じる ちなみに線形合同法の問題はSFCシレンの「線形帰還シフトレジスタ」では解決されてるんだよね(謎のマウント)

2021-05-31 03:26:31
ゆう @spherewind1

SFC風来のシレンって、LFSR使ってるんだ……。SFC時代にそんな乱数生成を実装していたっていうのが凄い。 確かLFSRを複数bitに一般化して(GFSR)調律して捻ったものが、よく知られたメルセンヌ・ツイスタだったかな。状態空間にゼロが多いと良い乱数が作りにくいのは、この系共通の問題だったはず。 twitter.com/gm_II_/status/…

2021-05-31 22:32:53
gm:II@風来のシレン学会 @gm_II_

@spherewind1 LFSR自体はギャラガとかドルアーガで既に使われてたとか 4gamer.net/games/042/G004… むしろFFTの、線形合同法の結果を小数で解釈して奇遇の問題をなくすって概念の方が新しい気さえしますね あつ森のカブ価の乱数がLFSRの改良版のXorShiftってのは見たことあるんですが、MTを使ったゲームってあるのかな

2021-06-01 02:20:27
ゆう @spherewind1

@gm_II_ なるほどー。回路実装ならLFSRの方が楽+良質なんですね。PSはたぶんライブラリ開発が主流の時代で、自前実装が少なかったのかも。FFTの乱数もCっぽい挙動ですし。 MT使用を明記したゲームは大神とかがありますね。表記してないだけで使ってるゲームは色々あるかもですねー。 yuramaki.com/essay/okami_me…

2021-06-01 12:26:32
gm:II@風来のシレン学会 @gm_II_

@spherewind1 そういえばFF7とかはCで作られてたんでしたっけ。アセンブラベタ打ちなんて時代はかなり限られてるんですねえ。しかしスタッフロールに乱数生成法が載ってるの、すげえ面白いですね。MTが1996年発表、大神が2006年だから発表から10年ですか SFCシレンの乱数で計算してる、(続

2021-06-01 21:02:47
gm:II@風来のシレン学会 @gm_II_

@spherewind1 LFSRを32ビットじゃなくて敢えて31ビット使うことで、XORの回数を減らして計算コストを下げる、っていうのも、数学の現場では1980年代に既に議論されてたらしく(乱数について調べてるときに論文を見かけた程度の知識)、 SFCシレンの手法は学術的には先進でもないのかもしれませんね。

2021-06-01 21:07:16
Tom@cres @tomato_cres

@spherewind1 @gm_II_ ゲームの乱数に詳しい方の会話に割り込むのは恐縮ですが、MT開発者がこんな講演をされていて、「多くのソフト、ポケモンゲーム、任天堂Wiiなど」と書かれてますね。最後のポケモンBWの初期値制御は笑い話なのか嘆きなのか。 math.sci.hiroshima-u.ac.jp/m-mat/TEACH/ic…

2021-06-01 15:31:33
Tom@cres @tomato_cres

@spherewind1 @gm_II_ MT, XorshiftはLFSRの拡張というより、高速なソフト実装に最適化してあるだけで、数学的には行列の乗算で書けるLFSRの一種という認識でいます。 スクウェアはSFCは乱数表、PSでも線形合同法と遅れていた印象があります。昔こんな記事書いたことあります。(一般論編と数学編) ch.nicovideo.jp/tomato_cres/bl…

2021-06-01 15:51:20
ゆう @spherewind1

@tomato_cres @gm_II_ 色々情報ありがとうございますー。 確かに、GFSR, MT, XorshiftはまとめてLFSR系ってしても違和感ないですねー。本質は変わらないので。 スクウェアのゲームに乱数表や線形合同法が多い印象なのも同意です。速度重視?というか、あまり乱数に凝らない主義だったんでしょうか……。

2021-06-01 18:50:38
gm:II@風来のシレン学会 @gm_II_

@tomato_cres @spherewind1 最高な資料や記事、ありがとうございます。MTの松本先生、こんなユーモア溢れた文章書く方だったんですね。この文脈でポケモンの初期値吟味の話まで出るの面白すぎるww LFSRってそんな広い概念なんですね。シフトレジスタ自体がベクトルの線形写像だから、そりゃ行列で書けるなら全て仲間か。

2021-06-01 21:12:54
Tom@cres @tomato_cres

@spherewind1 @gm_II_ 凝らない主義というより、特に主義が無く当時の研究者レベルの知識も無かった結果だと思います。乱数表は速いでしょうが当然ROM喰うので必死に容量削減する時代に比較検討した結果とは思えないですし、LCGは複雑なLFSRであるMTと変わらない速度(画像)ですし。 俺、転生したらLFSRで無双するんだ…… pic.twitter.com/9dfqDR2x2G

2021-06-01 19:09:15
拡大
ゆう @spherewind1

@tomato_cres @gm_II_ ライブラリか何かに任せておしまい、って感じだったんでしょうねー……。 LCGは、まだMTが出たばかりの90年代はともかく、00年代以降で使わない手はないですねー。ただ、研究者でも粗雑なLCGを使ったりしていたっていう話もありますし、アンテナの高さによるのかな。

2021-06-01 19:20:25
gm:II@風来のシレン学会 @gm_II_

@tomato_cres @spherewind1 最近のライブラリには大方MTが入ってるってのはなんとなく聞いたことあったんですが、phpとかも乱数の中身はMTなんですね。本職(シレンじゃない方)で多少触るんで身近なんですが、そこにもMTがあったとは・・・

2021-06-01 21:18:05
Tom@cres @tomato_cres

@gm_II_ @spherewind1 疑似乱数の初期化の問題からは逃れられないですからね。間違っても意図的にLFSRをゼロに出来てはいけないw LFSRは広い概念だと思ってるんですがそう言ってる専門家を見かけないのでちょっと不安……なんですが調べる限り定義に反してないのでそう思ってますw

2021-06-01 21:20:51
gm:II@風来のシレン学会 @gm_II_

@tomato_cres @spherewind1 ローグライク的にはその出来てはいないことがある意味美味しいので目的にしちゃったわけですが…ww いやあ、その辺の数学的な厳密性はよくわからないですね、というか動画で語ってる内容も相当怪しいのでかなり自信ないんですがww

2021-06-01 21:56:22
gm:II@風来のシレン学会 @gm_II_

@spherewind1 @tomato_cres SFCのファイアーエムブレムあたりが、敢えて詰将棋っぽくするために周期を255にするとか、容量に余裕が出てきたFF6が65535の乱数表使うとか、 開発背景とゲームの要求とが絡んで乱数の方針が決まってるのが面白いですよね。 逆に近年のゲームはライブラリ使っときゃ問題ない、ってなってそうですが…

2021-06-01 21:25:40
ゆう @spherewind1

@gm_II_ @tomato_cres 理由はどうあれ、ゲームを面白くするための開発者のアイディアとして乱数も工夫する、っていうアイディアはいいですよねー。 しかしよく知らない素人が組んじゃうと、某カルドセプトのような事態になりかねないので、それなら素直にライブラリ使ってほしいところ……。

2021-06-01 21:43:17
Tom@cres @tomato_cres

@gm_II_ @spherewind1 昔は良い乱数って何?線形合同法で何が悪いの?って感じだったと思うんですが、今は決着がついた感じですね。 LFSRは周期が2^nじゃなくて2^n-1なのが非常に素人受け悪いと思うんですが、そこが不満ならMTみたいにnを増やしてもらえば無視できる問題なので。

2021-06-01 21:30:05
Tom@cres @tomato_cres

@gm_II_ @spherewind1 FF6は良く知らなかったのですが、256の乱数表をずらして長周期にしてるんですかね? s-endo.skr.jp/gameprog_analy… SFC FEは聖戦の系譜ですかね。(紋章の謎は不評のwkb、多分詰将棋要素ない) あれは周期の妙ではなく、セーブデータに現在の乱数生成期の状態を含めているから、と思っています。

2021-06-01 21:39:11
ゆう @spherewind1

@tomato_cres @gm_II_ FF6の場合は256×256の乱数表になってる、っていう理解ですねー。 ナンバリングタイトルのほうのFFは、さすがにプレイしている人も段違いに多いだけあって、解析レベルが高いですわ……。 ch.nicovideo.jp/ochakirin/blom…

2021-06-01 21:54:19
gm:II@風来のシレン学会 @gm_II_

@spherewind1 @tomato_cres FF6は、帝国空軍の吟味で65535の乱数表から探す、みたいなことをちらっと見た程度の知識だったんですが、そうなってるんですね… FFは海外勢も強いですもんね。シレンの解析勢は国内の少数精鋭という感じですがww

2021-06-01 22:13:30
gm:II@風来のシレン学会 @gm_II_

@tomato_cres @spherewind1 そこら辺、高周期のライブラリ使っとけばOK、みたいな感じなんでしょうか。コストや容量を詰める必要がなく、周期を下げる意味もないとなると、何となく寂しい気もしますね。 もし最近のシレンがMT採用してたら、多分乱数固定はできないだろうなって寂しさもありますが #それはなんか違う

2021-06-01 22:02:40
Tom@cres @tomato_cres

@gm_II_ @spherewind1 それは疑似乱数と真の乱数を区別する術を持たない一般人に対し、自分だけ小さな隙を付いて区別できる立場に立てると嬉しい、ってことですよね。隙が無くなればしょうがないかと……w でも、結局MTでも初期値決めの問題は残るし、任意コード実行できれば壊せるのは同じじゃないかと思います。 pic.twitter.com/v3k5wXUMzT

2021-06-01 22:21:24
拡大
gm:II@風来のシレン学会 @gm_II_

@tomato_cres @spherewind1 いやーなんか最大周期がすごいから、途中から全て0にする手間が大変そうだなぁ、くらいしか考えてなかったんですけどねw

2021-06-01 22:43:15
Tom@cres @tomato_cres

@gm_II_ @spherewind1 あ、初期化するつもりはあったんですね。ただ敵(?)は乱数の進歩より、任意コード実行の難易度上昇だと思いますね。何しろ今ネットワーク対応機器でそんなこと出来るとすぐIPA案件ですのでw 可能性があるとすれば外部ツールでセーブデータ改ざんですかね、それもPythonのseed()みたいなのだと不可ですが

2021-06-01 22:50:34