rand(3) / random(3) / arc4random(3)

在CPU周期內(nèi),進(jìn)程和線程這樣的封閉的數(shù)字宇宙中,沒有真正的隨機(jī)性,只有偽隨機(jī)性(pseudorandomness)。

下面是Objective-C中與隨機(jī)有關(guān)的問題和誤解,我們一起來看一下。


如何生成一個(gè)Objective-C的隨機(jī)數(shù)?

使用arc4random()及其相關(guān)功能。具體而言,產(chǎn)生一個(gè)0和N-1之間的隨機(jī)數(shù),使用arc4random_uniform(),從而避免模偏差(modulo bias)

0到N-1之間的隨機(jī)整數(shù)

NSUInteger r = arc4random_uniform(N);

1到N之間的隨機(jī)整數(shù)

NSUInteger r = arc4random_uniform(N) + 1;

0到1之間的隨機(jī)浮點(diǎn)數(shù)(double)

如果你要生成一個(gè)隨機(jī)double或float,另一個(gè)很好的功能是較模糊的rand48家族,包括drand48(3)。

srand48(time(0));
double r = drand48();

不像arc4random函數(shù),rand48函數(shù)在產(chǎn)生隨機(jī)數(shù)之前需要種子的初始值。這個(gè)種子函數(shù)srand48(3)應(yīng)該只運(yùn)行一次。

如何從一個(gè)NSArray選擇一個(gè)隨機(jī)元素?

if ([array count] > 0) {
    id obj = array[arc4random_uniform([array count])];
}

隨機(jī)排序一個(gè)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];

生成一個(gè)隨機(jī)字符串

生成一個(gè)隨機(jī)的小寫NSString

如果你是對一個(gè)已知的,連續(xù)范圍內(nèi)的Unicode字符串做處理,例如小寫字母(U+0061 - U+007A),你可以從char做一個(gè)簡單的換算:

NSString *letter = [NSString stringWithFormat:@"%c", arc4random_uniform(26) + 'a'];

為什么要使用arc4random(3),而不是rand(3)或random(3)?

  • arc4random不需要初始種子(用srand或srandom),使它更容易使用。
  • arc4random范圍可達(dá)0x100000000(4294967296),而rand和random的上限在RAND_MAX = 0x7fffffff(2147483647)。
  • rand的結(jié)果不夠隨機(jī),更容易被人預(yù)測。

什么是rand(3),random(3)和arc4random(3),以及它們從哪里來的?

  • rand是一個(gè)標(biāo)準(zhǔn)的C函數(shù)。
  • random是定義為POSIX標(biāo)準(zhǔn)的一部分。
  • arc4random是由BSD及其衍生平臺提供的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 方法1 (數(shù)據(jù)類型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math...
    GB_speak閱讀 41,411評論 2 6
  • 很久沒有寫一些純原創(chuàng)的文章了。有時(shí)候當(dāng)自己知道的東西越多,才發(fā)覺自己越無知。相比那些國外牛逼的大神,自己寫的東西根...
    紙簡書生閱讀 1,998評論 1 4
  • “下雨的城市很善良,風(fēng)吹進(jìn)來屋里有點(diǎn)涼” 酈城的雨季來了,這也是向未最煩惱的季節(jié)。別人是惱雨季的潮濕,向未是惱那神...
    大大怪嗖嗖閱讀 119評論 0 0
  • 主持人:張笑 目標(biāo):分享、學(xué)習(xí)、感動、激勵(lì) 支持教練:若言 時(shí)間大臣:王紅 記錄大臣:冬雪 技術(shù)支持:立冬組長、冬...
    梅馨與生活閱讀 305評論 0 0
  • 《寫一首關(guān)于青春的詩》 作者:六月海 我不曾懷疑過,風(fēng)沒有影子 單調(diào)的過去,和一種過期的顏色 我...
    永遠(yuǎn)的格非閱讀 1,034評論 1 1

友情鏈接更多精彩內(nèi)容