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

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

下面是Objective-C中與隨機有關的問題和誤解,我們一起來看一下。


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

使用arc4random()及其相關功能。具體而言,產生一個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ù)在產生隨機數(shù)之前需要種子的初始值。這個種子函數(shù)srand48(3)應該只運行一次。

如何從一個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ù)范圍內的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的結果不夠隨機,更容易被人預測。

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

  • rand是一個標準的C函數(shù)。
  • random是定義為POSIX標準的一部分。
  • arc4random是由BSD及其衍生平臺提供的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

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