1. 程式人生 > >ios 生成不重複隨機數

ios 生成不重複隨機數

一、先講下ios三種取隨機數的方法:

1.    srand((unsigned)time(0));  //不加這句每次產生的隨機數不變
        int i = rand() % 5;      

2.    srandom(time(0));
        int i = random() % 5;

3.    int i = arc4random() % 5 ;

注:rand()和random()實際並不是一個真正的偽隨機數發生器,在使用之前需要先初始化隨機種子,否則每次生成的隨機數一樣。

arc4random() 是一個真正的偽隨機演算法,不需要生成隨機種子,因為第一次呼叫的時候就會自動生成。而且範圍是rand()的兩倍。在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值則是 0x100000000 (4294967296)。

精確度比較:arc4random()  >  random()  >  rand()。

常用方法:arc4random

例: 獲取一個隨機整數範圍在:[0,100)包括0,不包括100

int x = arc4random() % 100;

二、生成不重複隨機數

思想:其原理就是利用兩個陣列,第一個陣列存放要隨機的原始資料,第二個陣列存放結果;然後arc4random產生一個隨機數,將這個隨機數用作下標,把第一個陣列對應下標的資料取出並刪除。取出後存入第二個陣列。然後迴圈往復就可以了。即便兩次arc4random產生的隨機數是相同的,但第一個陣列對應下標的資料卻是不一樣的。

例:0-7亂序輸出

-(NSArray *)randomArray
{
    //隨機數從這裡邊產生
    NSMutableArray *startArray=[[NSMutableArray alloc] initWithObjects:@0,@1,@2,@3,@4,@5,@6,@7, nil];
    //隨機數產生結果
    NSMutableArray *resultArray=[[NSMutableArray alloc] initWithCapacity:0];
    //隨機數個數
    NSInteger m=8;
    for (int i=0; i<m; i++) {
        int t=arc4random()%startArray.count;
        resultArray[i]=startArray[t];
        startArray[t]=[startArray lastObject]; //為更好的亂序,故交換下位置
        [startArray removeLastObject];
    }
    return resultArray;
}