WOLF RPGエディター(ウディタ)[3.336]/変数【サイトトップへ戻る】
■「乱数」って何?
(更新:2024/05/06)


乱数について解説します。


ショートカット
■乱数の基礎
■システム変数[110:現在の乱数のシード(種)]について
■乱数の設定例:セリフがランダムに変わる
■乱数の設定例:複数の変数に異なる乱数の値を設定
■乱数の設定例:命中率の計算
■乱数の設定例:エンカウントで出現する敵グループを増やす


  
■乱数の基礎

ウディタには「乱数(らんすう)」と言う機能があります。

この乱数を使うと、指定した値の範囲内でコンピュータが1つの値を出力してくれます。

この乱数を使う事で、例えばダメージ量や回復量を「18〜24」などの変動性にしたり、
命中率(攻撃ミス)を処理したり、サイコロを振った時の出目を処理したりと、
様々なランダム性のあるイベントを作る事ができます。



下図は乱数[0〜2]で出力された値をセルフ変数[0]へ代入する時の設定例です。



【イベントコード表示】

■変数操作: このEvのSelf0 = 0 〜 2

上記の設定を実行すると、セルフ変数[0]に「0」「1」「2」のいずれかの値が設定されます。

ランダムなので「1」の次が再び「1」になったり、3回実行しても「1」が出ない事もあります。





【イベントコード表示】

■変数操作: このEvのSelf0〜このEvのSelf1 = 0 〜 2

上記のように複数の変数に乱数の値を設定する場合は、それぞれの変数に異なる値が設定されます。

そのため、
セルフ[0]=2」「セルフ[1]=0」と異なる値になる事もあれば、
セルフ[0]=2」「セルフ[1]=2」と同じ値になる事もあります。

もしも2つの変数に必ず同じ乱数の値を設定したい時には…
【イベントコード表示】

■変数操作: このEvのSelf0 = 0 〜 2
■変数操作: このEvのSelf1 = このEvのSelf0 + 0
と設定してください。



乱数を設定する方法には、イベントコマンド【変数操作】を使う方法の他に、
変数呼び出し値「8000000+乱数の最大値」を使った設定方法もあります。

例えば「8000045」を設定した場合は「0〜45」の間のどれか1つの値が出力されます。

この「8000000+乱数の最大値」は必ず「0」から始まる値で乱数の値の出力されるなど、
使い勝手が悪く、あまり使われる事はありません。

【「8000000+乱数の範囲値」(乱数作成)の説明を見る】


▲トップへ戻る▲


  
■システム変数[110:現在の乱数のシード(種)]について

乱数で出力される値は、システム変数[110:現在の乱数のシード(種)]の値で決まります。



システム変数[110:現在の乱数のシード(種)]の値を固定値にすると、
乱数から出力される値は毎回同じになります。

例えば…
■変数操作: Sys110:現在の乱数のシード(種) = 123456789 + 0
■変数操作: このEvのSelf0 = 1 〜 100
のように、システム変数[110:現在の乱数のシード(種)]の値を「123456789」の固定値にすると、
何度実行しても乱数[1〜100]から出力される値は、必ず「22」になります。



システム変数[110:現在の乱数のシード(種)]の値は、ゲーム起動時乱数を使用した時に変わります。

乱数を1回実行する度にシステム変数[110:現在の乱数のシード(種)]の値が変わるため、
同じ乱数[1〜100]を連続で実行しても、同じ値がずっと出力されるような事はありません。

またシステム変数[110:現在の乱数のシード(種)]の値を「0」にすると、
システム変数[110:現在の乱数のシード(種)]には新たな値が設定されます。



システム変数[110:現在の乱数のシード(種)]の値はセーブデータにセーブされるため、
セーブデータをロードした後に実行される乱数の結果は、同じ値になります。

例えばロード後に乱数[1〜100]を実行した時に「18」だった場合は、
何度ロードしても最初に乱数[1〜100]で出力される値は「18」になります。

もしもロードした時に、異なる値で出力にしたい時には、
コモンイベント[048:X[共]基本システム自動初期化]0行目に以下の設定を追加してください。

【イベントコード表示】

■変数操作: Sys110:現在の乱数のシード(種) = 0 + 0


▲トップへ戻る▲


  
■乱数の設定例:セリフがランダムに変わる

3つのセリフをランダムに表示するマップイベントを設定します。

【イベントコード表示】

■マップイベント「町の人」

起動条件:決定キーで実行
起動条件変数:なし

■変数操作: このEvのSelf0 = 0 〜 2
■条件分岐(変数): 【1】 このEvのSelf0 が 0 と同じ
         【2】 このEvのSelf0 が 1 と同じ
         【3】 このEvのSelf0 が 2 と同じ
-◇分岐: 【1】 [ このEvのSelf0 が 0 と同じ ]の場合↓
|■文章:こんにちは。
|■
-◇分岐: 【2】 [ このEvのSelf0 が 1 と同じ ]の場合↓
|■文章:お元気ですか。
|■
-◇分岐: 【3】 [ このEvのSelf0 が 2 と同じ ]の場合↓
|■文章:今日はいい天気ですね。
|■
◇分岐終了◇



以下は前に表示したセリフとは異なるセリフが表示されるように設定しています。

【イベントコード表示】

■マップイベント「町の人」

起動条件:決定キーで実行
起動条件変数:なし

■変数操作: このEvのSelf0 += 1 〜 2
■変数操作: このEvのSelf0 %= 3 + 0
■条件分岐(変数): 【1】 このEvのSelf0 が 0 と同じ
         【2】 このEvのSelf0 が 1 と同じ
         【3】 このEvのSelf0 が 2 と同じ
-◇分岐: 【1】 [ このEvのSelf0 が 0 と同じ ]の場合↓
|■文章:こんにちは。
|■
-◇分岐: 【2】 [ このEvのSelf0 が 1 と同じ ]の場合↓
|■文章:お元気ですか。
|■
-◇分岐: 【3】 [ このEvのSelf0 が 2 と同じ ]の場合↓
|■文章:今日はいい天気ですね。
|■
◇分岐終了◇

上記設定では、最初は変数の値が「0」なので、
「加算1〜2」によって変数の値が「1」か「2」になります。

仮に変数の値が「2」になった場合、
次にイベントを実行した時には「加算1〜2」によって変数の値は「3」か「4」になりますが、
余剰3(%=3)」によって「3以上の場合は減算3を繰り返す」と言った処理が発動し、
結果的に「3−3=0」または「4−3=1」となって、変数の値は「0」か「1」になります。

これにより「0 → 1 か 2」「1 → 0 か 2」「2 → 0 か 1」となって、
前とは異なるセリフが表示されるようになります。

なお、乱数の範囲を「0〜4」にする場合は…
【イベントコード表示】

■変数操作: このEvのSelf0 += 1 〜 4
■変数操作: このEvのSelf0 %= 5 + 0
と設定してください。



*補足1*

セリフの内容がランダムで変わる仕様は、一見良い設定のように思えますが、
実際には全てのセリフを確認するのに、何度もマップイベントを実行する必要があるため、
プレイヤーにとっては、かなり面倒な仕様になります。

また制作者側としても、複数のセリフを用意してイベントを設定するのに手間がかかる上、
テストプレイの時にも全てのセリフを確認する手間が発生するため、
制作者側としても、かなり面倒な仕様になります。

なお、ランダムで表示されるセリフの中に、ゲームの進行で重要なセリフがある場合は、
プレイヤーが見落としてしまう可能性があります。

またもう一度見たい時には、何度も話しかけないと表示されなくなる可能性があるため、
重要な内容を話すマップイベントには、セリフの内容がランダムで変わる設定はお勧めできません。



*補足2*

宝箱を開けた時に取得できるアイテムがランダムで変わる設定は、1回しか開けられない宝箱の場合は、
中身がランダムに変わっている事がプレイヤーには分からないため、ランダムにする意味がありません。

ダンジョンに入る度に宝箱のアイテムが何回でも取れる場合や周回プレイがある場合は、
同じ宝箱を何度も開ける事になるため、その場合はランダムである意味がありそうですが、
ランダム設定にすると、回復効果が高いアイテムばかりが出たり、
逆に回復効果が低いアイテムばかりが出たりと、出てくるアイテムに偏りが出てしまい、
ゲームの難易度が大きく変わってしまう可能性があります。



*補足3*

「黄色の宝箱=中身がランダム」としたり、
お金を払うと宝箱が開けられる「ガチャ宝箱」を作る場合は、
このランダム設定が有効的に働くと言えます。

但し、セーブしてから宝箱を開け、
良い物が出ない場合はロードしてやり直すと言った不正行為を行う事ができるため、
例えば宝箱の周辺ではセーブができないようにしたり、
ロードしてすぐに開けると最低ランクのアイテムしか出ないようにするような対策が必要になります。



ランダム設定は、必ずしも「ランダム設定がある=良い」と言う訳では無いので、
ランダム設定が必要かどうかをよ〜く考えてから設定した方が良いでしょう。


▲トップへ戻る▲


  
■乱数の設定例:複数の変数に異なる乱数の値を設定

2つの変数に異なる乱数の値を設定したい時には、以下のように設定してください。

【イベントコード表示】

■変数操作: このEvのSelf0 = 0 〜 2
■変数操作: このEvのSelf1 = このEvのSelf0 + 0
■変数操作: このEvのSelf1 += 1 〜 2
■変数操作: このEvのSelf1 %= 3 + 0

上記設定では、セルフ変数[0]が「2」だった場合は、セルフ変数[1]には「0」か「1」が設定されます。



「0」から始まる乱数ではない場合は、以下のように設定してください。

【イベントコード表示】

■変数操作: このEvのSelf0 = 10 〜 12
■変数操作: このEvのSelf1 = このEvのSelf0 + 0
■変数操作: このEvのSelf1 += 1 〜 2
■条件分岐(変数): 【1】 このEvのSelf1 が 13 以上
-◇分岐: 【1】 [ このEvのSelf1 が 13 以上 ]の場合↓
|■変数操作: このEvのSelf1 -= 3 + 0
|■
◇分岐終了◇



■3つの変数に異なる乱数の値を設定


▼乱数が「0」から始まる場合
【イベントコード表示】

■変数操作: このEvのSelf0 = 0 〜 4
■変数操作: このEvのSelf1 = このEvのSelf0 + 0
■変数操作: このEvのSelf1 += 1 〜 4
■変数操作: このEvのSelf1 %= 5 + 0
■変数操作: このEvのSelf2 = 0 〜 2
■条件分岐(変数): 【1】 このEvのSelf0 が このEvのSelf1 未満
-◇分岐: 【1】 [ このEvのSelf0 が このEvのSelf1 未満 ]の場合↓
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf0 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf0 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf1 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf1 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■
-◇上記以外
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf1 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf1 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf0 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf0 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■
◇分岐終了◇

▼乱数が「0」以外から始まる場合(乱数[10〜14])
【イベントコード表示】

■変数操作: このEvのSelf0 = 10 〜 14
■変数操作: このEvのSelf1 = このEvのSelf0 + 0
■変数操作: このEvのSelf1 += 1 〜 4
■条件分岐(変数): 【1】 このEvのSelf1 が 15 以上
-◇分岐: 【1】 [ このEvのSelf1 が 15 以上 ]の場合↓
|■変数操作: このEvのSelf1 -= 5 + 0
|■
◇分岐終了◇
■変数操作: このEvのSelf2 = 10 〜 12
■条件分岐(変数): 【1】 このEvのSelf0 が このEvのSelf1 未満
-◇分岐: 【1】 [ このEvのSelf0 が このEvのSelf1 未満 ]の場合↓
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf0 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf0 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf1 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf1 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■
-◇上記以外
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf1 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf1 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】 このEvのSelf2 が このEvのSelf0 以上
|-◇分岐: 【1】 [ このEvのSelf2 が このEvのSelf0 以上 ]の場合↓
| |■変数操作: このEvのSelf2 += 1 + 0
| |■
|◇分岐終了◇
|■
◇分岐終了◇


異なる乱数の値を設定する変数の数が多い場合は、
以下のページで紹介している処理方法を使うと良いでしょう。

【乱数で一度出力した値を二重に出力させないのページを開く】



■ループ処理について

以下のように…
【イベントコード表示】

■変数操作: このEvのSelf0 = 10 〜 14
■ループ開始
|■変数操作: このEvのSelf1 = 10 〜 14
|■条件分岐(変数): 【1】 このEvのSelf0 が このEvのSelf1 以外
|-◇分岐: 【1】 [ このEvのSelf0 が このEvのSelf1 以外 ]の場合↓
| |■ループ中断
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇
■ループ開始
|■変数操作: このEvのSelf2 = 10 〜 14
|■条件分岐(変数): 【1】 このEvのSelf0 が このEvのSelf2 と同じ
|-◇分岐: 【1】 [ このEvのSelf0 が このEvのSelf2 と同じ ]の場合↓
| |■ループ開始へ戻る
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】 このEvのSelf1 が このEvのSelf2 以外
|-◇分岐: 【1】 [ このEvのSelf1 が このEvのSelf2 以外 ]の場合↓
| |■ループ中断
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇
と言ったループ処理で、異なる値になるまで何度も乱数の処理を繰り返す設定方法がありますが、
この設定方法では運悪く何度も同じ値になってループが繰り返されてしまう事があるため、
処理落ちが発生する可能性があります。

通常では気にするレベルでは無い処理落ちですが、もしも巨大なイベント処理を動かしていて、
出来る限り処理落ちを無くしたい時には、上記のような設定方法はお勧めできません。


▲トップへ戻る▲


  
■乱数の設定例:命中率の計算

基本システムの戦闘の処理では、攻撃が当たったかどうかを判断する処理を、
コモンイベント[165:X[戦]┗単体処理]328行目にある…
■変数操作: CSelf40[成功率] -= 0 〜 99
■条件分岐(変数): 【1】 CSelf40[成功率] が 0 以下 【2】 CSelf40[成功率] が 1 以上
で処理しています。

セルフ変数[40:成功率]には事前に…
攻撃者の命中率 − 攻撃対象者の回避率 = セルフ変数[40:成功率]
と言った数値が設定されており、そのセルフ変数[40:成功率]乱数[0〜99]減算して、
「0以下=攻撃ミス」「1以上=攻撃が当たった」と判断します。

例えば「命中率80%(セルフ変数[40]=80)」だった場合は、
セルフ変数[40:成功率]乱数[0〜99]で減算すると「-19〜80」となり、
「-19〜0=攻撃ミス」「1〜80=攻撃が当たった」と処理されます。



命中率(戦闘中の当たり判定)については、別ページにて詳しく解説しています。

【戦闘処理の当たり判定(命中率)についてのページを見る】


▲トップへ戻る▲


  
■乱数の設定例:エンカウントで出現する敵グループを増やす

ウディタにあるエンカウントの設定では、最大で3グループまでしか設定する事ができません。



しかし乱数を使って複数のコモンイベント[037:◇ランダムエンカウント処理]を設定する事で、
4グループ以上の設定が可能になります。

▼4グループの設定例
【イベントコード表示】

■変数操作: このEvのSelf0 = 1 〜 4
■条件分岐(変数): 【1】 このEvのSelf0 が 3 以下
-◇分岐: 【1】 [ このEvのSelf0 が 3 以下 ]の場合↓
|■イベントの挿入[名]: ["◇ランダムエンカウント処理 "] <コモンEv 37> / 20 /
            0:オオカミx1 / 2:オオカミx2 / 1:コウモリx3

|■
-◇上記以外
|■イベントの挿入[名]: ["◇ランダムエンカウント処理 "] <コモンEv 37> / 20 /
            3:虹色鳥x1 / -1:<なし> / -1:<なし>

|■
◇分岐終了◇

さらに乱数の設定を工夫する事で…
35%=オオカミx1
30%=コウモリx3
20%=オオカミx2
15%=虹色鳥x1

と言ったように、敵グループごとの出現確率を設定する事もできます。

【イベントコード表示】

■変数操作: このEvのSelf0 = 1 〜 100
■条件分岐(変数): 【1】 このEvのSelf0 が 35 以下
         【2】 このEvのSelf0 が 65 以下
         【3】 このEvのSelf0 が 85 以下
-◇分岐: 【1】 [ このEvのSelf0 が 35 以下 ]の場合↓
|■イベントの挿入[名]: ["◇ランダムエンカウント処理 "] <コモンEv 37> / 20 /
            0:オオカミx1 / -1:<なし> / -1:<なし>

|■
-◇分岐: 【2】 [ このEvのSelf0 が 65 以下 ]の場合↓
|■イベントの挿入[名]: ["◇ランダムエンカウント処理 "] <コモンEv 37> / 20 /
            1:コウモリx3 / -1:<なし> / -1:<なし>

|■
-◇分岐: 【3】 [ このEvのSelf0 が 85 以下 ]の場合↓
|■イベントの挿入[名]: ["◇ランダムエンカウント処理 "] <コモンEv 37> / 20 /
            2:オオカミx2 / -1:<なし> / -1:<なし>

|■
-◇上記以外
|■イベントの挿入[名]: ["◇ランダムエンカウント処理 "] <コモンEv 37> / 20 /
            3:虹色鳥x1 / -1:<なし> / -1:<なし>

|■
◇分岐終了◇


▲トップへ戻る▲



◎関連ページ

◆「変数」って何?
┣◆「セルフ変数」って何?
┣◆「通常変数」「予備変数」って何?
┣◆「文字列変数」って何?
┣◆「システム変数」「システム文字列」って何?
┃◆システム変数[0〜34]の説明
┃┣◆システム変数[35〜76]の説明
┃┣◆システム変数[77〜120]の説明
┃┣◆システム変数[121〜148]の説明
┃┣◆システム文字列[0〜49]の説明
┃┗◆システム文字列[50〜76]の説明
┣◆「変数呼び出し値」「X番の変数呼出」って何?
┃┗◆【使用例】「変数呼び出し値」「X番の変数呼出」
┣◆「乱数」って何?
┃┗◆乱数で一度出力した値を二重に出力させない
┗◆変数の番号や文字列を別のものに置き換える

◆戦闘処理の当たり判定(命中率)について

YADOT-WOLFトップ  気紛れな空間へ戻る  メール