今天測試人員提交bug說App中偶有丟失消息的情況,經過一段時間與后臺的聯調,最終確認了問題所在:在快速發送消息的時候,發送給后臺的報文每個都攜帶了隨機數,這個隨機數竟然有重復的。后來發現是生成隨機數的寫法錯誤。
這是錯誤的寫法:
srand((unsigned int)time(NULL));
return rand();
正確的寫法應該是,時間作為種子,只初始化一次即可。如下:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
srand((unsigned int)time(NULL));
});
return rand();
srand函數是隨機數發生器的初始化函數。原型:
void srand(unsigned int seed);
srand和rand()配合使用產生偽隨機數序列。rand函數在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的偽隨機數序列都是一樣的。srand(unsigned seed)通過參數seed改變系統提供的種子值,從而可以使得每次調用rand函數生成的偽隨機數序列不同,從而實現真正意義上的“隨機”。通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函數提供不同的種子值,進而產生不同的隨機數序列。--《百度百科·srand》