以下の内容はhttps://hacchi-man.hatenablog.com/entry/2022/12/28/220000より取得しました。


【Unity】Random.InitState してからの乱数は偏るのか調査

youtu.be

上記のYoutube でも言われているように、連続したシードによって乱数を生成すると偏りが出てしまうようなので調査してみました

固定しない乱数

まずは毎回シードを固定化せずに生成しています

        for (var x = 0; x < size; x++)
        {
            for (var y = 0; y < size; y++)
            {
                var color = Random.Range(0, 2) == 0 ? Color.black : Color.white;
                texture.SetPixel(x, y, color);
            }
        }

期待どおりの結果になりました

固定する乱数

次に毎回乱数の固定を利用してやってみます

        var i = 0;
        for (var x = 0; x < size; x++)
        {
            for (var y = 0; y < size; y++)
            {
                Random.InitState(i++);
                var color = Random.Range(0, 2) == 0 ? Color.black : Color.white;
                texture.SetPixel(x, y, color);
            }
        }

規則的な結果となりました

固定はするもののしばらく使い回す

x のときのみ乱数を固定化してみます

        for (var x = 0; x < size; x++)
        {
            Random.InitState(x);
            for (var y = 0; y < size; y++)
            {
                var color = Random.Range(0, 2) == 0 ? Color.black : Color.white;
                texture.SetPixel(x, y, color);
            }
        }

期待どおりの結果になりました

乱数の幅を変える

0~1 の乱数から 0 ~255 の乱数に変更して試してみます

        for (var x = 0; x < size; x++)
        {
            for (var y = 0; y < size; y++)
            {
                Random.InitState(x);
                var v = (byte)Random.Range(0, 256);
                var color = new Color32(v, v, v, 255);
                texture.SetPixel(x, y, color);
            }
        }

規則的な結果となりました

疑似乱数をかます

動画にあったように xxhash をかましてから生成する

        for (var x = 0; x < size; x++)
        {
            for (var y = 0; y < size; y++)
            {
                Random.InitState(XXHash(x, y));
                var color = Random.Range(0, 2) == 0 ? Color.black : Color.white;
                texture.SetPixel(x, y, color);
            }
        }

期待どおりの結果になりました

結果

Random.InitState を利用する際のシードが近しい値の場合乱数にばらつきが見られないことがあるので

そういった場合は動画の通りハッシュ関数を利用してシードを変更したほうがよさそうでした




以上の内容はhttps://hacchi-man.hatenablog.com/entry/2022/12/28/220000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14