在CPU周期內(nèi)狭魂,進程和線程這樣的封閉的數(shù)字宇宙中猖闪,沒有真正的隨機性吹榴,只有偽隨機性(pseudorandomness)胧洒。
下面是Objective-C中與隨機有關(guān)的問題和誤解畏吓,我們一起來看一下。
如何生成一個Objective-C的隨機數(shù)略荡?
使用arc4random()及其相關(guān)功能庵佣。具體而言,產(chǎn)生一個0和N-1之間的隨機數(shù)汛兜,使用arc4random_uniform()巴粪,從而避免模偏差(modulo bias)
0到N-1之間的隨機整數(shù)
NSUInteger r = arc4random_uniform(N);
1到N之間的隨機整數(shù)
NSUInteger r = arc4random_uniform(N) + 1;
0到1之間的隨機浮點數(shù)(double)
如果你要生成一個隨機double或float,另一個很好的功能是較模糊的rand48家族粥谬,包括drand48(3)肛根。
srand48(time(0));
double r = drand48();
不像arc4random函數(shù),rand48函數(shù)在產(chǎn)生隨機數(shù)之前需要種子的初始值漏策。這個種子函數(shù)srand48(3)應(yīng)該只運行一次派哲。
如何從一個NSArray選擇一個隨機元素?
if ([array count] > 0) {
id obj = array[arc4random_uniform([array count])];
}
隨機排序一個NSArray
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
NSUInteger count = [mutableArray count];
// See http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
if (count > 1) {
for (NSUInteger i = count - 1; i > 0; --i) {
[mutableArray exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((int32_t)(i + 1))];
}
}
NSArray *randomArray = [NSArray arrayWithArray:mutableArray];
生成一個隨機字符串
生成一個隨機的小寫NSString
如果你是對一個已知的掺喻,連續(xù)范圍內(nèi)的Unicode字符串做處理芭届,例如小寫字母(U+0061 - U+007A),你可以從char做一個簡單的換算:
NSString *letter = [NSString stringWithFormat:@"%c", arc4random_uniform(26) + 'a'];
為什么要使用arc4random(3)感耙,而不是rand(3)或random(3)褂乍?
- arc4random不需要初始種子(用srand或srandom),使它更容易使用即硼。
- arc4random范圍可達0x100000000(4294967296)逃片,而rand和random的上限在RAND_MAX = 0x7fffffff(2147483647)。
- rand的結(jié)果不夠隨機只酥,更容易被人預(yù)測褥实。
什么是rand(3),random(3)和arc4random(3)裂允,以及它們從哪里來的损离?
- rand是一個標(biāo)準(zhǔn)的C函數(shù)。
- random是定義為POSIX標(biāo)準(zhǔn)的一部分绝编。
- arc4random是由BSD及其衍生平臺提供的草冈。