その乱数、限界値チェックした?~ UnityEngine.Randam の乱数生成 ~

「なんでもいいからランダムな数をくれ」ってやってたら痛い目を見たのでログ。

何をしようとしたか

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 min [inclusive] and max [inclusive] (Read Only).
Return a random integer number between min [inclusive] and max [exclusive] (Read Only).

Random.Range

ね。
「ドキュメント目で見たら良いってものじゃない!」って話ですね。

面倒なことすっ飛ばして成果得たいじゃん!
という、万年3流エンジニア代表の言い訳。

何事も経験。
ということで Unity でゲーム作ってみています。

過去に C# 触ったことがあるのですが、
ここ数年触ってなかった、かつ Unity でメジャーな開発言語っぽいので C# で進めています。

RPGツクールすらまともに完成させたことないのに、何か結果だせるかなんて不明です。。

コメント

タイトルとURLをコピーしました