夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Objective-C, cocos2d】任意の範囲のfloatのランダム値を得るマクロ

ある数値に係数を掛けて数値を若干ランダムに変化させる必要が出てきたので作ったマクロです。UINT_MAXの前に(float)をつけ忘れると整数の割り算になってしまうので要注意です。

#define MYRAND(min, max) ((arc4random()/(float)UINT_MAX)*((max)-(min))+(min))

minで最低値、maxで最高値を指定します。

使い方はこんな感じです。
float speedFactor = MYRAND(0.8, 1.2);

float maxSpeed = 100.0 * speedFactor;

上記の場合、maxSpeedは80.0-120.0の間のランダムな値となります。

今回、cocos2dのCCRANDOM_0_1ではなくarc4random()を使ったのには理由があります。

cocos2dのCCRANDOM_0_1()マクロはccMacros.hに次のように定義されています。

#define CCRANDOM_0_1() ((random() / (float)0x7fffffff ))

random()関数は使用前にsrandom()関数を使って手動で初期化する必要があります。なので、CCRANDOM_0_1を使う場合も同様となります。arc4random()は自動的に初期化されるのでその必要はありません。また、返す数値の範囲もrandom()の2倍ありますので、精度的にも有利ですね。