| 函數 | 來源 | 範圍 | 需種子 | 特點 |
|---|---|---|---|---|
arc4random() | BSD/libc | [0, 2³²-1] | 否 | 高品質、自動種子、執行緒安全 |
arc4random_uniform(upper) | BSD/libc | [0, upper-1] | 否 | 推薦:無模數偏差、分布均勻 |
CCRANDOM_0_1() | Cocos2d-x | [0.0, 1.0] | 否 | 浮點數、遊戲開發常用 |
random() / srandom() | BSD | [0, 2³¹-1] | 是 | 需手動播種、品質較 arc4random 低 |
// [0, x-1] - 有模數偏差問題,不推薦
int value = arc4random() % x;
// [0, x-1] - 推薦:無偏差、分布均勻
int value = arc4random_uniform(x);
// [1, x] - 包含上下界
int value = arc4random_uniform(x) + 1;
// [min, max] - 任意範圍
int value = arc4random_uniform(max - min + 1) + min;
// [0.0, 5.0]
float r = CCRANDOM_0_1() * 5.0f;
// [min, max] 浮點
float r = CCRANDOM_0_1() * (max - min) + min;
// 隨機布林
bool flag = CCRANDOM_0_1() > 0.5f;
// 程式啟動時一次性播種
srandom((unsigned int)time(NULL));
// 後續使用
int value = random() % 100; // [0, 99]
arc4random() 返回 32 位無符號整數 (0 ~ 4,294,967,295)。當 n 非 2 的冪次時,2³² % n ≠ 0,導致餘數分布不均:
n = 100 時,0~95 出現 42,949,673 次,96~99 出現 42,949,672 次arc4random_uniform() 內部使用拒絕採樣消除偏差,所有整數範圍隨機首選此函數。
arc4random 系列:執行緒安全,內部使用鎖保護狀態random:非執行緒安全,全域狀態共享arc4random 系列srandom + random,或自行實作可播種 PRNG (如 Xorshift、PCG)arc4random_uniform現代 iOS/macOS 開發:整數用 arc4random_uniform,浮點用 CCRANDOM_0_1。避免 rand()/random() 並手動播種的舊模式,享受零配置、高品質、執行緒安全的隨機數服務。