【ウディタ】乱数を使っておみくじを作ろう!【後編】【シード値について】

2019-12-03ウディタで作ってみよう

前回は簡単なおみくじを作ってみました。

しかし一つだけ問題点が浮かび上がりましたね。今回はそれを解決する方法を説明していきます。

前半は『シード値』についての説明が入るので、さっさと完成させたい方は、目次から『シード値を新たに生成する方法』に飛んでください。

シード値とは?

まずは「シード値」について軽く理解しておきましょう。

シード値とは 、システム変数110番『現在の乱数のシード(種)』に格納されている数値のことです。この値が乱数生成の基となります。
「シード(種)」という名前もそこから来ているのでしょう。

ざっくりと「ウディタで乱数を作るときはシード値を使うんだな」と覚えておけば問題なく使えます。

完全にランダムな乱数をつくるには?

シード値は特に値を指定しない限り、乱数の計算処理が行われるたびに値が書きかえられます。「数値が毎回書き換えられる」のならば、一見問題はなさそうですが……。

じゃん。

おみくじをそれぞれ4回ずつ、ロードを挟む前と挟んだ後に行ったときの記録です。
「シード値」と「乱数」が分かるようにしてみました。
さて、画像をみるとおみくじを引くたびにシード値が変化しているのが分かりますが……ロードを挟む前(青枠)と、挟んだ後(赤枠)の値を比べてみていかがでしょう。

なんと、乱数と同じくシード値まで繰り返されているではありませんか。

この現象は『シード値がセーブによって保存され、ロード後も受け継がれてしまう』ことに原因があります。

乱数生成後に自動で書きかえられるシード値は『前回のシード値を基に』作られます。この場合新たなシード値生成の基となるのは前回セーブした値となるので、結果、先程のような現象が起きてしまうのです。

……と長々と書いてしまいましたが、よく分からなくても問題ありません。筆者も実はよく分かっておりません(^^;)

乱数生成、シード値についてもっと詳しく知りたい方は以下の記事で実験をしておりますので、よければご覧になってください。

さて、これを防ぐにはどうするべきか。セーブデータに囚われずシード値を変化させることができればよさそうですね。……どうやって?

こちらがシード値を変化させる処理を組んでやればいいのです。

これは、使用しているウディタのバージョンが2.20以降であればなんとチート技が使えます。わざわざ計算したりと面倒なことをしなくて済むのです。(以前のバージョンの解決方法も説明しています)

シード値を新たに生成する方法

バージョン2.20以降

Sysボタンを押すと、システム変数一覧が表示されます。
そこからSys110番を選びましょう。

おわり。

「なんでゼロ!?」「これじゃあシード値変わらないじゃん!」って感じですよね。
なぜこれでいいのかといいますと、ウディタの制作者であるSmokingWOLF様がウディタのバージョンアップに伴ってシードの仕様を変更したからなのです。

【乱数】 「Sys110:現在の乱数のシード」に0を代入すると、以後ずっと乱数が機能しなくなるので
      シード値が0になった場合は自動で新たなシードを再生成するよう修正

引用元: WOLF RPGエディター更新履歴
URL: http://www.silversecond.com/WolfRPGEditor/ReleaseLog.html

※バージョン2.20以前は、Sys110番に0を代入すると乱数がずっと0になるという仕様がありました。

おみくじを引くたびにランダムなシード値が再生成されるので、乱数の結果を不規則にできるのです。

バージョン2.20以前

バージョン2.20以前の場合は、Sys110番に常に変化している数……つまり『時間』を代入してやればよいのです。

Ver2.20以前の解説とかいいながら画面はVer2.24のものです。すみません。

変数操作でSysと書かれたボタンを押せば、システム変数を選ぶことができます。
Sys77番~Sys82番は現在の時間が代入されている特殊な変数です。これを使えば左辺に現在の時間を代入することができます。

私はこのようにしてみました。

はじめの演算子が“="(イコール)
残り3つの演算子が“+="(加算代入)になっていることに注意してください。

……なんてえらそうに言っていますが、
このプログラムだと『1/2 00:00:00』と『2/1 00:00:00』は同じシード値を返します。
あと『1/1 00:00:01』と『1/2 00:00:00』もそうですね。

・・・・・・(^ω^;)

なるべくシード値が被らない方法を探していたのですが、数学苦手な私には難しすぎました。すみません。しかしまあ「乱数の法則を見破られたくない!」なんてことがない限りはこのくらい単純な処理でも十分でしょう。

満足のいかない方は、是非自分で計算方法を探してみてくださいね。

テストプレイ!

あとはテストプレイするのみです。
きっとランダムな結果がでてくるはずです。

うまく動けば完成です!

おわりに

今回は乱数を使っておみくじを作ってみました。乱数は使いようによってはゲームを面白くするので様々な場面で使ってみてくださいね。では、お疲れさまでした!