###運行程序看效果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好,再者就是否是線程安全。 ```