精度更高的隨機數(shù)生成函數(shù) rand_s

(簡書處女寫)

此方法只適用于WINDOWS下

rand() 結(jié)合 srand() 函數(shù)可以有效地獲取隨機數(shù)序列 大多數(shù)情況下已經(jīng)夠用,然而srand()產(chǎn)生的seed每秒更新一次。考慮到頻發(fā)調(diào)用隨機數(shù)生成函數(shù),存在1秒內(nèi)需要不同的隨機數(shù),這正是rand + srand所不能實現(xiàn)的。
較為簡單的一種做法為使用rand_s函數(shù),使用時要在代碼前添加:

#define _CRT_RAND_S 

#include<stdlib.h>

注:_CRT_RAND_S 應(yīng)定義在stdlib.h前

由于C語言已經(jīng)提供stdlib庫于是只需要包括這個頭文件并定義_CRT_RAND_S即可
有了這個基礎(chǔ),接下來就是得到具體的實現(xiàn)方法,于是利用rand_s的隨機數(shù)生成函數(shù)如下:

unsigned int Random(int max) 

{ 
   errno_t err; 
   unsigned int number; 
   err = rand_s(&number); 
   if(err != 0) 
   { 
     return 0;
   } 
   return (unsigned int)((double)number / ((double)UINT_MAX + 1) * double(max)) + 1; 
} 

完整代碼如下:

#define _CRT_RAND_S 
?
#include <iostream>
#include <stdlib.h>
?
using namespace std;
?
unsigned int Random(int max) 
{ 
   errno_t err; 
   unsigned int number; 
   err = rand_s(&number); 
   if(err != 0) 
   { 
     return 0;
   } 
   return (unsigned int)((double)number / ((double)UINT_MAX + 1) * double(max)) + 1; 
} 
?
int main()
{
 cout << Random(20) << endl;
 cout << Random(20) << endl;
 cout << Random(20) << endl;
 cout << Random(20) << endl;
 cout << Random(20) << endl;
 cout << Random(20) << endl;
}

運行即可發(fā)現(xiàn)隨機數(shù)的生成可以滿足1秒內(nèi)多個不同隨機數(shù)的要求,作為對比rand+srand運行同樣的main函數(shù)代碼隨機數(shù)生成相同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容