2013年01月13日

[Cocoa][iOS]乱数の作り方

CocoaあるいはiOSで乱数を使いたい場合どうするか。

Cのライブラリ関数が3種類用意されている。伝統的に使われているrand()、これを改善したrandom()、そして最新のarc4random()だ。これはMac/iOSの両方で使える。

Macのみで使えるものとしてScreenSaver.frameworkのSSRandomIntBetween()、SSRandomFloatBetween()がある。

いずれも疑似乱数を生成する関数でrand()とrandom()はseedで初期化してそこからはじまる系列の疑似乱数値を順に取り出す。他は初期化が不要で呼ぶだけでよい。arc4random()はseedを指定することも可能。

それぞれ値の範囲に違いがあるがSSRandomFloatBetween()以外は整数値。適当な範囲にするために剰余を使う。小数値が欲しければ変換する必要がある。


rand() 0〜RAND_MAX
random() 0〜LONG_MAX
arc4random() 0〜ULONG_MAX


SSRandomIntBetween()、SSRandomFloatBetween()は値の範囲を引数で最小値〜最大値で指定する。

実行速度は下記順となる。
arc4random < random < rand

しかし以下で確認しているようにrandomとrandはほとんど速度に差がない。マニュアルを読み限りはrandomはrandの実行速度の3分の2になるように書かれているのだが。

SSRandomIntBetween()は内部でrandom()を使っているが、最大最小値の範囲に値を補正しているので若干遅くなっている。


time = 12 939 828(nsec) arc4random();
time = 6 012 601(nsec) random();
time = 6 720 593(nsec) rand();
time = 9 549 701(nsec) SSRandomIntBetween();




そしてCの各関数は乱数の分布がよく散らばっているものから順に
arc4random > random > rand
となっているはず。ただし確認テストでは実行回数が少ないせいか実行毎にばらつきかたが代わり顕著な優位性をみることができなかった(上位ビットでのばらつきと下位ビットでのばらつきの両方で見たがいずれも同じような結果)。

posted by 永遠製作所 at 16:13| 東京 ☀| Comment(0) | TrackBack(0) | Cocoa | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック