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
となっているはず。ただし確認テストでは実行回数が少ないせいか実行毎にばらつきかたが代わり顕著な優位性をみることができなかった(上位ビットでのばらつきと下位ビットでのばらつきの両方で見たがいずれも同じような結果)。