C++雜談(三)產生隨機數與time函數


產生隨機數在程序中很有用,這篇文章簡單介紹一下產生隨機數的方法。

偽隨機數

使用標准庫<cstdlib>中的rand()函數產生隨機數。

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
    for (int i = 0; i < 3; i++) cout << rand()%10 << endl;//pesudo radom
    return 0;
}

表面上看,這段程序會產生三個隨機數,但一個有趣的事情是,每次程序運行時產生的數據都是相同的。

我每次運行的結果都如下:

image

可以看出,rand()函數並不會產生一個真正的隨機數。

要產生真正的隨機數,需要了解time函數。

time函數

<ctime>中的time函數可以返回一個時間。函數聲明如下

time_t time(
   time_t *timer 
);

參數timer是一個指針,指向時間的存儲位置。使用時參數可以為0。如果使用其他整數,比如1,會產生無法從int轉換成timme_t的錯誤。

#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    cout << time(0)<<endl;
    return 0;
}

對於time函數的返回值,一把理解應該是當前的時間,但事實運行結果卻並不如所想。

image

事實上,這個結果便是當前時間,只是表示方法有所不同。這個值是從1970年1月1日午夜到現在的秒數。

真正的隨機數

<cstdlib>中產生用於真正隨機數的函數srand()。函數接受一個參數作為seed,用於控制rand()函數的算法。相同的seed會使rand()產生相同的結果。

所以,若要產生真正的隨機數,可以使用時間作為seed,這樣每次都會產生真正的隨機數了。

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
    for (int i = 0; i < 3; i++) cout << rand() << endl;//truly random
    return 0;
}

這樣,在使用了stan()之后,rand便可產生真正的隨機數了。

控制隨機數的范圍

可以使用模運算來控制隨機數的范圍。下面代碼產生了[0,10)范圍的隨機數。

rand()%10;

一個例子,展示了這篇文章提及的函數。

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    cout << time(0)<<endl;//返回一個秒數
    for (int i = 0; i < 3; i++) cout << rand() << endl;//pesudo radom
    srand(time(0));
    for (int i = 0; i < 3; i++) cout << rand()%10 << endl;//truly random
    return 0;
}

首先輸出一個秒數。

接着輸出了3個隨機數,這三個隨機數每次都是相同的。

使用時間作為seed,rand()函數的返回值。

產生3個真隨機數,其范圍是[0,10)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM