なぜ古いゲームでは乱数テーブルが使われていたのでしょうか?

スーパーファミコン時代のRPGを攻略のために解析しているような記事を見ると、ゲームではメルセンヌ・ツイスタなどのアルゴリズムによる乱数生成ではなく、あらかじめ用意された乱数テーブルを使っているようです。
これは何故なのでしょうか?

簡単に思いつく予想としては、以下のような理由が考えられますが実際のところはどういう理由なのでしょうか?
・RAMの使用容量をバイト単位で削るため?
・人間が乱数だと認識するような、実は真の乱数ではない(0が100回連続で出たりしない)出現パターンを得るため?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/01/04 23:31:31

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ゲームで使われていた乱数の生成方法の変遷は、ナムコの加来量一さんという方の公演に詳しいようです。
http://app-review.jp/news/222268

  1. ハード寄り ―――― 再現性が無い
  2. 演算(線形合同法など) ―――― 演算コストはかかるけれど、メモリは高い
  3. 乱数表 ―――― メモリが安くなってきたし、乱数としての質の問題への対応
  4. 演算(線形合同法などに戻る) ―――― C言語の標準ライブラリでお手軽
  5. 演算(メルセンヌ・ツイスタ) ―――― 今、ここ

線形合同法などの乱数としての問題点は、こちらでも。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/TEACH/ichimura-sho-koen.pdf

スーファミの発表が '90年。
メルセンヌ・ツイスタの発表が '96年で、新聞に載ったのが翌 '97年。

このLCGとLFSRを組み合わせて使う手法はしばらく流行しましたが、1980年代末にはテーブル参照手法が復権してきました。
当時CPUは80年代中盤から変化なかったのですが、メモリ増量が実現し余裕ができたので乱数テーブルを置こう、という考え方に至ったのです。
  (snip)
そして1990年代、乱数は大変革の時を迎えました。コンシューマーレベルでのC言語の導入が始まったのです。
C言語には一般に標準Cライブラリが付属するため、開発でそれに含まれるrand()関数を利用するケースが次第に増えてきました。
しかし、当時のrand()関数は大半が乱数アルゴリズムとしてLCGを採用していたため、80年代中盤にLCGとLFSRの合体で解決していた問題が再燃しました。

【CEDEC2014】パックマン、ドルアーガの塔…往年のナムコタイトルから学ぶ乱数の進化と応用|APPREVIEW


後、乱数の精度が良くなったとして、ゲームにそのまま使えるかどうかという話。
http://blog.livedoor.jp/lunarmodule7/archives/4523745.html

「乱数調整」というキーワードはスーファミのときにもあったように記憶しています。
周期性などの問題もあるし、調整するなら表持ちの方がやりやすいかも、みたいなことがあったかどうか。

id:ku__ra__ge

なるほど。ゲームで使われる乱数は時代とともに変遷していっており、その流れの中に乱数テーブルによる乱数発生があるんですね。
URL先の記事も参考になりました。素晴らしい回答をありがとうございます。

2017/01/04 23:35:16
  • id:NAPORIN
    「人間が乱数だと認識するような、実は真の乱数ではない(0が100回連続で出たりしない)出現パターンを得るため」を岩田さんかどなたか有名なゲームプログラマーさんがどこかで書いていらしたとおもいます。でもurlを(今は)探し出せません。
  • id:degucho
    メルセンヌツイスタが発表されたのは64が出た後くらいですね
    ちょっと検索してみたらゲームによってはフレームを使った線形合同法のもあるみたい
    でも完全に乱数にするとゲーム性を担保できないからではないでしょうか

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません