C語言中產生真隨機數的方法,帶封裝

小聲逼逼發表於2018-01-19

1.rand()函式

眾所周知,C語言提供的rand()函式,實際上是根據srand(seed)產生的一種對映關係,一種簡單的寫法是這樣的:

srand(((unsigned)time(NULL));
r = rand() % num;

這裡time()函式返回的是從1970.01.01 00:00:00至今所經歷的的秒數

2.弊端

由於返回的是秒數,所以我們可以想到,需要一下子產生一堆隨機數的時候,rand()函式就吃癟了。計算機執行一條語句花費時間很短,所以返回的秒數幾乎沒有什麼差別,同時,rand函式實質上是一種對映關係,對於確定的輸入一定有一個不變的輸出與之對應,所以,我們應該將隨機的重點放在隨機數種子的生成上

3.改進

思路:人為控制seed變化

unsigned int seed = 0; //全域性變數

int randNext(int left, int right)
{
    seed++;
    srand(seed);
    return rand() % (right - left + 1) + left;
}

缺點:多次執行程式後會發現,產生了一樣的結果

再次改進:加入隨機成分

unsigned int seed = 0; //全域性變數

int randNext(int left, int right)
{
    seed++;
    srand(time(NULL) + seed * seed);
    return rand() % (right - left + 1) + left;
}

缺點:暴露了一個全域性變數seed

再次改進:使用static封裝

//返回[left, right]的隨機數
int randNext(int left, int right)
{
  static unsigned int seed = 0;
  seed++;
  srand((unsigned) time(NULL) + seed * seed);
  return rand() % (right - left + 1) + left;
}

相關文章