

SwiftでArrayをShuffleする方法として、以下のようなロジックを見つけました。

[code]

    extension Array {
        mutating func shuffle() {
            for i in 0..<(count - 1) {
                let j = Int(arc4random_uniform(UInt32(count - i))) + i
                swap(&self[i], &self[j])
            }
        }
    }
    
[/code]

例えば日付をSeedにして、ランダムを発生させたい場合にはどのようにしたら良さそうでしょうか？

[code]

    mutating func sshuffle(seed: Int)
    
[/code]

想定しているのは、こんな感じでseedとしてIntをとって、それに合わせて（擬似乱数で）shuffleする方法です。

**※追記**  
以下のようなロジックを作ってみましたが、いかがでしょうか？

[code]

    mutating func sshuffle(seed: Int) {
        srand(UInt32(seed))
        let r = rand()
        for i in 0..<(count - 1) {
            let j = Int(r % Int32(count - i)) + i
            swap(&self[i], &self[j])
        }
    }
    
[/code]


CC BY-SA 3.0
2015-04-13T09:01:03.087
9110
2016-01-12T21:38:34.980
2015-04-17T06:03:10.957
2772
2772
question
swift
swiftでArrayを擬似乱数でshuffleする方法は？


`import Foundation`（`import
UIKit`でもおなじ）をすると、C言語の標準ライブラリに含まれる関数がすべてSwiftで使えるようになります。`srand()`も`rand()`もそのまま使えます。

（`arc4random_uniform()`も、`import Foundation`が必要だと思いますが……）

「※追記」に対して：

「いかがでしょうか？」とは、プログラムを評価してくださいという意味ですか？  
arc4Random()、arc4Random_uniform()は、C言語標準ライブラリの、rand()関数より、一様性で高い品質を提供するものとして作られたものです。それ（ら）を採用せず、rand()関数を使う時点で、評価は低くならざるをえません。


CC BY-SA 3.0
2015-04-13T09:09:23.600
9111
2015-04-15T12:12:01.377
2015-04-15T12:12:01.377
7362
7362
9110
answer


>
[code]

>     mutating func sshuffle(seed: Int) {
>         srand(UInt32(seed))
>         let r = rand()
>         for i in 0..<(count - 1) {
>             let j = Int(r % Int32(count - i)) + i
>             swap(&self[i], &self[j])
>         }
>     }
>  
[/code]

シャッフル操作のアルゴリズムには、[Fisher–Yates
Shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)
を採用していますので、そこは問題はないと思います。ただし、`let r =
rand()`はループ内に移動する必要があます。（引用コードでは"乱数列"になっていない）

@Harawoさんも指摘するとおり、乱数の生成に `rand() % N`
を用いるのは、[疑似乱数列の品質の観点からいって](http://www001.upp.so-
net.ne.jp/isaku/rand.html)避けるべきです。

均質なシャッフルを行いたいなら、[`arc4random_uniform()`が利用できる](http://obc-
fight.blogspot.jp/2013/08/arc4randomarc4randomuniform.html)と思います。ただしドキュメントを読む限り、arc4random系関数にシード値を与えることはできないように見えます。


CC BY-SA 3.0
2015-04-17T10:22:23.907
9263
2015-04-17T10:22:23.907
49
9110
answer