在C語言中獲取隨機數的函數是rand();?
壹個合格的隨機數值必須由獲取到的值足夠散列,以及值不可預知的特性,但如果不做任何處理直接調用rand(),那麽得到的值是固定的。下面是壹個例子:
#include?<stdio.h>#include?<stdlib.h>
int?main()
{
for(i?=?0;?i?<?10;?i?++)
printf("%d\n",?rand());//獲取10次隨機數並打印。
return?0;
}
運行這個程序,看起來沒什麽問題,因為獲取到的10個數字都是散列的,很有隨機數的感覺。但重復運行這個程序就會發現,每次運行得到的十個數都是同樣的,這個並不符合不可預知的特性。
所以C語言中的隨機數函數rand()被稱為偽隨機數。
通過srand函數,可以讓這個偽隨機數更“真”壹些,它的原理是設置壹個隨機數種子,然後後續的隨機數依賴於種子值。
#include?<stdio.h>#include?<stdlib.h>
int?main()
{
for(i?=?0;?i?<?100000;?i?+=?10000)
{
srand(i);
printf("%d\n",?rand());//獲取10次隨機數並打印。
}
return?0;
}
反復運行這個程序,會發現,相同的隨機數種子獲取到的隨機數值同樣是相同的。這樣這個隨機數種子值又不能是固定值了,於是需要想辦法讓這個種子值有變化。
讓這個值有變化的方法有很多種,最常用的就是通過時間函數time()。這個函數是獲取當前時間值的,單位是毫秒。通常的調用方式是time(NULL);
用這個值來做隨機數種子可以讓每次調用得到的種子值不同,因為要達到完全相同的效果,必須要在毫秒級的相同時間下同時執行,這個概率太低了。
於是time(NULL)就成了最常用的隨機數種子。
以上就是srand(time(NULL)); 經常放在隨機數發生前作為隨機數種子的原因了。