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

在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及其衍生平臺提供的草冈。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓮增,隨后出現(xiàn)的幾起案子怎棱,更是在濱河造成了極大的恐慌,老刑警劉巖绷跑,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拳恋,死亡現(xiàn)場離奇詭異砸捏,居然都是意外死亡谬运,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門垦藏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梆暖,“玉大人,你說我怎么就攤上這事掂骏『洳担” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵勤哗,是天一觀的道長芒划。 經(jīng)常有香客問我,道長苔可,這世上最難降的妖魔是什么缴挖? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮焚辅,結(jié)果婚禮上映屋,老公的妹妹穿的比我還像新娘。我一直安慰自己同蜻,他們只是感情好棚点,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著湾蔓,像睡著了一般瘫析。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天贬循,我揣著相機與錄音咸包,去河邊找鬼。 笑死杖虾,一個胖子當(dāng)著我的面吹牛烂瘫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奇适,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼坟比,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嚷往?” 一聲冷哼從身側(cè)響起葛账,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皮仁,沒想到半個月后籍琳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡魂贬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年巩割,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片付燥。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宣谈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出键科,到底是詐尸還是另有隱情闻丑,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布勋颖,位于F島的核電站嗦嗡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饭玲。R本人自食惡果不足惜侥祭,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茄厘。 院中可真熱鬧矮冬,春花似錦、人聲如沸次哈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窑滞。三九已至琼牧,卻和暖如春恢筝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巨坊。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工撬槽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抱究。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓恢氯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鼓寺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

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