MILLEN BOX

音楽好きの元組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

swiftで乱数を生成する [swift2.2]

swiftで乱数を発生させる方法についてのメモ。
random() とか arc4random() とか他にも色々ありそうだし、結局何を使えばいいの?
て事で調べました。

random()だと常に同じ乱数

乱数とは、「次に何が出るか分からない」数字ですが、コンピューターで乱数を発生させる場合、コンピューターはある規則に従って、その数字を決定しています。
(よってこの規則に従ってコンピューターでは、定義に基づくと完全な乱数は生成できません。)
コンピューターがある規則を基に生成した擬似乱数と言います。
この「規則」は生成方法によって異なります。  
random()関数を使用した生成方法だと実行毎に常に同じ乱数の結果となります。
C言語で言うrand関数と同じですね。
以下は0〜9の乱数を発生させる場合の例です。

let rand = random() % 10
print("\(rand)")

arc4random()だといい感じにバラバラになる!しかし発生する数値に偏りが出るらしい...

arc4random()だとrandom()の欠点である「実行毎に常に同じ乱数」という問題は発生しなくなります。

let rand = arc4random() % 10
print("\(rand)")

しかし、この方法にも問題があるようで...。 発生する乱数に偏りが出るらしいです。
詳細は以下のリンクを見てみて下さい。

programming-ios.com

リンクを読んで貰えれば分かる通りarc4random()に問題があるわけではなく、「0〜9」の範囲に絞るために行っている "% 10" に問題(?)があるのです。
 

じゃあ何を使えばいいの??

じゃあ何を使えばいい?
回答としては arc4random_uniform()を使用する になります。

let rand = arc4random_uniform(10)
print("\(rand)")

これで乱数の偏りはなくなる様です。
ただしarc4〜関数を使用した場合、結果がUint32型になります。
swiftで使用する場合、Int型であることが多いと思われますので、IntへのCastを忘れずにしましょう。

//Cast方法
Int(rand)    //<-Int型へCast出来ます

 
(過去記事の紹介)

anthrgrnwrld.hatenablog.com