強烈建議閱讀 → 重新整理后的文章
2012年的時候寫過一篇C語言生成隨機數的博客,點擊量比較高。后來發現那篇博客描述的不是非常准確,這里重新整理一遍。寫慣了高級語言,現在回看C的語法,真的是挺難的^o^。
一、方法介紹
生成隨機數,需要用到兩個函數srand
、rand
,頭文件為 #include <stdlib.h>
1.1 void srand ( unsigned int seed )
生成隨機數種子,注意如果使用相同的種子后面的 rand()
函數會出現一樣的隨機數。常見的用法是使用一些動態的值來初始化這個種子:
srand((unsigned) time(NULL));
srand((int)getpid());
1.2 int rand ( void )
根據 srand
初始的隨機數種子產生一個偽隨機數(注意不是真正的隨機),范圍為 0 - RAND_MAX。RAND_MAX 至少為 32767,我電腦為 2147483647。可通過取模來產生不同范圍的隨機數,如:
int randint = rand() % (MAX + 1 - MIN) + MIN;
1.3 舉例實現
下面給出了一個舉例的實現(POSIX.1-2001),幫助更好的理解其原理,每次調用rand
的時候,其實是改變了一個全局變量,從而導致下一次調用返回了不同的值。
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
二、代碼舉例
2.2 使用同樣的隨機數種子
根據上面的API說明,猜猜這10個數字會怎樣?
2.3 使用不同的隨機數種子
這里不調用 srand
,或者調用一次,或者每次都調用,都會產生一定的隨機效果。
三、小結
隨機數種子建議初始化生成一次,可以結合多個動態元素去初始化,結合具體的業務需求制定。因為這個種子會直接影響隨機數的生成,如何使用不當,則達不到隨機的效果。
import random
random.randint(1, 100)