Random

0~999までの乱数を発生させる。主にAIでよく手軽に用いられる
用例を見る分には%で除算したり()で閉じ1,0を返す等して少ない数値で分離させる使い方がメジャーか?

用例:勝利ポーズの乱数分岐
[State 180, 1]
type = ChangeState
trigger1 = Time = 0
value = 181 + (Random % 2);<-- 剰余算でState 181 + (0 or 1)へChangeStateさせる

用例:1/8の確率で無敵発生(ダンの昇龍拳、当たり及びハズレ判定に)
[State 1000, 2]
type = NotHitBy
trigger1 = Time = 0 && Random % 8 = 0;<-- State 1000に入った直後、乱数が8で割り切れた時
value = SCA;<-- 立屈空の全ての攻撃に対して無敵
time = 10;<-- 無敵継続フレーム数

用例:複数の音声の中から1つランダムで再生する
[State 200, 8]
type = PlaySnd
trigger1 = AnimElem = 4
value = s200,Random % 3;<-- sndファイルで200,0 200,1 200,2に登録されている中から無作為に選ばれる

用例:一定の範囲内にエフェクトを表示する(チョイの杓子等)
[State 1110, 7]
type = Explod
triggerall = NumExplod(1110) = 0;<-- IDが1110のExplodが存在しない場合
triggerall = MoveHit && Time <= 7
trigger1 = Random % 8 <= 6;<-- 6/8(75%)の確率でExplodを表示
postype = p2;<-- 相手の軸を基準にする
pos = (Random % 60) - 30,((Random % 42)+30) * -1;<-- X軸は0~59の乱数-30で-30~29、同様にY軸は-72~-30の範囲内
anim = 7300 + (Random % 2);<-- Anim 7300, 7301のどちらか
sprpriority = 7;<-- 描画優先度
persistent = 0;<-- 判定を繰り返さない
id = 1110;<-- ExplodのID

こちらの乱数は1F毎に変わる上に記述毎にも変化するものであるため
random<500とrandom>=500の記述を並べても両方満たす事も満たさない事もある(割と重要)
そのような目的で同一フレーム上での分岐を行いたい際はvarrandom等で変数に格納するか
IfElse等で同一記述内で分岐させるといった事が必要になってくる

また毎フレームで判定がコロコロ変わっている都合上
AIでよく使うと思われるが特定の数値に即なる事もあれば一生ならない事もある
ただrandomの値が200を超えてくるとほぼ最速気味で出る事が多いので
(一秒感に60回も判定してますからそりゃね、いくら数Fコンマが重要な格ゲーの世界とはいえ)
単純に100×AIlevelで最大時に1000で100%、超反応!
といった処理はあんまり良い調整であるとは言い難いが(半分にしても十分超反応である)

また記述の度に判定しているので
trigger1 = random<=200&&random>=800
こういうのも1を返す事があるため
AIの調整を行う時に二重でrandomをかける(上記のAILv判定やrandom>life等)
というのもシンプルな調整としては有効に使える

タグ:

☆基礎知識
+ タグ編集
  • タグ:
  • ☆基礎知識
最終更新:2025年06月29日 19:50