C語言生成隨機數


 強烈建議閱讀 → 重新整理后的文章

2012年的時候寫過一篇C語言生成隨機數的博客,點擊量比較高。后來發現那篇博客描述的不是非常准確,這里重新整理一遍。寫慣了高級語言,現在回看C的語法,真的是挺難的^o^。

一、方法介紹

生成隨機數,需要用到兩個函數srandrand,頭文件為 #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 使用同樣的隨機數種子

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   for (long i = 0; i < 10; i++){
  srand(1);
       printf("%d\n", rand());
  }
 
 return 0;
}

根據上面的API說明,猜猜這10個數字會怎樣?

 

2.3 使用不同的隨機數種子

這里不調用 srand ,或者調用一次,或者每次都調用,都會產生一定的隨機效果。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
   srand((unsigned int)time(NULL));
   for (long i = 0; i < 10; i++){
       printf("%d\n", rand());
  }
 
 return 0;
}

三、小結

隨機數種子建議初始化生成一次,可以結合多個動態元素去初始化,結合具體的業務需求制定。因為這個種子會直接影響隨機數的生成,如何使用不當,則達不到隨機的效果。

最后用 python 怎么實現這個隨機需求呢?哈哈

import random
random.randint(1, 100)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM