【swift 4.2】 新機能 shuffled() を検証する。


swift 4.2に配列をシャッフルする機能「shuffled()」が加わりました。
以前、
たかがシャッフル、されどシャッフル 〜"permute-with-all" order biasの検証〜
というタイトルで、シャッフル結果の偏りを検証するプログラムを紹介しました。
今回は、このプログラムを用いてswift 4.2の新機能 shuffled()の結果に偏りがないかどうかを検証しました。

        //要素数 = n,試行回数 = repeatCount (自由に変更して下さい)
        let n = 5
        let repeatCount = 100000
        //twoDimArray[要素番号][試行回数何回目か] = 移動先の番号
        var twoDimArray = [[Int]]()
        let originalArray = 0 ..< n
        for _ in 0 ..< n{
            twoDimArray.append([])
        }
        for _ in 0 ..< repeatCount{
            let anArray = originalArray.shuffled()
            for i in 0 ..< n{
                twoDimArray[i].append(anArray.index(of: i)!)
            }
        }
        for i in 0 ..< n{
            var postShuffleCite = [Int](repeating: 0, count: n)
            for j in 0 ..< repeatCount{
                postShuffleCite[twoDimArray[i][j]] += 1
            }
            for k in 0 ..< n{
                let probability = Double(postShuffleCite[k]) / Double(repeatCount) * 100.0
                print("\(i)\(k)番目に移動する確率は、\(probability)%")
            }
            print("\n")
        }

※swift 4.2では0からn未満の整数の配列は、

let originalArray = 0 ..< n

で生成できます。

n = 5、試行回数10万回で検証して以下のような結果を得ました。

0が0番目に移動する確率は、20.077%
0が1番目に移動する確率は、19.899%
0が2番目に移動する確率は、20.127%
0が3番目に移動する確率は、19.954%
0が4番目に移動する確率は、19.942999999999998%

1が0番目に移動する確率は、19.925%
1が1番目に移動する確率は、19.886%
1が2番目に移動する確率は、20.024%
1が3番目に移動する確率は、19.955000000000002%
1が4番目に移動する確率は、20.21%

2が0番目に移動する確率は、20.003999999999998%
2が1番目に移動する確率は、20.06%
2が2番目に移動する確率は、19.902%
2が3番目に移動する確率は、20.141000000000002%
2が4番目に移動する確率は、19.893%

3が0番目に移動する確率は、19.85%
3が1番目に移動する確率は、20.119%
3が2番目に移動する確率は、20.112%
3が3番目に移動する確率は、19.822%
3が4番目に移動する確率は、20.097%

4が0番目に移動する確率は、20.144000000000002%
4が1番目に移動する確率は、20.036%
4が2番目に移動する確率は、19.835%
4が3番目に移動する確率は、20.128%
4が4番目に移動する確率は、19.857%

・・・偏りなく、シャッフルされているようです。