擬似乱数とは、「乱数列(乱数)のように見えるが、実際には確定的な計算によって求めている数列に含まれる数」(Wikipediaより)。狭義(あるいはニコニコ的な意味)では、コンピュータで生成する乱数のようなもののこと。
概要
コンピュータによるシミュレーションや、ゲームを作る際にランダムな数が欲しくなる時がある。そんな時に使うのが擬似乱数である。けど、場合によっては乱数はほしいけど後で同じ結果を再現したいとかいう場合がある。よって、とりあえず擬似乱数にほしい性質は以下の2つ。
ちなみに、このseed値の設定にはいろいろな手法があるが、一番よく使われているのは現在の時刻から決める手法であろう。
擬似乱数生成アルゴリズム
擬似乱数を作る方法のこと。Wikipediaの記述は詳しいが少々冗長であるため、特徴を述べるにとどめておく。
- 平方採中法(middle-square method)
かのフォン・ノイマン博士が提唱した最初の乱数生成アルゴリズムで、2乗(平方)した値の真ん中を乱数値として取ることからこの名がついた。もうカビが生えたような歴史の教科書レベルのアルゴリズムである。 - 線形合同法(linear congruential generators)
C言語のrand関数(stdlib.h)にも採用されている、記憶容量に最も優れるアルゴリズムで、これまで長く使われてきた。周期が短いとか、設定を誤ると偶数ばっかりだったり奇数ばっかりだったり偶数と奇数が交互に出るとかいう欠点がある。性能も向上してきた今、他のアルゴリズムを使うべきだと思う。
カルドセプトサーガ?お前は何を言っているんだ - メルセンヌ・ツイスタ(Mersenne Twister)
松本眞教授(当時は広島大学在籍、現在は東京大学)らが20世紀末に発表したアルゴリズム。219937-1のすごく長い周期を持つ(余談だが219937-1≒4.315*106001で、いわゆるメルセンヌ素数の一つ)。また比較的高速で、線形合同法のように偶数奇数が規則正しく出ることはない。 - Xorshift
名前の通り、排他的論理和(XOR:演算対象の2つのビットが同じなら0、違うなら1)とビットシフト演算(ビットを左や右にずらす演算)しか使わない擬似乱数生成アルゴリズム。2128-1の周期で、かなり速い。ちょっとしたゲームに使うくらいならこれで十分だろう。
ニコニコ動画と擬似乱数
なんといっても乱数調整なしにこのセクションは語れまい。というか乱数調整の記事のほうがこの手の話に詳しいのでそちらを参照されたい。ファイアーエムブレムシリーズにおける"ファルコン法"やポケモンの乱数調整が特に有名である。特に、TASを語る上で擬似乱数の乱数調整は欠かせないものとなっている。
しかしながら、乱数調整は制作者の意図した仕様の範疇外だったり、ゲーム性を破壊することから否定的な意見も少なくない。
関連商品
関連項目
- 5
- 0pt