在C中提供了rand()、srand()让网、random()、arc4random()幾個(gè)函數(shù)來(lái)獲取隨機(jī)數(shù)。
使用 arc4random 生成隨機(jī)數(shù):
1.1 獲取一個(gè)隨機(jī)整數(shù)范圍在:[0,100)包括0事期,不包括100:
int number = arc4random() % 100;
1.2 獲取一個(gè)隨機(jī)數(shù)范圍在:[100,200],包括100纸颜,包括200:
int number = arc4random() % 101 + 100;
1.3根據(jù)取值范圍獲取隨機(jī)數(shù)的方法:
獲取一個(gè)隨機(jī)整數(shù)兽泣,范圍在[from,to],包括from也包括to
-(int)getRandomNumber:(int)from to:(int)to
{
? ? ? ?return (int)((arc4random() % (to – from + 1)) + from);
}
使用 rand() 生成隨機(jī)數(shù):
注意:
在標(biāo)準(zhǔn)的C庫(kù)中函數(shù)rand()可以生成0~RAND_MAX之間的一個(gè)隨機(jī)數(shù)胁孙,其中RAND_MAX 是stdlib.h 中定義的一個(gè)整數(shù)唠倦,它與系統(tǒng)位數(shù)有關(guān)称鳞。
rand()函數(shù)沒(méi)有輸入?yún)?shù),直接通過(guò)表達(dá)式rand()來(lái)引用稠鼻;
printf("Random numbers are: %i %i\n",rand(),rand());
偽隨機(jī)數(shù):
因?yàn)閞and()函數(shù)是按指定的順序來(lái)產(chǎn)生整數(shù)冈止,因此每次執(zhí)行上面的語(yǔ)句都打印相同的兩個(gè)值,所以說(shuō)C語(yǔ)言的隨機(jī)并不是真正意義上的隨機(jī)候齿,有時(shí)候也叫偽隨機(jī)數(shù)熙暴。
為了使程序在每次執(zhí)行時(shí)都能生成一個(gè)新序列的隨機(jī)值,我們通常通過(guò)為隨機(jī)數(shù)生成器提供一粒新的隨機(jī)種子毛肋。函數(shù) srand()(來(lái)自stdlib.h)可以為隨機(jī)數(shù)生成器播散種子怨咪。只要種子不同rand()函數(shù)就會(huì)產(chǎn)生不同的隨機(jī)數(shù)序列。srand()稱為隨機(jī)數(shù)生成器的初始化器润匙。用rand()隨機(jī)生成在[x,y]內(nèi)的整數(shù)
/*k即為所求范圍內(nèi)隨機(jī)生成的數(shù)诗眨,rand()%a的結(jié)果最大為a-1*/
int k= x+rand()%(y-x+1)
比較:
rand()和random()實(shí)際并不是一個(gè)真正的偽隨機(jī)數(shù)發(fā)生器,在使用之前需要先初始化隨機(jī)種子孕讳,否則每次生成的隨機(jī)數(shù)一樣匠楚。
arc4random() 是一個(gè)真正的偽隨機(jī)算法,不需要生成隨機(jī)種子厂财,因?yàn)榈谝淮握{(diào)用的時(shí)候就會(huì)自動(dòng)生成芋簿。而且范圍是rand()的兩倍。在iPhone中璃饱,RAND_MAX是0x7fffffff (2147483647)与斤,而arc4random()返回的最大值則是 0x100000000 (4294967296)。
精確度比較:arc4random() > random() > rand()荚恶。
//? 1. rand()撩穿,不加這句每次產(chǎn)生的隨機(jī)數(shù)不變
srand((unsigned)time(0));
int i = rand() % 100;
// 2. random()
srandom(time(0));
int i = random() % 100;
// 3. arc4random()
int i = arc4random() % 100 ;