この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: 数値をランダムで出力する方法
SEOタイトル: UE Blueprint 乱数生成完全ガイド(Random Float in Range/Random Stream/C++ FMath)

この記事の要点
  • Random Float in Range / Random Integer in Range が定番。最大値は含まれる
  • 0〜1 の floatRandom Float真偽Random Bool
  • 再現性が必要なら Random Stream(Seed 指定)
  • ベクトル: Random Unit Vector/角度: Random Rotator
  • C++ 側は FMath::RandRangeFRandomStream。乱数の偏り対策に重み付き抽選も

定番の乱数ノード

ノード戻り値範囲
Random Floatfloat0.0 〜 1.0
Random Float in RangefloatMin 〜 Max(両端含む)
Random Integerint0 〜 Max-1
Random Integer in RangeintMin 〜 Max(両端含む)
Random Boolbooltrue/false 1/2 ずつ
Random Unit VectorVector単位球面上の方向
Random RotatorRotator3 軸ランダム回転
Random Point in Bounding BoxVectorAABB 内のランダム位置

使用例: ダメージ揺らぎ

EventGraph:
  Calculate Damage:
    BaseDamage (50)
      ↓
    Random Float in Range (0.9, 1.1)  ← ±10% 揺らぎ
      ↓ Multiply
    FinalDamage → Apply Damage

配列からランダム選択

SelectRandomFromArray:
  MyArray
    → Length → Subtract 1 → Max
  Random Integer in Range (0, Max)
    → Get (a copy) from MyArray
  Return RandomElement

注: 配列が空のとき Random Integer の Max が -1 になり例外
→ Length > 0 を IsValid 的に分岐

Random Stream(再現可能な乱数)

同じ Seed なら毎回同じ系列を返すシード乱数を使うと、リプレイや手続き生成で「同じシードなら同じマップが出る」を実現できます。

変数として Random Stream を持つ:
  Variable: MyStream (Random Stream)

BeginPlay:
  Set Random Stream Seed (MyStream, Seed=12345)

Tick / 必要時:
  Random Float in Range from Stream (MyStream, 0, 100)
  Random Integer in Range from Stream (MyStream, 0, 5)

シード固定:
  ・常に同じシード → 全プレイで同じ結果
  ・GameStartTime をシードに → 起動ごとに違うが復元可能

C++ 側

#include "Math/RandomStream.h"

FRandomStream Stream(12345);
int32 v = Stream.RandRange(1, 6);          // 1〜6
float f = Stream.FRandRange(0.f, 100.f);
FVector dir = Stream.GetUnitVector();

// 単発で良ければ FMath
int32 a = FMath::RandRange(1, 6);
float b = FMath::FRandRange(0.f, 1.f);

重み付き抽選

ガチャやドロップで「レア 5% / コモン 95%」のような確率を出したい場合:

Random Float in Range (0, 100) → R

If R < 5  → Rare
Else if R < 20 → Uncommon
Else → Common

あるいは配列+重み版:

// C++: 重み付き選択
struct FLoot { FName Id; float Weight; };
TArray Table = {
    {"Sword",  10.f},
    {"Potion", 30.f},
    {"Gold",   60.f},
};
float Total = 0; for (auto& l : Table) Total += l.Weight;
float Rnd = FMath::FRandRange(0.f, Total);
for (auto& l : Table) {
    if ((Rnd -= l.Weight) <= 0.f) { /* l.Id を抽選 */ break; }
}

ガチャの偏り(小さい N 試行)

確率 5% でも 100 試行中ぴったり 5 回出るわけではありません。短いプレイ時間では偏りが目立つため、ゲーム性によっては天井(N 回でレア確定)を導入します。

PseudoCode(天井つき抽選):
  if 連続外れ回数 >= 50:
      → Rare 確定
  else:
      → Random Float (0,1) < 0.05 → Rare

ノイズと乱数の使い分け

用途関数備考
無関係なバラつきRandom ノード独立試行
地形・テクスチャの滑らかなランダムPerlin Noise / Simplex Noise近傍は近い値
再現性のある乱数Random Stream + Seedマップ生成
分布制御(正規分布など)2 つの Random を組み合わせ(Box-Muller)偏りの中央化

サンプル: 弾を扇状にバラまく

SpawnBullet:
  Player Forward Vector
    ↓
  Random Float in Range (-15, 15) → Yaw 偏差
  Random Float in Range (-5, 5)   → Pitch 偏差
    ↓ Compose Rotator
  Add to ForwardRotation
    ↓
  Spawn Bullet at MuzzleLocation, Rotation=above

パフォーマンスと品質

  • Blueprint の Random はメルセンヌツイスタ相当の品質。暗号用途には不可
  • 毎フレーム数十回 Random しても重くない
  • シード固定で再現したいなら必ず Random Stream 経由(FMath::Rand はグローバル状態)

FAQ

Q: Random Integer in Range (0, 5) は 5 を含む?
A: 含みます。0/1/2/3/4/5 の 6 通り。C++ の FMath::RandRange も同様。

Q: 起動するたびに同じ乱数になる
A: シードが固定されていませんか? Random Stream の Seed を 0 や同じ値で初期化していると同じ系列になります。FDateTime::Now().GetTicks() を使うなど工夫を。

Q: 同じ値が連続して気になる
A: 完全独立試行なので連続することはあります。気になるなら「前回と同じなら再抽選」「シャッフル方式」を採用してください。