2ntブログ

コンピュータゲームにおける乱数

コンピュータゲームの多くは、乱数を使っています。
乱数とは、「規則性が無く全ての数字が同じ割合で出現する」ものです。
簡単に言うと、サイコロですね。

コンピュータはどのような環境化であっても、必ず同じ答えが正確に出るの計算が売りなので、毎回違う結果が出るような処理は苦手です。
1+1は必ず2でなければならないわけで、これが場所や時間が違えば3になったり0になったりしたら困るわけです。

昔のコンピュータゲーム機は、今と比べてCPUの処理スピードも遅かったので、乱数を計算処理で出していませんでした。
乱数表」と呼ばれる、予め高性能なコンピュータ等を使って出した不規則かつ偏りのない数字の羅列をデータとして持ち、それらを使っていました。
ただこの「乱数表」には欠点がありました。
ゲーム開始時から毎回同じ操作をすると、毎回同じ展開になってしまうというものです。
ファミコン時代にはよくありました。
例えばボス戦の直前にセーブしたとします。
あとちょっとの所でボスにクリティカルヒットを食らって死んでしまいました。
するとロードしてやり直しても、必ずクリティカルヒット食らって死んでしまうみたいな事です。
もっともこういう事態を防ぐ為に、「乱数表」を複数持っていて、セーブやロードのタイミングでこれらを変える処理を行うものもありました。

PC9801というWindowsはおろか、その前身であるDOSですらまだ浸透していなかった時代のパソコンゲームに、「天下統一Ⅱ」という名作戦国シミュレーションゲームがありました。
光栄ではなくシステムソフトという、大戦略などを世に送り出して有名になったメーカーのものです。
このゲーム、ある年齢以上になった武将は能力値がどんどん下がる仕様になっていました。
老化というリアルさを出すためだったんでしょう。
これの救済策として、「隠居」というコマンドがありました。
高齢(といっても戦国時代の話なので45歳以上でしたがw)の武将を強制的に隠居させて、代わりに架空の若い跡継ぎを出現させるものです。
架空なので毎回初期能力値が違う者が登場します。
より初期値の高い、優秀な跡継ぎを出したいので、「隠居」を実行する直前にセーブするわけですが、それで凡人以下の能力の跡継ぎしか出なかった時に、ロードしてやり直してもまた同じ能力値の跡継ぎしか出なかったんですw
乱数表を使っていた為ですね。
一応、ロードした後にもう一度何もしないでセーブすると、乱数表が違うものに切り替わるので違う跡継ぎが出せるという回避策はありましたけどね。

さて、コンピュータの性能が良くなった現在は「乱数表」が使われることはありません。
きちんと計算処理で乱数を作っています。
ただやはりコンピュータなので、かなり偏りはありますね。
計算処理で乱数を出す場合、同じ入力値を使って計算したらいくら複雑な計算をしても毎回同じ結果になってしまいますので、「不確定要素」として「時間」を使っている関係でしょう。
今のコンピュータは内部に時計を持っているのが当たり前になっています。
この時計の秒数を使うんです。
何時何分何秒の「何秒」部分ですね。
乱数を出す処理が実行された時に、内部時計の秒針を見に行って、それを元に計算するみたいな事です。
毎回同じ秒数の時に攻撃するとか、そういう操作をするのは困難ですから、理論上は0~60までの毎回違った数値が得られるわけですよ。

ただこの方法も乱数表と同じく欠点はあります。
1秒も違わず操作するのは不可能でも、一定のタイミングで同じような動作をするとか、そういうのは人間できます。
なので毎回同じような結果が出ることもよくあります。
例えば前回の攻撃が時計の秒針が30秒だった時で、今回の攻撃が秒針が35秒だったとします。
乱数としては30と35なので違う数値ですが、コンピュータの乱数を使った攻撃判定って「0~10ならクリティカルヒット」「11~40までなら通常ヒット」「41~50までならちょっと急所を外れた低ダメージ」「51~60なら外れ」みたいなプログラムになってる事が多いので、30と35だと同じ結果になってしまうわけですよw

このようにコンピュータの乱数処理ってのは、リアルのサイコロと違って本当の意味でのランダムな結果って出し難いんですね。
なので乱数を廃したり、極力使わないゲーム作りってのも昔から行われています。
そもそも「乱数」ってのは、「何が起こるか分からない」「毎回違う結果になる」というリアルの世界を再現する手段として用いられてきました。
例えばリアルの世界のゲームで、マージャンとかトランプとかって、始めに配られる牌とか札って毎回違うと思うんですよ、イカサマでもしないかぎり。
それがゲームの面白みでもあります。
良い牌パイや手札の時もあれば、悪い時もある。
それらをコンピュータ上で再現しようとすると、「乱数」を使うしかないんですよね。
野球なんかでも「今日は先発の○○は調子いいですねー」とかよく解説とか実況が言ったりしますよね?
この「調子」を再現するのも「乱数」を使う以外にできません。
先発ピッチャーが前日どんな行動をして、どんなものを食べて、どれだけ寝たかとか、「調子」を決定する人間でも全てを上げるのが不可能なほどのリアルの様々な要素までシミュレートできませんからねw
天候や気温・湿度などもそうでしょう。

でも対戦ゲームとかってあまり乱数は使わなくても実は良いんですよ。
相手が人間であれば、毎回違った動作をするはずです。
人間の操作という「入力値」が毎回違うので、コンピュータの計算結果も毎回それに応じた違うものになるはずだからです。
なのでこの手のゲームは昔と違って最近では攻撃力いくらの人が防御力いくらの人に攻撃をヒットさせたら、必ずいくらのダメージになるみたいな固定計算になってたりします。
「かいしんの いちげき」も「だが かわされてしまった」も無いんですw
正確にはFPS系のゲームだと敵の頭に弾を命中させると、「かいしんの いちげき」みたいなクリティカルヒットになるんですが、これも敵の頭に弾を当てられるかどうかは、自分の操作と相手の動きという毎回違った多くの可能性のある条件が揃わないと無理ですので、乱数を使う必要が無いんですね。

この方がゲームとしては、結果が乱数に左右される「運ゲー」より遥かに面白いです。
ただ「自分も相手もリアルの人間である」という条件が大前提のゲームじゃないと乱数を廃するのは困難です。
昔のコンピュータゲームではこれらを実現するのが難しかったですが、ネットの普及と高性能化によって、友達を家に呼ばなくても、ゲームセンターに行かなくても24時間365日同じ人間相手に遊べる「ネットゲーム」が出来たからこそ増えた仕組みですね。

今後この動きは更に加速するものと思われます。
ゆくゆくは、コンピュータゲームで乱数が使われる事は無くなるでしょう。
なぜなら、いまや家庭用のゲーム機でさえネットに繋がるのが当たり前になりましたから。
相手が人間でなくても、ネットと繋がっていればそこからリアルの世界に連動した不確定要素、例えば気温や湿度などの天候とか、そういうものを引っ張ってきて使えるからです。
この天候情報もいまでこそ1時間ごとの~みたいなのしかありませんが、恐らく未来では時計のように秒単位でリアルタイムに小数点以下何桁という細く変動する数値が提供されるようになるでしょうから。

まぁリアルの世界の、一見ランダム・不規則に見える事象も、人間が認知しきれない大量の条件・要素・入力値による正確な計算の結果なんですけどね。


コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR