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

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

僞隨機數

使用標準庫<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;
}

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

我每次運行的結果都以下:函數

image

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

要產生真正的隨機數,須要瞭解time函數。3d

time函數

<ctime>中的time函數能夠返回一個時間。函數聲明以下指針

time_t time(
   time_t *timer 
);

參數timer是一個指針,指向時間的存儲位置。使用時參數能夠爲0。若是使用其餘整數,好比1,會產生沒法從int轉換成timme_t的錯誤。code

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

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

image

事實上,這個結果即是當前時間,只是表示方法有所不一樣。這個值是從1970年1月1日午夜到如今的秒數。get

真正的隨機數

<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)。

相關文章
相關標籤/搜索