ウディタ中級者になるためのその6~乱数のシード値を使う~
製作記とウディタ雑記ってどっちのが読者多いんだろう…などと思いながら第六弾。
ウディタの使い方がある程度分かっている人でも、システム変数の意味を理解して使いこなすのはなかなか難しいです。
ということで、今回はシステム変数のなかの「乱数のシード値」について取り上げてみようかと思います。
ウディタの使い方がある程度分かっている人でも、システム変数の意味を理解して使いこなすのはなかなか難しいです。
ということで、今回はシステム変数のなかの「乱数のシード値」について取り上げてみようかと思います。
まず基本的なことですが、乱数はまったくランダムに出てくるわけではありません。
ウディタでRPGを作ったことのある人なら「ボス戦の前でセーブして、負けたのでロードしてやり直したら、なぜか展開がまったく同じになる」という現象を体験したことがあるんではないでしょうか。
これは乱数が出てくる順番が決まっているために起こる現象です。すなわち、同じ行動を取ると同じ乱数が出てくることになるので、結果も同じになるわけですね。
これを回避するには1フレームごとに乱数を使って、乱数の順番を変えればいいわけですが、それは別の話。
ちなみにこの性質を利用した例として、公式サイトだとリプレイ機能なんかが紹介されています。
が、おそらく初級者~中級者には敷居が高いと思われます…。
さておき、ではシード値とはなにか。
言葉そのまま、タネと考えると分かりやすいでしょう。
タネによって生まれる植物が異なるように、乱数もシード値によって生まれる乱数が変わってきます。
逆に言えば、シード値が同じなら生まれる乱数はいつも一定ということですね。
たとえば、シード値1で1~100の乱数を出したとき、12、56、84の順番で乱数が出たら、シード値を1に固定すれば状況にかかわらず、1~100の乱数では12、56、84の順番で乱数を出すことができるということになります。
ここらへんは実際に試してみると分かりやすいでしょう。
では、シード値の固定はどんなときに使えばいいのか。
一般的なところだと、ランダム宝箱なんかが思い浮かびます。
低確率でレアアイテムが出るような宝箱をつくるときに、セーブ&ロード対策をしたい人なんかはシード値を使うと便利かもしれません。シード値を固定すればロードしなおしても同じアイテムしか出なくなるので、レアアイテムが出るまでロードで粘るということができなくなります(ただしこの場合、シード値にする数値の決め方には工夫が必要。でないと永遠に同じ中身しか出ない宝箱になってしまう)。
そのほかでは、日付をシード値にして、日によって中身の変わる宝箱とかも実現できそうです。
進化したところだと、ダンジョン自動生成アルゴリズムなんかにもシード値を使えば、同じ地形を再現させることもできそうです(片道勇者ばかり例にあげるのもアレだが、あのゲームは名前を数値に変換してシード値として使用していると思われる。ので、同じ名前の世界ならプレイヤーに関係なく同じ地形が生まれる)。
というように、乱数のシード値を使うと、乱数を固定することができるので、ランダム要素のあるものを一時的に非ランダムにしたい場合なんかには使ってみるといいんじゃないかと思います。
※15/2/5追記:
日付や時間をシード値にする際ですが、0だけは絶対にシード値にしないように!
やってみれば分かりますが、0をシード値にしてしまうと、乱数を回してもシード値が変更されなくなるため(たぶんウディタ内部のシード値計算式の問題でしょう)、バグの原因になります。
なのでたとえばシード値をいじるときでも、「シード値=-100~100」みたいに0がシードになりうる状況は絶対に作らないようにしましょう。
ウディタでRPGを作ったことのある人なら「ボス戦の前でセーブして、負けたのでロードしてやり直したら、なぜか展開がまったく同じになる」という現象を体験したことがあるんではないでしょうか。
これは乱数が出てくる順番が決まっているために起こる現象です。すなわち、同じ行動を取ると同じ乱数が出てくることになるので、結果も同じになるわけですね。
これを回避するには1フレームごとに乱数を使って、乱数の順番を変えればいいわけですが、それは別の話。
ちなみにこの性質を利用した例として、公式サイトだとリプレイ機能なんかが紹介されています。
が、おそらく初級者~中級者には敷居が高いと思われます…。
さておき、ではシード値とはなにか。
言葉そのまま、タネと考えると分かりやすいでしょう。
タネによって生まれる植物が異なるように、乱数もシード値によって生まれる乱数が変わってきます。
逆に言えば、シード値が同じなら生まれる乱数はいつも一定ということですね。
たとえば、シード値1で1~100の乱数を出したとき、12、56、84の順番で乱数が出たら、シード値を1に固定すれば状況にかかわらず、1~100の乱数では12、56、84の順番で乱数を出すことができるということになります。
ここらへんは実際に試してみると分かりやすいでしょう。
では、シード値の固定はどんなときに使えばいいのか。
一般的なところだと、ランダム宝箱なんかが思い浮かびます。
低確率でレアアイテムが出るような宝箱をつくるときに、セーブ&ロード対策をしたい人なんかはシード値を使うと便利かもしれません。シード値を固定すればロードしなおしても同じアイテムしか出なくなるので、レアアイテムが出るまでロードで粘るということができなくなります(ただしこの場合、シード値にする数値の決め方には工夫が必要。でないと永遠に同じ中身しか出ない宝箱になってしまう)。
そのほかでは、日付をシード値にして、日によって中身の変わる宝箱とかも実現できそうです。
進化したところだと、ダンジョン自動生成アルゴリズムなんかにもシード値を使えば、同じ地形を再現させることもできそうです(片道勇者ばかり例にあげるのもアレだが、あのゲームは名前を数値に変換してシード値として使用していると思われる。ので、同じ名前の世界ならプレイヤーに関係なく同じ地形が生まれる)。
というように、乱数のシード値を使うと、乱数を固定することができるので、ランダム要素のあるものを一時的に非ランダムにしたい場合なんかには使ってみるといいんじゃないかと思います。
※15/2/5追記:
日付や時間をシード値にする際ですが、0だけは絶対にシード値にしないように!
やってみれば分かりますが、0をシード値にしてしまうと、乱数を回してもシード値が変更されなくなるため(たぶんウディタ内部のシード値計算式の問題でしょう)、バグの原因になります。
なのでたとえばシード値をいじるときでも、「シード値=-100~100」みたいに0がシードになりうる状況は絶対に作らないようにしましょう。
- 関連記事
スポンサーサイト