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語言產生隨機數的方法C語言隨機
- C語言中的例子--偽隨機數C語言隨機
- 用C語言的rand()和srand()產生偽隨機數的方法總結C語言隨機
- R產生隨機數隨機
- ORACLE產生隨機數的多種方法分享 轉Oracle隨機
- vc中產生隨機數隨機
- 計算機隨機數的產生 (轉)計算機隨機
- 隨機產生0-1之間實數的方法隨機
- 高效產生不重複的隨機數隨機
- C#隨機產生漢字C#隨機
- 【筆記】如何產生隨機數筆記隨機
- js隨機產生區間數JS隨機
- matlab產生隨機數或隨機矩陣Matlab隨機矩陣
- Python產生20個隨機整數的方法詳解!Python隨機
- 產生唯一隨機碼的方法分析隨機
- 如何產生指定範圍的隨機數隨機
- linux生產32位隨機數Linux隨機
- 高效產生一組不重複的隨機數隨機
- 從oracle表中隨機取記錄,產生隨機數和隨機字串Oracle隨機字串
- JavaScript產生隨機數例項程式碼JavaScript隨機
- 產生0到100內的任意隨機數隨機
- 如何在各種程式語言中生成安全的隨機數隨機
- C語言中的命令列引數C語言命令列
- GENERATING INTEGER RANDOM NUMBERS(幾種產生隨機數方法的效率分析) (轉)random隨機
- matlab中的產生隨機數的rand函式Matlab隨機函式
- 你正真瞭解C語言中的指標嗎C語言指標
- go語言中的封裝,繼承和多型Go封裝繼承多型
- Matlab產生隨機數函式小結Matlab隨機函式
- Rust中如何產生隨機數或密碼?Rust隨機密碼
- 利用arc4random_uniform()產生隨機數randomORM隨機
- Matlab產生特定範圍的隨機數矩陣Matlab隨機矩陣
- js實現的產生隨機數程式碼例項JS隨機
- MATLAB中如何產生指定範圍的隨機數Matlab隨機
- C語言生成隨機數函式的用法C語言隨機函式
- 集合框架-產生10個1-20之間的隨機數,要求隨機數不能重複框架隨機
- oracle要對一個欄位產生隨機數Oracle隨機
- Random 專案總結 -11 產生隨機數字random隨機