一、Qt隨機數函數的使用
Qt中提供了一組名為QRandomGenerator的工具類,它提供了幾個生成隨機數的函數,在使用時需要先實例化該類,代碼如下:
QRandomGenerator rg;
int number = rg.bounded(10);
其中rg.bounded(n)函數可以生成一個0~n-1之間的隨機數,包括0和n-1,n為自然數。 如果需要生成一組隨機的顏色,可以使用Qt內置的QRgb數據類型和qRgb函數,代碼如下:
QRandomGenerator rg;
QColor color(qRgb(rg.bounded(256), rg.bounded(256), rg.bounded(256)));
上述代碼可以隨機生成一個RGB顏色值,並用QColor類型去接受它。
二、隨機數種子的設置
隨機數的生成是基於隨機數生成器的一種運算。而這個運算必須要有一個起點,這個起點被稱為隨機數種子(seed)。如果不設置隨機數種子,那麼每次生成的隨機數都是相同的,所以需要設置不同的種子來獲得不同的隨機數。 可以使用qsrand()函數設置隨機數種子,但是qsrand()本身並不能保證種子的隨機性,所以更好的選擇是使用QRandomGenerator自帶的種子,代碼如下:
QRandomGenerator rg(QDateTime::currentMSecsSinceEpoch());
int number = rg.bounded(10);
其中QDateTime::currentMSecsSinceEpoch()可以獲得當前時間的毫秒值,保證了每次程序執行時的隨機性。
三、高效生成隨機序列
在某些情況下,需要如此大量的隨機數,以至於一次生成一個的方式變得低效。幸運的是,Qt提供了一種高效生成偽隨機序列的方式,代碼如下:
QRandomGenerator rg;
QVector<quint32> sequence = rg.generate(10);
其中generate()函數可以高效生成包含n個隨機數的序列,並返回一個QVector<quint32>類型的數據。
四、Qt隨機數的實際應用
Qt中的隨機數可以用於許多應用領域,如遊戲、動畫效果等。下面以多個實際應用場景來作為示例:
1. 圖像噪點效果
可以使用Qt生成一組隨機數,在圖像上添加一些隨機的像素點,模擬圖像的噪點效果。代碼如下:
QRandomGenerator rg(QDateTime::currentMSecsSinceEpoch());
for(int x = 0; x < image.width(); x++) {
for(int y = 0; y < image.height(); y++) {
if(rg.bounded(100) < 5) {
image.setPixel(x, y, qRgb(255, 255, 255));
}
}
}
2. 隨機漫步演算法
可以使用Qt生成一組隨機數,在二維平面上用簡單隨機遊走模型演示隨機漫步演算法的過程,模擬粒子在空氣中的運動情況。代碼如下:
QRandomGenerator rg(QDateTime::currentMSecsSinceEpoch());
QPoint currentPoint(0, 0);
for(int i = 0; i < 100; i++) {
int direction = rg.bounded(4);
switch(direction) {
case 0: currentPoint += QPoint(0, -1); break;
case 1: currentPoint += QPoint(0, 1); break;
case 2: currentPoint += QPoint(-1, 0); break;
case 3: currentPoint += QPoint(1, 0); break;
}
painter.drawPoint(currentPoint);
}
3. 遊戲隨機關卡生成
可以使用Qt生成一組隨機數,在遊戲中生成關卡地圖。代碼如下:
QRandomGenerator rg(QDateTime::currentMSecsSinceEpoch());
const int width = 20;
const int height = 10;
QVector<bool> map(width * height);
for(int i = 0; i < width * height / 2; i++) {
int index = rg.bounded(width * height);
map[index] = true;
map[(width * height) - 1 - index] = true;
}
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
if(map[y * width + x]) drawWall(x, y);
else drawFloor(x, y);
}
}
上述代碼將地圖分割成若干個小方塊,在小方塊之間隨機生成牆壁或地板。
原創文章,作者:HZDYS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/334568.html