【ウディタ】シード値の設定で乱数はどう変わる?実験してみた

2019-12-03ウディタ機能解説

ウディタのシード値について詳しく知りたかったので、いくつか実験をしてみました。

前置き

条件

キャラクターに話しかけることで乱数が生成される仕組みを作りました。 乱数の処理はコモンイベント内で行い、マップイベントでコモンイベントを呼び出しています。
バージョンは2.24を使っております。

作られた乱数はデバッグ文に表示されます。
また文中に『■■セーブしたよ■■』『■■ロードしたよ■■』などの文字が出てきますが、ゲーム中で『セーブ』『ロード』を挟んだことを意味します。

乱数・シード値についておさらい

ウディタの乱数はSys110番:現在の乱数のシード(種)を基に乱数が生成されます。
この値を変更することで乱数の結果も変わります。

シード値を変えてみる

まずはシード値を指定しない場合の結果を見てみましょう。

シード値を指定しない場合

■変数操作: CSelf10[乱数] = 0 ~ 100 
■デバッグ文:シード値→\sys[110]
■デバッグ文:乱数→\cself[10]

シード値は乱数処理のたびに新たな値が生成されますが、一度セーブを挟んで乱数を生成してからロードをした場合はシード値、乱数共々ロード前と全く同じ結果が出ます。(赤枠で囲われた部分が繰り返されています)

シード値を固定した場合

■変数操作: Sys110:現在の乱数のシード(種) = 20 + 0 
■変数操作: CSelf10[乱数] = 0 ~ 100 
■デバッグ文:乱数→\cself[10]

同じ乱数が繰り返されます。先程とは違い、セーブ&ロードをしたあとも、またゲームを再起動したあとでも乱数の値は変わりません。
乱数の値を固定したいときに使えそうです。

ちなみに

▼ シード値を20から21に変更
■変数操作: Sys110:現在の乱数のシード(種) = 21 + 0 
■変数操作: CSelf10[乱数] = 0 ~ 100 
■デバッグ文:乱数→\cself[10]

と変更すれば、全く別の乱数が生成されます。

シード値を0にした場合(Ver2.20以降のみ可能)

■変数操作: Sys110:現在の乱数のシード(種) = 0 + 0 
■変数操作: CSelf10[乱数] = 0 ~ 100 
■デバッグ文:シード値→\sys[110]
■デバッグ文:乱数→\cself[10]

シード値、乱数共にランダムになっています。

というのもバージョン2.20以降は、シード値が0の場合は新たなシード値が再生成されるという仕様があります。よってこのような処理になるのです。

不規則な乱数を生成したい場合は、シード値を0にすればよいですね。

シード値の動き

次に、シード値の動きを細かく見てみましょう。

乱数が作られる前と作られたあと

■デバッグ文:シード値を指定する前↓\n\sys[110]\n--------------------------------
■変数操作: Sys110:現在の乱数のシード(種) = 20 + 0 
■デバッグ文:シード値(乱数生成前)↓\n\sys[110]\n--------------------------------
■変数操作: CSelf10[乱数] = 0 ~ 100 
■デバッグ文:乱数→\cself[10]\n--------------------------------
■デバッグ文:シード値(乱数生成後)↓\n\sys[110]\n■■■■■■■■■■■■■■■

このようなコードを書いてみます。デバッグ文でシード値の動きを見ています。
変数操作自体は、シード値を固定した場合と同じですね。

いかがでしょう。

なんと手動で指定したはずのシード値が、乱数を生成した後ではなぜか"336140″と見たこともない数値に変わってしまっています。シード値を0にした場合にも同様の処理が確認できます。

おそらく乱数生成時は指定した値(この場合20)を参考にし、生成後は自動でシード値が変更されてしまうのでしょう。

シード値の引き継ぎ

シード値はセーブ保存ができる他、[F12]で再起動した場合はロードしない限り、再起動前のシード値がそのまま継がれるようです。画面右上の×印を押した場合はシード値がリセットされます。

■デバッグ文:シード値(乱数生成前)↓\n\sys[110]\n--------------------------------
■変数操作: CSelf10[乱数] = 0 ~ 100 
■デバッグ文:乱数→\cself[10]\n--------------------------------
■デバッグ文:シード値(乱数生成後)↓\n\sys[110]\n--------------------------------
再起動前と再起動後のシード値が同じことが分かります。

以上です。最後までお疲れさまでした。