パーリンノイズで乱数を生成した方が、乱数の流れがなだらかになるを検証

# パーリンノイズで乱数を生成した方が、乱数の流れがなだらかになるを検証
#### 通常、Unityで乱数を生成するというと`Random.Rangeメソッド`を使用するが、`Mathf.PerlinNoiseメソッド`を使用して乱数を生成する方法もある。
#### 一般的にパーリンノイズの方が、乱数の流れがなだらかになると言われているので、検証する。

---

## 乱数の結果を検証する
### 1.`Random.Rangeメソッド`で乱数を生成する(スクリプト1)
```c#
using UnityEngine;

public class RandomRange : MonoBehaviour
{
    float r; // 乱数を代入する
    float time; // 1秒に1回デバッグするための判定用時間

    void Update()
    {
        time += Time.deltaTime;

        if(time >= 1.0f)
        {
            r = Random.Range(0, 1.0f); // 0~1.0間で乱数を生成

            Debug.Log(r); // 乱数のデバッグ
            time = 0f; // 判定用時間をリセット
        }
    }
}
```

### 2.`Mathf.PerlinNoiseメソッド`で乱数を生成する(スクリプト2)
```c#
using UnityEngine;

public class PerlinNoise : MonoBehaviour
{
    float perlin; // 乱数を代入する
    float time; // パーリンノイズで乱数を生成するときに使用する時間
    float time2; // 1秒に1回デバッグするための判定用時間

    void Update()
    {
        time = Time.time;
        perlin = Mathf.PerlinNoise(time, 0.5f); // 乱数を生成

        time2 += Time.deltaTime;

        if(time2 >= 1.0f)
        {
            Debug.Log(perlin); // 乱数をデバッグ
            time2 = 0f; // 判定用時間をリセット
        }
    }
}
```

### 3.作成したスクリプトを設定する
①ヒエラルキーウィンドウで右クリックして、Create Emptyを選択する。

②作成したオブジェクトに、作成したスクリプト1とスクリプト2をアタッチする。

### 4.それぞれの乱数結果を検証する
①`Random.Rangeメソッド`側の検証をするときは、インスペクターウィンドウのRandomRangeスクリプトのチェックを付けて、PerlinNoiseスクリプトのチェックを外す。下記画像参照↓
![スクリーンショット 2021-11-20 11.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/67611878-4828-ef3e-10cf-a4b3bf71883e.png)


②`Mathf.PerlinNoiseメソッド`側の検証をするときは、インスペクターウィンドウのPerlinNoiseスクリプトのチェックを付けて、RandomRangeスクリプトのチェックを外す。下記画像参照↓
![スクリーンショット 2021-11-20 11.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/607a76a4-178d-3b29-d735-74d3e63501f2.png)


③それぞれの検証結果(各20回分)
#### ・`Random.Rangeメソッド`側
```c#
// 左側の値が結果、右側の値が1つ前の結果との増減値
結果           増減値
0.75473    // 開始
0.2592732  // -0.4954568
0.2881305  // +0.0288573
0.319126   // +0.0309955
0.8364434  // +0.5173174
0.5359501  // -0.3004933
0.6357633  // +0.0998132
0.6846403  // +0.048877
0.4126697  // -0.2719706
0.2564178  // -0.1562519
0.7612495  // +0.5048317
0.7642533  // +0.0030038
0.1702873  // -0.593966
0.6708301  // +0.5005428
0.7082607  // +0.0374306
0.07395113 // -0.63430957
0.21284    // +0.13888887
0.08459044 // -0.12824956
0.3217061  // +0.23711566
0.1771121  // -0.144594
```

#### ・`Mathf.PerlinNoiseメソッド`側
```c#
// 左側の値が結果、右側の値が1つ前の結果との増減値
結果           増減値
0.2859313  // 開始
0.469422   // +0.1834907
0.4680583  // -0.0013637
0.4680427  // -0.0000156
0.6323922  // +0.1643495
0.802561   // +0.1701688
0.6337863  // -0.1687747
0.8012906  // +0.1675043
0.6326183  // -0.1686723
0.2966966  // -0.3359217
0.4652747  // +0.1685781
0.4613115  // -0.0039632
0.4652676  // +0.0039561
0.4705952  // +0.0053276
0.8089857  // +0.3383905
0.465322   // -0.3436637
0.4491483  // -0.0161737
0.4653397  // +0.0161914
0.4558525  // -0.0094872
0.1282207  // -0.3276318
```

④それぞれ、全ての増減値を絶対値に変換して、合計したものから絶対値の平均値を出す。
これにより、本当にパーリンノイズの方が乱数の流れがなだらかなのかが判明する。

`Random.Rangeメソッド`側
絶対値の平均値: 0.2564719

`Mathf.PerlinNoiseメソッド`側
絶対値の平均値: 0.1365066

---

## 結論
#### `Random.Rangeメソッド`と`Mathf.PerlinNoiseメソッド`それぞれの絶対値の平均値から、「パーリンノイズで乱数を生成した方が、乱数の流れがなだらかになる」は正しいと思われる。

---

## 補足
下に絶対値の平均値を計算するために作成したスクリプトを載せる。

```c#
using System.Collections.Generic;
using UnityEngine;

public class AbsoluteValue : MonoBehaviour
{
    public List<float> value; // インスペクターで入力する値
    float total; // 合計値
    float abs; // 絶対値

    void Start()
    {
        Debug.Log(Absolute()); // 絶対値の平均値をコンソールに表示
    }

    public float Absolute()
    {
        for(int i = 0; i < value.Count; i++)
        {
            abs = Mathf.Abs(value[i]); // 増減値を絶対値に変換する
            total += abs; // 絶対値に変換した値を合計値に加算する
        }

        return total / value.Count; // 合計値を検証に使用した増減値の総数で除算した値(絶対値の平均値のこと)を戻り値とする
    }
}
```

### 上記のスクリプトの使用手順
①ヒエラルキーウィンドウで右クリックして、Create Emptyを選択する。

②作成したオブジェクトに上記のスクリプトをアタッチする。

③ヒエラルキーウィンドウで作成したオブジェクトを選択して、インスペクターウィンドウのAbsolute ValueのValueに任意の数値を入力する。

今回は`Random.Rangeメソッド`と`Mathf.PerlinNoiseメソッド`それぞれで、19個の増減値を使用したので、Valueに19と入力する。

④各Elementに19個の増減値を入力する。

⑤シーンビューのプレイボタンをクリックすると、コンソールウィンドウに絶対値の平均値の結果が表示される。下記画像参照↓
![スクリーンショット 2021-11-20 11.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/9f367684-32a0-eccd-7bb0-c23d46e9ea4a.png)


---

#### 上記の手順で今回の検証を試せるので、よろしければスクリプトをコピーして試して見てください。