「なんでもいいからランダムな数をくれ」ってやってたら痛い目を見たのでログ。
何をしようとしたか
C# の Random のノリと勢いで、UnityEngine の Random 使おうとしました。
で Unity のリファレンスで Random を開くところまではよかったのですが、
英文に拒否反応+ ページ上部の “max [inclusive]” という文が目に入って、
「max も含まれるのか~」と超勘違いをした模様。。
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
となったのでした。。
とりあえず検証のために、まずは C# の Random サンプリング。
// System パッケージに含まれる Random
List<int> csSample = new List<int>();
System.Random csRandom = new System.Random();
for (int i = 0; i <= 100; i++)
{
csSample.Add(csRandom.Next(10));
}
Debug.Log("(new System.Random()).Next(10) ... Max: " + csSample.Max());
続いて UnityEngine の Random サンプリング。
// UnityEngine パッケージに含まれる Random に、範囲として int を指定
List<int> uniSampleByInt = new List<int>();
for (int i = 0; i <= 100; i++)
{
uniSampleByInt.Add(UnityEngine.Random.Range(1, 10));
}
Debug.Log("UnityEngine.Random.Range(1, 10) ... Max: " + uniSampleByInt.Max());
// UnityEngine パッケージに含まれる Random に、範囲として float を指定
List<float> uniSampleByFloat = new List<float>();
for (int i = 0; i <= 100000; i++) // float の有効桁数はそこそこ多い...
{
uniSampleByFloat.Add(UnityEngine.Random.Range(0f, 1f));
}
Debug.Log("UnityEngine.Random.Range(0f, 1f) ... Max: " + uniSampleByFloat.Max());
で結果はこの通り。
int … 9 まで。
float … 1まで。
まとめ
Return a random float number between
Random.Rangemin
[inclusive] andmax
[inclusive] (Read Only).
Return a random integer number betweenmin
[inclusive] andmax
[exclusive] (Read Only).
ね。
「ドキュメント目で見たら良いってものじゃない!」って話ですね。
面倒なことすっ飛ばして成果得たいじゃん!
という、万年3流エンジニア代表の言い訳。
何事も経験。
ということで Unity でゲーム作ってみています。
過去に C# 触ったことがあるのですが、
ここ数年触ってなかった、かつ Unity でメジャーな開発言語っぽいので C# で進めています。
RPGツクールすらまともに完成させたことないのに、何か結果だせるかなんて不明です。。
コメント