だいたい47度

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

Objective-Cの乱数作成はarc4random_uniform

Objective-Cで乱数を発生させたい時があります。その方法の比較。

rand()を使う
一番単純な方法としてはrand()を使います。rand()で乱数を発生させ、MAX_NUMのmodをとることでMAX_NUM未満の乱数を取得するわけです。

rand() % MAX_NUM;
例)rand() % 3 + 1 →1から3までの乱数を取得

ただし、この方法で実装すると実行するたびに毎回同じ乱数が発生します。そのため、乱数の初期値を修正する下記の方法をとることが多いです。

srand(time(NULL));//現在の秒数を元に初期値を修正
rand() % MAX_NUM


arc4random()を使う
Objective-Cでは便利な関数としてarc4random()があります。これを使うと乱数の初期化が要りません。

((int) arc4random()) % MAX_NUM;

ただし、arc4random()の返り値はunsignedの値(u_int32_t)なので、intにキャストしてあげないと想定していない数値が取れてしまうことがあります。ここに気をつけないと、配列からランダムに中身を取り出そうとしてINDEX範囲外を取得してしまいランタイムエラー、なんてことになります。

また、実はarc4random()はランダム性に少しバイアスが掛かっています。arc4random()は0から2^32-1の値を返すため、それの法をとる際に微妙にランダム性が崩れるのです(modulo bias:0から10の値をとるランダム値のモジュロ7の法をとると、0-3の出現割合は4-6の二倍になりますね)。ただし、MAX_NUMが2の累乗であれば完全にランダムとなります。

arc4random_uniform()を使う
arc4random()のランダム性のずれを補正したのが、arc4random_uniform()です。

(int) arc4random_uniform(MAX_NUM);

ただしMacOS10.7以上、iOS4.3以上が要求されます。最新のXcodeだとiOS4.3以降対象のアプリしか作れないので、基本的にはarc4random_uniformを使うべきだと思います。

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る
関連記事
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

> rand()で乱数を発生させ、MAX_NUMのmodをとることでMAX_NUM以下の乱数を取得する
未満の間違い?

htz | URL | 2013-02-25(Mon)14:41 [編集]


No title

htzさん

ありがとうございました。修正しました。

たぬき | URL | 2013-02-25(Mon)22:34 [編集]


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。