【隨機數】深刻理解random和srandom

###運行程序看效果ios

#include <iostream>

using namespace std;
/* 
 測試隨機數,種子是隨機的,得出的隨機數是固定的 
 */ 
void testRandom(){  
    srandom(1);  
    printf("RAND_MAX=%d\n",RAND_MAX);  
    for(int i=0;i<10;i++){  
        printf("i=%d random value=%ld \n",i+1,random());  
    }  
}  
  
/* 
 測試隨機數,種子是隨機的,得出的隨機數是不固定的 
 */  
void testRandom2(){  
    srandom(time(NULL));  
    printf("RAND_MAX=%d\n",RAND_MAX);  
    for(int i=0;i<10;i++){  
        printf("i=%d random value=%ld \n",i+1,random());  
    }  
} 

int main(int argc, char *argv[]) {
	testRandom();
	testRandom2();
}

執行程序兩次 看效果算法

###解析 總結安全

一、生產隨機數須要種子(Seed),且若是種子固定,random()每次運行生成的隨機數(實際上是僞隨機數)也是固定的;由於返回的隨機數是根據穩定的算法得出的穩定結果序列,而且Seed就是這個算法開始計算的第一個值。
二、srandom()能夠設定種子,好比srandom(0) 、srandom(1)等等。若是srandom設定了一個固定的種子,那麼random得出的隨機數就是固定的;
     若是程序運行時經過srandom(time(NULL))設定種子爲隨機的,那麼random()每次生成的隨機數就是非固定的了。

###運用dom

//須要使用隨機值的時候 必定要記住設置srandom的種子srandom((unsigned int)time(NULL));

- (void)viewDidLoad {
	[super viewDidLoad];
        //使隨機值固定
	srandom((unsigned int)time(NULL));
	self.devices = [@[] mutableCopy];
}
```

###關於隨機性

```
假如你想產生 1 ------10 之間的一個隨機數, 你應該像下面這樣編碼

  j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

 而不是下面這樣的代碼
   j = 1 + (rand() % 10);

結論:
若是你使用 srandom 種植種子, 則你應該使用 random 返回隨機數,
若是你使用 srand 種植種子, 則你應該使用rand返回隨機數。

不過srand和rand官方已經不推薦使用。緣由是產生隨機數的性能不是很好,
另外是隨機數的隨機性沒有random好,再者就是否是線程安全。
```
相關文章
相關標籤/搜索