ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity学習#28-1 乱数の生成 (Unity 2019.4.4f1)

ランダムエンカウントで使用する乱数について調べた内容をまとめます。


Unityで使用される乱数はXorShiftを使用している?XORとSHIFTだけで計算するため軽量、かつ一周するまでに2128-1のため周期性を予測されにくいといわれています。

(参考にしたサイト)
techblog.kayac.com

インターフェース

using UnityEngine;

機能 定義ラベル
初期化 void Random.InitState (int seed)
範囲指定出力 float Random.Range (float min, float max)
出力 float Random.value

static のため、マルチスレッドで使用禁止のようです。

※なお、Randomクラスは、System.Random と UnityEngine.Randomがあります。Systemをincludeする場合は、UnityEngine.Randamで呼びます。

乱数の値

(1) 再現性があるか→ある(Unity公式にも記載ありました)
(2) シード値から乱数傾向を容易に予測できないか→できない

再現性

いくつかのシード値で10回乱数を振り出した時の値を確認しました。

seed 1 2 3 4 5 6 7 8 9 10
255 0.43 0.99 0.81 0.02 0.22 0.15 0.35 0.19 0.34 0.33
254 0.97 0.86 0.82 0.36 0.44 0.32 0.55 0.01 0.81 0.66
1 1.00 0.77 0.68 0.46 0.59 0.78 0.91 0.14 0.26 0.56
0 0.58 0.58 0.67 0.77 0.31 0.65 0.65 0.50 0.28 0.13

(Random.value の値をログ出力したもの)

※シード値が同じであれば、毎回上記の順に出力されます(上記の表は小数点2桁で丸めてあります)

予測可能性

先ほどの乱数をシード値ごとにグラフ化しました。10回程度では何とも言えませんが、シード値で乱数の傾向を予想することは難しいのではないかと思います。

f:id:tomo_mana:20210217235142p:plain
seed値ごとの乱数

(以上)