この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-12 15:16:36

タイトル: Blueprintで指定した確率で処理を分岐させる方法
SEOタイトル: UE5ブループリントで指定した確率で処理を分岐させる方法

Unreal Engine 5(UE5)のBlueprintで指定した確率(例:30%)で処理を分岐させるには、Random Float in Rangeで0.0〜1.0の乱数を取得し、その値を閾値と比較してBranchで分岐させるのが基本です。確率がそのまま閾値(30%なら0.3)になるため直感的に扱え、もっと手軽に行いたい場合は確率値(0〜1)を直接渡せるRandom Bool with Weightを使う方法もあります。この記事では、両方のやり方と複数分岐・再現性の確保・つまずきやすい点までをまとめます。

この記事の要点
  • 基本形:Random Float in Range(0.0〜1.0)の出力をBranchの条件で閾値と比較する。30%なら「乱数 < 0.3」がTrueの分岐になる。
  • 手軽な代替:Random Bool with Weightは確率(0〜1)を直接渡すだけでTrue/Falseを返すため、単純な確率判定に向く。
  • 複数分岐:閾値を累積させて段階的にBranchを並べるか、Random Integer in Rangeと組み合わせてSwitchで振り分ける。
  • 再現性:同じ結果を再現したいときはRandom Streamを使い、シードを固定して乱数列をコントロールする。
  • 注意点:境界値(等号の扱い)、毎フレーム評価による意図しない再抽選、確率の合計が100%になっているかを確認する。

1. 確率分岐の基本的な考え方

「指定した確率で分岐させる」とは、ある一定の割合でTrue側(処理A)に、残りの割合でFalse側(処理B)に進ませる、という意味です。UE5のBlueprintには確率を直接設定する専用ノードはありませんが、0.0〜1.0の範囲の一様乱数を使えば簡単に表現できます。

0.0以上1.0未満の乱数は、どの値も等しい確率で出ます。そのため、たとえば「乱数が0.3未満かどうか」を判定すると、おおよそ30%の確率でTrueになります。この性質を利用して、確率値をそのまま閾値(しきい値)として比較すれば、狙った確率での分岐が作れます。

やりたいこと向いているノード特徴
確率を閾値で細かく制御したい・複数分岐に発展させたいRandom Float in Range + Branch乱数値が見えるので応用が利く。複数分岐や条件の組み合わせに展開しやすい。
True/Falseの2択を手早く作りたいRandom Bool with Weight確率(0〜1)を1つ渡すだけでBool(True/False)が返る。記述がシンプル。
毎回同じ結果を再現したい・デバッグやリプレイ用途Random Stream系(From Stream)シードを固定すると同じ乱数列が得られ、結果を再現できる。

2. Random Float in Range と Branch で分岐する(基本形)

まずは最も応用の利く基本形です。ここでは「30%でレアドロップ、70%で通常ドロップ」を例にします。

2-1. ノード構成と手順

  1. 処理の起点となるイベント(任意のイベントや関数呼び出し)を用意します。
  2. Random Float in Rangeノードを配置し、Minに「0.0」、Maxに「1.0」を設定します。
  3. Branchノードを配置します。
  4. Random Float in Rangeの出力(Return Value)と「0.3」をLess(<)ノードで比較し、その結果(Bool)をBranchのConditionに接続します。
  5. BranchのTrue側にレアドロップ処理、False側に通常ドロップ処理をつなぎます。

「乱数 < 0.3」がTrueになる確率はおよそ30%なので、結果として30%でレアドロップ、70%で通常ドロップという分岐になります。確率を変えたいときは、この閾値だけを書き換えます。50%なら0.5、10%なら0.1です。

// 疑似コードで表すと以下のイメージ

Float Roll = RandomFloatInRange(0.0, 1.0);

Branch( Roll < 0.3 )

  True  -> レアドロップ処理(約30%)

  False -> 通常ドロップ処理(約70%)

2-2. パーセント表記で書きたい場合

「0.3」という小数ではなく「30」というパーセントで考えたい場合は、乱数の範囲を0.0〜100.0にして「乱数 < 30.0」と比較しても同じ結果になります。チーム内で確率をパーセントで管理しているなら、この方が分かりやすいことがあります。どちらでも構いませんが、範囲(Max)と閾値の基準(1.0なのか100.0なのか)を必ずそろえてください。

3. Random Bool with Weight を使う(手軽な代替)

2択の分岐をもっと簡潔に書きたい場合は、Random Bool with Weightノードが便利です。このノードはWeight(重み)として確率を1つ受け取り、その確率に応じてBool(True/False)を返します。

たとえばWeightに「0.3」を渡すと、おおよそ30%の確率でTrueが返ります。返ってきたBoolをそのままBranchのConditionに接続すれば、Random Float in Range+比較ノードを使う構成と同等の分岐になります。乱数の取得と比較を1ノードにまとめられるため、単純な確率判定ではグラフがすっきりします。

Bool Hit = RandomBoolWithWeight( Weight = 0.3 );

Branch( Hit )

  True  -> 処理A(約30%)

  False -> 処理B(約70%)

Weightには0〜1の値を指定します(0でほぼ常にFalse、1でほぼ常にTrue)。確率を変数で持っておき、ゲーム内のバランス調整やレベルに応じて動的に変えたい場合にも扱いやすい構成です。なお、ノードごとの返り値の細かな仕様や境界の扱いはエンジンのバージョンで差が出ることがあるため、厳密な値が必要なときは利用中バージョンの公式ドキュメントもあわせて確認してください。

4. 3つ以上に分岐させる(複数分岐)

「10%で処理A、30%で処理B、60%で処理C」のように3択以上へ分けたい場合は、閾値を累積(足し上げ)して考えるのがポイントです。区間で割り当てると次のようになります。

乱数(Roll, 0.0〜1.0)の範囲割り当てる処理確率
0.0 以上 0.1 未満処理A10%
0.1 以上 0.4 未満処理B30%
0.4 以上 1.0 未満処理C60%

4-1. Branchを段階的につなぐ方法

Random Float in Rangeで取得した乱数(Roll)を1つ用意し、Branchを直列に並べます。同じ乱数を使い回すのが重要で、各分岐ごとに乱数を取り直すと確率がずれてしまいます。

Float Roll = RandomFloatInRange(0.0, 1.0);  // 乱数は1回だけ取得

Branch( Roll < 0.1 )

  True  -> 処理A

  False -> Branch( Roll < 0.4 )

         True  -> 処理B

         False -> 処理C

4-2. Switchで振り分ける方法

各選択肢の確率が等しい(例:3択をそれぞれ約33%)場合は、Random Integer in Rangeで0〜2の整数を取得し、Switch on Intで0・1・2に振り分けると簡潔です。等確率でない重み付き抽選を整数ベースで行いたい場合は、各選択肢の重みを合計した範囲の乱数を取り、累積値と比較して該当インデックスを求める方法(重み付き抽選)が一般的です。選択肢が多くなるほど、この配列+ループ方式のほうが管理しやすくなります。

5. 同じ結果を再現したいときは Random Stream

通常の乱数ノードは実行のたびに異なる結果を返します。一方で、リプレイ・デバッグ・マルチプレイでの同期など「毎回まったく同じ乱数列がほしい」ケースでは、Random Stream(ランダムストリーム)を使います。

Random Streamはシード(種となる数値)を持つ乱数生成器で、シードが同じなら同じ順番でまったく同じ乱数列を生成します。Blueprintでは型として「Random Stream」の変数を用意し、Random Float in Range from StreamRandom Integer in Range from Streamといった「from Stream」版のノードに渡して使います。シードはあらかじめ一度設定すれば、その後はストリームが内部状態を進めながら乱数列を返します。

// 同じシードなら毎回同じ Roll の並びになる

RandomStream Stream; // 変数として保持

Stream.Initialize(Seed); // シードを固定

Float Roll = RandomFloatInRangeFromStream(0.0, 1.0, Stream);

Branch( Roll < 0.3 ) ...

シードを固定すると確率検証やバグ再現がしやすくなります。逆に毎プレイでランダム性を出したい本番では、起動時などにシードを変化させる運用にします。

6. 具体例:アイテムのドロップ率を実装する

確率分岐の典型例が、敵を倒したときのアイテムドロップです。「5%でレア、25%でアンコモン、70%でコモン(またはドロップなし)」のような設計を、これまでの方法で組み立てられます。

  • 敵の撃破イベントで Random Float in Range(0.0〜1.0)を1回取得する。
  • 「Roll < 0.05」でレア、「Roll < 0.30」でアンコモン、それ以外でコモン、と累積閾値で段階分岐する。
  • ドロップ率を変数(Float)にしておけば、難易度やイベント期間中のドロップアップなどで動的に調整できる。

同じ仕組みで、強敵の出現抽選、ランダムイベントの発生、攻撃のクリティカル判定なども実装できます。いずれも「乱数を1回取得して閾値と比較する」という共通の型で考えると、設計が安定します。

7. つまずきやすい落とし穴

落とし穴内容と対策
境界値(等号)の扱い「<(未満)」と「<=(以下)」のどちらを使うかで確率がわずかにずれます。区間が重ならないよう、複数分岐では基準(例:すべて「未満」)をそろえてください。
毎フレーム評価による再抽選TickやUpdate内に乱数取得を置くと毎フレーム引き直され、意図せず何度も当たり判定が走ります。「1回だけ判定したい」場合はイベント発生時のみ実行する設計にします。
乱数を複数回取得してしまう複数分岐で各Branchごとに乱数を取り直すと、確率配分が崩れます。乱数は1回取得し、その値を使い回してください。
確率の合計が100%になっていない複数分岐の確率(または重み)の合計が想定とずれていると、特定の選択肢が出にくい・出すぎる原因になります。設計時に合計を必ず確認します。
短期的な偏りを「バグ」と誤認する乱数は試行回数が少ないと偏って見えます。30%でも数回連続で外れることはあり得ます。確率が正しいかは多数回の試行で確認してください。

8. よくある質問(FAQ)

Q1. Random Float in Range と Random Bool with Weight、どちらを使うべきですか?

単純な2択(当たり/外れ)なら、確率を直接渡せるRandom Bool with Weightが簡潔です。一方、3択以上に発展させたい、乱数値自体を別の処理にも使いたい、閾値を細かく制御したいといった場合は、乱数が値として見えるRandom Float in Range+Branchのほうが応用が利きます。

Q2. 「30%」と設定したのに、体感では当たりすぎる・外れすぎるのですが?

多くは試行回数の少なさによる偶然の偏りです。確率は十分な回数を試して初めて設定値に近づきます。閾値の比較方向(未満/以下)や、毎フレーム引き直していないか、複数分岐で乱数を使い回しているかも合わせて確認してください。検証だけ確実に行いたいときは、シードを固定したRandom Streamで同じ条件を再現すると原因を切り分けやすくなります。

Q3. ボスだけは「絶対にレアを落とす」など、確率を例外的に変えたいです。

ドロップ率を変数(Float)として持たせ、対象に応じてその値を差し替えるのがおすすめです。たとえば通常敵は0.05、ボスは1.0(=必ず)といったように、同じ分岐ロジックのまま閾値や重みだけを変えれば、コードを分けずに例外を表現できます。