std標(biāo)準(zhǔn)庫
std::rand()
是C++中的一個隨機(jī)數(shù)函數(shù),它生成一個范圍在0到RAND_MAX
之間的偽隨機(jī)整數(shù)。
在使用std::rand()之前,需要包含<cstdlib>頭文件。
#include <cstdlib>
設(shè)置種子
在每次程序運(yùn)行時,通常需要使用不同的種子值來初始化隨機(jī)數(shù)生成器??梢允褂?code>std::srand()函數(shù)來設(shè)置種子值。
#include <cstdlib>
#include <ctime>
int main() {
// 設(shè)置種子為當(dāng)前時間
std::srand(std::time(0));
// 生成隨機(jī)數(shù)
int random_number = std::rand();
// 打印生成的隨機(jī)數(shù)
std::cout << "隨機(jī)數(shù): " << random_number << std::endl;
return 0;
}
設(shè)置種子的目的是為了引入隨機(jī)性,使得每次程序運(yùn)行時生成不同的隨機(jī)數(shù)序列。通過在每次運(yùn)行時使用不同的種子值,可以得到更多不同的隨機(jī)數(shù)。
通常,使用當(dāng)前時間作為種子是一種常見的方法,因為時間是不斷變化的,可以保證每次程序運(yùn)行時使用不同的種子值。通過使用std::time(0)函數(shù)獲取當(dāng)前時間作為種子,可以確保每次運(yùn)行時生成不同的隨機(jī)數(shù)序列。
限制隨機(jī)數(shù)范圍
std::rand()
生成的隨機(jī)數(shù)范圍是0到RAND_MAX
。如果需要生成特定范圍內(nèi)的隨機(jī)數(shù),可以使用取模運(yùn)算符和適當(dāng)?shù)目s放因子來限制范圍。
#include <cstdlib>
#include <ctime>
int main() {
std::srand(std::time(0));
// 生成min到max之間的隨機(jī)數(shù)
int random_number = min + rand() % (max - min + 1);
// 打印生成的隨機(jī)數(shù)
std::cout << "隨機(jī)數(shù): " << random_number << std::endl;
return 0;
}
我們使用std::rand() % 100 + 1將生成的隨機(jī)數(shù)限制在1到100之間。
使用 min + rand() % (max - min + 1) 生成的隨機(jī)數(shù)范圍是閉合的,即包含了 min 和 max。這是因為 % 運(yùn)算符取模后的結(jié)果范圍是從 0 到除數(shù)減一。
需要注意的是,std::rand()生成的隨機(jī)數(shù)是偽隨機(jī)數(shù),其質(zhì)量和隨機(jī)性可能不如C++11引入的更現(xiàn)代和靈活的隨機(jī)數(shù)庫<random>。如果需要更好的隨機(jī)性或更大的靈活性,建議使用<random>庫來生成隨機(jī)數(shù)。
Qt隨機(jī)數(shù)
Qt是一個跨平臺的C++開發(fā)框架,其中包含了很多有用的類、函數(shù)庫,其中包含了產(chǎn)生隨機(jī)數(shù)的函數(shù)。
QRandomGenerator::global()->generate();
這個函數(shù)會返回一個無符號的隨機(jī)數(shù),并且可以設(shè)定隨機(jī)數(shù)的范圍,如下:
// 返回一個0~9之間的數(shù)
QRandomGenerator::global()->bounded(10);
// 返回一個1~10之間的數(shù)
QRandomGenerator::global()->bounded(1, 11);
在使用隨機(jī)數(shù)發(fā)生器前,需要進(jìn)行初始化操作,一般使用設(shè)備存儲的熵來進(jìn)行初始化,如下:
QRandomGenerator randGen(QDateTime::currentMSecsSinceEpoch() ^
static_cast<quint64>(reinterpret_cast<quintptr>(QThread::currentThread())));
randGen.generate();
這里使用了系統(tǒng)時間和當(dāng)前線程的地址進(jìn)行異或操作,確保初始化的唯一性。
注意事項
使用隨機(jī)數(shù)時需要注意一些事項,如唯一性、安全性等等。
唯一性
在某些應(yīng)用場景下,需要確保產(chǎn)生的隨機(jī)數(shù)唯一,如生成訂單號、用戶ID等等。
// 隨機(jī)生成一個唯一的ID
quint64 randID = QDateTime::currentMSecsSinceEpoch() ^ static_cast<quint64>(reinterpret_cast<quintptr>(QThread::currentThread()));
安全性
在密碼學(xué)、數(shù)據(jù)加密等領(lǐng)域使用隨機(jī)數(shù)時需要注意安全性問題,需要使用高質(zhì)量的隨機(jī)數(shù)發(fā)生器,如硬件隨機(jī)數(shù)發(fā)生器。文章來源:http://www.zghlxwxcb.cn/news/detail-795061.html
// 使用硬件隨機(jī)數(shù)發(fā)生器
QByteArray data;
if (QRandomGenerator::securelySeeded()) {
data.resize(16);
if (RAND_bytes((unsigned char*)data.constData(), data.size()) != 1) {
qWarning() << "RAND_bytes failed";
}
}
分布
隨機(jī)數(shù)發(fā)生器產(chǎn)生的數(shù)不一定符合某些分布,如正態(tài)分布、均勻分布等等,需要進(jìn)行轉(zhuǎn)換處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-795061.html
// 產(chǎn)生正態(tài)分布隨機(jī)數(shù)
double mean = 10.0;
double stddev = 2.0;
double randNum = mean + NormRand()*stddev;
到了這里,關(guān)于C++隨機(jī)數(shù)生成:std標(biāo)準(zhǔn)庫和Qt自帶方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!