(簡(jiǎn)書處女寫)
此方法只適用于WINDOWS下
rand() 結(jié)合 srand() 函數(shù)可以有效地獲取隨機(jī)數(shù)序列 大多數(shù)情況下已經(jīng)夠用脆霎,然而srand()產(chǎn)生的seed每秒更新一次逝变。考慮到頻發(fā)調(diào)用隨機(jī)數(shù)生成函數(shù)铜秆,存在1秒內(nèi)需要不同的隨機(jī)數(shù),這正是rand + srand所不能實(shí)現(xiàn)的。
較為簡(jiǎn)單的一種做法為使用rand_s函數(shù)饰豺,使用時(shí)要在代碼前添加:
#define _CRT_RAND_S
#include<stdlib.h>
注:_CRT_RAND_S 應(yīng)定義在stdlib.h前
由于C語(yǔ)言已經(jīng)提供stdlib庫(kù)于是只需要包括這個(gè)頭文件并定義_CRT_RAND_S即可
有了這個(gè)基礎(chǔ),接下來(lái)就是得到具體的實(shí)現(xiàn)方法允蜈,于是利用rand_s的隨機(jī)數(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;
}
運(yùn)行即可發(fā)現(xiàn)隨機(jī)數(shù)的生成可以滿足1秒內(nèi)多個(gè)不同隨機(jī)數(shù)的要求冤吨,作為對(duì)比rand+srand運(yùn)行同樣的main函數(shù)代碼隨機(jī)數(shù)生成相同。