RPGツクール2000/スイッチ・変数【サイトトップへ戻る】
■複数の変数へ重ならない乱数の値を設定する
(更新:2022/11/03)


ショートカット
■重ならない乱数とは?
■2つの変数の値を重ならないようにする
■4つの変数の値を重ならないようにする
■1〜10の値を10個の変数に重ならないように設定する


  
■重ならない乱数とは?

複数の変数番号へまとめて乱数の値を設定する場合…
◆変数の操作:[0001〜0004]代入,乱数[5〜20]
と言った設定を行うと…
変数0001番=5
変数0002番=8
変数0003番=17
変数0004番=11

などと、1つのイベント設定で複数の変数番号に異なる値で設定する事ができます。

しかし上記の設定では…
変数0001番=7
変数0002番=10
変数0003番=10
変数0004番=7

などと同じ値が重なってしまう事があります。

このページでは、他の変数と値が重ならないようにする乱数の設定方法を紹介します。


▲トップへ戻る▲


  
■2つの変数の値を重ならないようにする

変数0001番と変数0002番に「5〜20」の乱数の設定を行い、
変数0001番と変数0002番の値が重ならないように設定します。

◆変数の操作:[0001]代入,乱数[5〜20]
◆変数の操作:[0002]代入,変数[0001]の値
◆変数の操作:[0002]加算,乱数[1〜15]
◆条件分岐:変数[0002]が21以上
 ◆変数の操作:[0002]減算,16
 ◆
:分岐終了



基本的に上記の設定方法で問題無いですが、
一応条件分岐を使わない設定方法も紹介しておきます。

◆変数の操作:[0001]代入,乱数[0〜15]
◆変数の操作:[0002]代入,変数[0001]の値
◆変数の操作:[0002]加算,乱数[1〜15]
◆変数の操作:[0002]剰余,16
◆変数の操作:[0001〜0002]加算,5

こちらの設定方法の場合、例えば…
「変数0001と0004の値が重ならない」
「変数0002と0005の値が重ならない」
「変数0003と0006の値が重ならない」
と言った設定を行いたい時に…
◆変数の操作:[0001〜0003]代入,乱数[0〜15]
◆変数の操作:[0004]代入,変数[0001]の値
◆変数の操作:[0005]代入,変数[0002]の値
◆変数の操作:[0006]代入,変数[0003]の値
◆変数の操作:[0004〜0006]加算,乱数[1〜15]
◆変数の操作:[0004〜0006]剰余,16
◆変数の操作:[0001〜0006]加算,5
と一括で処理する事ができます。

ループ処理などの処理落ち対策で、出来る限り設定を処理の負担を軽減したい時には、
このような設定方法が有効になる事があります。


▲トップへ戻る▲


  
■4つの変数の値を重ならないようにする

変数0001番〜変数0004番に「5〜20」の乱数の設定を行い、
変数0001番〜変数0004番の値は重ならないようにします。

◆変数の操作:[0001]代入,乱数[0〜15]
◆ラベルの設定:1番
◆変数の操作:[0002〜0004]代入,変数[0001]の値
◆変数の操作:[0002〜0004]加算,乱数[1〜15]
◆変数の操作:[0002〜0004]剰余,16
◆条件分岐:変数[0002]がV[0003]と同値<同じ値である時
 ◆指定ラベルへ飛ぶ:1番
 ◆
:分岐終了
◆条件分岐:変数[0002]がV[0004]と同値<同じ値である時
 ◆指定ラベルへ飛ぶ:1番
 ◆
:分岐終了
◆条件分岐:変数[0003]がV[0004]と同値<同じ値である時
 ◆指定ラベルへ飛ぶ:1番
 ◆
:分岐終了
◆変数の操作:[0001〜0004]加算,5
<5〜20になるように値を加算します


▲トップへ戻る▲


  
■1〜10の値を10個の変数に重ならないように設定する

「1〜10」の値を10個の変数(変数[0101〜0110])に設定します。



今回のイベント処理では、
イベントコマンド:変数の操作の変数〜の番号の変数を使っている関係で、
かなり難解な処理になっています。

しかし上記の■4つの変数の値を重ならないようにするとは異なり、
値が重なったら乱数の設定をやり直すと言った処理が無いため、
10個の変数に効率良く「1〜10」の値を割り振る事ができます。

応用次第では「1〜50」「1〜100」などの設定もできます。

なお、処理の構造上、連番の数字を設定する処理になります。



使用する変数は以下の通りです。
変数0001〜0004番=乱数や変数番号の設定に使用。
変数0101〜0110番=1〜10の値(処理結果)を設定。
変数0201〜0210番
=変数の呼び出し番号として[101〜110]の値を保存。



変数の操作の設定には「V」が付いている設定と付いていない設定があるので、
注意して設定してください。

◆変数の操作:[0002:変数番号]代入,201<変数[0201]に代入する準備
◆変数の操作:[0003:設定する値]代入,101<変数[0201〜0210]に設定する変数番号(101〜110)の初期値
◆ラベルの設定:1番
◆変数の操作:[V[0002]]代入,変数[0003]の値<変数[0201〜0210]に変数番号(101〜110)を設定
◆条件分岐:変数[0002:変数番号]が210より小さい<まだ設定する変数番号(101〜110)がある時
 ◆変数の操作:[0002〜0003]加算,1<次の変数番号にする
 ◆指定ラベルへ飛ぶ:1番
 ◆
:分岐終了
◆変数の操作:[0003:設定する値]代入,1<設定する値(1〜10)の最小値
◆変数の操作:[0004:剰余の値]代入,10<設定する値の数
◆ラベルの設定:2番
◆変数の操作:[0001:乱数]代入,乱数[0〜999999]<乱数を作成
◆変数の操作:[0001:乱数]剰余,変数[0004]の値<剰余で乱数の範囲を絞る
◆変数の操作:[0001:乱数]加算,201<変数[0201〜0210]になるように加算
◆変数の操作:[0002:変数番号]代入,変数[V[0001]]の値<変数[0201〜0210]の値(101〜110)を呼び出す
◆変数の操作:[V[0002]]代入,変数[0003]の値<変数[0101〜0110]に設定する値(1〜10)を設定
◆条件分岐:変数[0004:剰余の値]が2以上<まだ設定する値が残っている時
 ◆変数の操作:[0004:剰余の値]加算,200<未使用の変数[0201〜0210]の中で最も大きい変数番号にする
 ◆変数の操作:[V[0001]]代入,変数[V[0004]]の値<使用した値(101〜110)を未使用の値で上書き
 ◆変数の操作:[0004:剰余の値]減算,201<剰余の値を元に戻す&「減算1」を設定
 ◆変数の操作:[0003:設定する値]加算,1<設定する値(1〜10)を次の値にする
 ◆指定ラベルへ飛ぶ:2番
 ◆
:分岐終了
◆



■処理構造の解説

まずラベル1のループ処理で、変数[0201〜0210]に「101〜110」の値を設定します。
この「101〜110」は変数[0101〜0110]を呼び出す時に使います。

変数[0201〜0210]の値
変数番号 値
0201 101
0202 102
0203 103
0204 104
0205 105
0206 106
0207 107
0208 108
0209 109
0210 110



ラベル2からの処理では、「1〜10」の値を変数[0101〜0110]に設定していく処理を行います。

◆変数の操作:[0001:乱数]代入,乱数[0〜999999]
この処理で変数[0001:乱数]に「0〜999999」の値のいずれかが代入されます。

◆変数の操作:[0001:乱数]剰余,変数[0004]の値
この処理では、変数[0004:剰余の値]に「10」が設定されているため、
剰余の処理により、変数[0001:乱数]の値は「0〜9」になります。

◆変数の操作:[0001:乱数]加算,201
この処理で変数[0001:乱数]の値は「0〜9」から「201〜210」になり、
この変数[0001:乱数]の値が変数[0201〜0210]を呼び出す変数番号になります。

◆変数の操作:[0002:変数番号]代入,変数[V[0001]]の値
◆変数の操作:[V[0002]]代入,変数[0003]の値
この処理で変数[0001:乱数]に保存された[0201〜0210]の値を使って変数[0201〜0210]を呼び出し、
変数[0201〜0210]保存されている値(0101〜0110)を変数[0002:変数番号]に代入。
そして変数[0002:変数番号]に保存された変数番号(0101〜0110)を使って、
変数[0003:設定する値]に保存されている値「1」を設定します。

例えば変数[0001:乱数]の値が「203」の場合は、
変数203番に保存された値「103」が呼び出されます。
そして呼び出された「103」の変数番号(変数103番)に「1」が代入されます。

変数[0001]が「203」
変数[0201〜0210]の値
変数番号 値
0201 101
0202 102
0203 103
0204 104
0205 105
0206 106
0207 107
0208 108
0209 109
0210 110
変数[0101〜0110]の値
変数番号 値
0101 0
0102 0
0103 1
0104 0
0105 0
0106 0
0107 0
0108 0
0109 0
0110 0



まだ設定する値が残っている場合は条件分岐で分岐し、
使用済みの変数[0201〜0210]の値に、
未使用の変数[0201〜0210]の値を上書きする処理を実行します。

例えば変数[0203]の値を使用した場合は、変数[0210]の値を変数[0203]に設定します。

変数番号 値
0201 101
0202 102
0203 使用済み
0204 104
0205 105
0206 106
0207 107
0208 108
0209 109
02010 110
変数番号 値
0201 101
0202 102
0203 110
0204 104
0205 105
0206 106
0207 107
0208 108
0209 109
0210 変数[0203]に移動



◆変数の操作:[0004:剰余の値]減算,201
◆変数の操作:[0003:設定する値]加算,1
この処理で変数[0004:剰余の値]の値を「10」から「9」に変更し、
変数[0003:設定する値]の値を「1」から「2」に変更します。



ラベル2へ戻り、次に「2」の値を変数[0101〜0110]に設定する処理を実行します。

◆変数の操作:[0001:乱数]代入,乱数[0〜999999]
この処理で変数[0001:乱数]に「0〜999999」の値のいずれかが代入されます。

◆変数の操作:[0001:乱数]剰余,変数[0004]の値
この処理では、変数[0004:剰余の値]に「9」が設定されているため、
剰余の処理により、変数[0001:乱数]の値は「0〜8」になります。

◆変数の操作:[0001:乱数]加算,201
この処理で変数[0001:乱数]の値は「0〜8」から「201〜209」になり、
この変数[0001:乱数]の値が変数[0201〜0209]を呼び出す変数番号になります。

仮に変数[0001:乱数]の値が「205」の場合は、
変数203番に保存された値「105」が呼び出されます。
そして呼び出された「105」の変数番号(変数105番)に「2」が設定されます。

変数001番が「205」
変数[0201〜0210]の値
変数番号 値
0201 101
0202 102
0203 110
0204 104
0205 105
0206 106
0207 107
0208 108
0209 109
0210  
変数[0101〜0110]の値
変数番号 値
0101 0
0102 0
0103 1
0104 0
0105 2
0106 0
0107 0
0108 0
0109 0
0110 0



そして条件分岐で分岐し、値を使用した変数[0205]に変数[0209]の値を設定します。

変数番号 値
0201 101
0202 102
0203 110
0204 104
0205 使用済み
0206 106
0207 107
0208 108
0209 109
02010  
変数番号 値
0201 101
0202 102
0203 110
0204 104
0205 109
0206 106
0207 107
0208 108
0209 変数[0205]に移動
0210  



この処理を繰り返していくと…
変数[0101〜0110]の値
変数番号 値
0101 7
0102 10
0103 1
0104 6
0105 2
0106 5
0107 9
0108 3
0109 8
0110 4
と言った感じに「1〜10」の値が1つずつ、変数[0101〜0110]の中に設定されます。


▲トップへ戻る▲



◎関連ページ

●「変数」って何?
●「乱数」って何?
●「剰余」って何?
●イベントコマンド:変数の操作
┗○変数〜の番号の変数

YADOTトップ  このサイトは何?  気紛れな空間へ戻る  メール