C語言中生成隨機(jī)數(shù)的一種方法戈次。
隨機(jī)產(chǎn)生[0~10)之間的的數(shù) ,注意:不包括10
#include <stdlib.h> //srand
#include <time.h> //time
srand((unsigned int )time(NULL));
int h[10];
for (int i = 0;i < 10;i++) {
int r = rand() % 10+1;
h[i] = r;
}
解析:
1.
rand()
函數(shù)并不是一個(gè)真正的偽隨機(jī)數(shù)發(fā)生器娃兽,在產(chǎn)生隨機(jī)數(shù)前,需要系統(tǒng)提供的生成偽隨機(jī)數(shù)序列的種子芒帕,rand
根據(jù)這個(gè)種子的值產(chǎn)生一系列隨機(jī)數(shù)玷禽。如果系統(tǒng)提供的種子沒有變化,每次調(diào)用rand()
函數(shù)生成的偽隨機(jī)數(shù)序列都是一樣的乌询。
2.srand(unsigned seed)
通過參數(shù)seed
改變系統(tǒng)提供的種子值榜贴,從而可以使得每次調(diào)用rand()
函數(shù)生成的偽隨機(jī)數(shù)序列不同,從而實(shí)現(xiàn)真正意義上的“隨機(jī)”妹田。
3.通郴5常可以利用系統(tǒng)時(shí)間來改變系統(tǒng)的種子值,即srand(time(NULL))
鬼佣,可以為rand()
函數(shù)提供不同的種子值驶拱,進(jìn)而產(chǎn)生不同的隨機(jī)數(shù)序列
4.time的時(shí)間經(jīng)度較低,每55ms變動(dòng)一次晶衷,也就說每55ms生成一個(gè)隨機(jī)種子蓝纲。
5.由于計(jì)算機(jī)運(yùn)行速度很快,執(zhí)行完上述代碼也不用55ms晌纫,所以如果放在for循環(huán)里面税迷,每次得到的隨機(jī)種子都是一樣,而rand()是
根據(jù)隨機(jī)種子的值產(chǎn)生一系列隨機(jī)數(shù)锹漱,因而每次得出的隨機(jī)數(shù)都是一樣的箭养。
6.rand()
生成的隨機(jī)數(shù)范圍為:( 0~RAND_MAX
)。這個(gè)值很大哥牍,需要用取模的方法對(duì)隨機(jī)值進(jìn)行限制毕泌。
7.RAND_MAX
的值為:0x7fffffff(這是16進(jìn)制的值)換算成十進(jìn)制為: 2147483647
srand((unsigned int )time(NULL));
int h[10];
for (int i = 0;i < 10;i++) {
int r = rand() % 10+1;
h[i] = r;
NSLog(@"%d",r);
}
NSLog(@"生成的隨機(jī)種子一樣,得出的隨機(jī)數(shù)一樣");
srand((unsigned int )time(NULL));
int b[10];
for (int i = 0;i < 10;i++) {
int r = rand() % 10+1;
b[i] = r;
NSLog(@"%d",r);
}
iOS 有如下四種隨機(jī)數(shù)方法砂心,下面以產(chǎn)生 [0,100)(不包含100)的隨機(jī)數(shù)為例:
- srand((unsigned)time(0));
int i = rand() % 100; - srandom(time(0));
int i = random() % 100; - int i = arc4random() % 100;
- int i = arc4random_uniform(100)
注:
1.rand()和random()實(shí)際并不是一個(gè)真正的偽隨機(jī)數(shù)發(fā)生器懈词,在使用之前需要先初始化隨機(jī)種子,否則每次生成的隨機(jī)數(shù)一樣辩诞。
2.arc4random()和arc4random_uniform(u_int32_t)是一個(gè)真正的偽隨機(jī)算法坎弯,不需要生成隨機(jī)種子,因?yàn)榈谝淮握{(diào)用的時(shí)候就會(huì)自動(dòng)生成译暂。而且生成的隨機(jī)數(shù)的范圍是rand()的兩倍抠忘。
3.arc4random()函數(shù)需要用取模的算法對(duì)隨機(jī)值進(jìn)行限制。
arc4random_uniform(x)函數(shù)不需要再進(jìn)行取模運(yùn)算外永,直接生成隨機(jī)數(shù)崎脉。
4.在iPhone中,RAND_MAX的值為:0x7fffffff (2147483647)伯顶,而arc4random()或arc4random_uniform(u_int32_t)返回的最大值則是 0x100000000 (4294967296)囚灼。
精確度比較:arc4random_uniform(u_int32_t) = arc4random() > random() > rand()骆膝。
以下為各個(gè)函數(shù)的返回類型:
在頭文件stdlib.h中定義
int rand(void) __swift_unavailable("Use arc4random instead.");
long random(void) __swift_unavailable("Use arc4random instead.");
uint32_t
arc4random_uniform(uint32_t __upper_bound) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
uint32_t arc4random(void);
uint_32_t
的定義:typedef unsigned int uint32_t;
產(chǎn)生從X~Y的隨機(jī)數(shù)
X~Y有 Y-X+1個(gè)數(shù)
K= rand() % (Y-X+1) + X
參考:
1.iOS 中生成隨機(jī)數(shù)的4種方法(rand、random灶体、arc4random阅签、arc4random_uniform)
2.sand _百度百科