C語言中產生真隨機數的方法,帶封裝
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;
}
相關文章
- c++產生隨機數C++隨機
- R產生隨機數隨機
- Python產生20個隨機整數的方法詳解!Python隨機
- 【筆記】如何產生隨機數筆記隨機
- 如何產生指定範圍的隨機數隨機
- 關於如何產生隨機數的幾種方法彙總!(2018.07.08)隨機
- go語言中的封裝,繼承和多型Go封裝繼承多型
- 你正真瞭解C語言中的指標嗎C語言指標
- matlab中的產生隨機數的rand函式Matlab隨機函式
- Matlab產生隨機數函式小結Matlab隨機函式
- C語言中的#和##C語言
- c語言中的變數儲存區域C語言變數
- c語言中返回整數值的長度C語言
- C# 生成隨機數,呼叫Random方法C#隨機random
- 封裝帶引數的函式封裝函式
- 封裝不同類别範本的隨機數生成器封裝隨機
- 偽隨機數C語言程式設計隨機C語言程式設計
- Go 語言中的方法Go
- c語言中計算陣列長度的方法C語言陣列
- Rust中如何產生隨機數或密碼?Rust隨機密碼
- 乾貨好文帶你理解C語言中的連結串列C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- 【C】 30_C語言中的字串C語言字串
- C++ 隨機數C++隨機
- Random 專案總結 -11 產生隨機數字random隨機
- Math類產生隨機數後保留一位小數隨機
- c語言中預設引數的兩種型別C語言型別
- c語言中的getchar()和EOFC語言
- C 語言中的 sscanf 詳解
- C 語言中的 time 函式函式
- static在C語言中的作用C語言
- iOS封裝C語言P ThreadiOS封裝C語言thread
- C語言程式生成指定範圍的不重複的隨機數C語言隨機
- C++生成隨機數C++隨機
- C語言中以字串形式輸出列舉變數C語言字串變數
- C語言中qsort函式的用法C語言函式
- C 語言中 static 的作用介紹